트랙
/
jq
jq
/
연습 문제
/
로그 라인 파서
로그 라인 파서

로그 라인 파서

학습 연습 문제

소개

문자열

jq가 JSON과 동일한 데이터 타입을 지원한다는 점을 떠올려 봐요. JSON은 문자열을 이렇게 설명해요:

문자열은 0개 이상의 유니코드 문자로 이루어진 나열이며, 큰따옴표로 감싸고 백슬래시 이스케이프를 사용해요.

이스케이프 시퀀스

문자열 안에서는 백슬래시 문자를 사용해 "특수" 문자를 넣을 수 있어요:

  • \" 큰따옴표 문자 그대로
  • \\ 백슬래시 문자 그대로
  • 공백 문자 \n, \t, \r, \f, \b
  • 유니코드 문자 \uAAAA (A는 16진수 숫자)

문자열 길이

문자의 개수를 구하려면 length 함수를 사용해요.

$ jq -cn --args  '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7

부분 문자열

슬라이스 표기법으로 부분 문자열을 추출할 수 있어요. 문법은 .[i:j]예요. 반환되는 부분 문자열의 길이는 j - i이고, 인덱스 i(포함)부터 인덱스 j(미포함)까지의 문자를 반환해요. 두 인덱스 모두 음수가 될 수 있고, 이 경우 문자열의 끝에서부터 거꾸로 세요. 두 인덱스 모두 생략할 수 있고, 이 경우 문자열의 시작이나 끝을 가리켜요. 인덱스는 0부터 시작해요.

"abcdefghij"[3:6]   # => "def"
"abcdefghij"[3:]    # => "defghij"
"abcdefghij"[:-2]   # => "abcdefgh"

결합

문자열을 이어 붙일 때는 +를 사용해요:

"Hello" + " " + "world!"
# => "Hello world!"

문자열 배열이 주어졌을 때는 add를 사용해요:

["Hello", " ", "world!"] | add
# => "Hello world!"

나누기와 합치기

나누기는 split/1 함수나 / 연산자를 사용해요:

"Hello beautiful world!" | split(" ")   # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " "          # => ["Hello", "beautiful", "world!"]

split/1의 역은 join/1이에요.

문자열을 문자 배열로 바꾸는 일은 자주 필요해요. 이를 위한 방법은 두 가지가 있어요:

  1. 빈 문자열을 기준으로 나누기

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode로 코드포인트 배열로 만들기

    "Hi friend 😀" | explode   # => [72,105,32,102,114,105,101,110,100,32,128512]
    

    implode는 explode의 역이에요.

부분 문자열의 인덱스 찾기

index/1 함수를 사용해요. 인덱스는 0부터 시작해요.

"hello" | index("el")'   # => 1

부분 문자열이 문자열 안에 없으면 결과는 null이에요.

"hello" | index("elk")   # => null

문자열 보간

문자열 안에서 \(expression) 시퀀스는 그 표현식의 _결과_를 문자열에 넣어요:

"The current datetime is \(now | strflocaltime("%c"))"   # => "The current datetime is Wed Nov 16 17:06:33 2022"

대소문자 변환

ascii_downcase와 ascii_upcase 함수를 사용해요.

정규 표현식

jq는 정규 표현식을 풍부하게 지원해요. 이 내용은 나중 레슨에서 다뤄요.

지침

이 연습 문제에서는 로그 항목을 처리해요.

각 로그 줄은 다음과 같은 형식의 문자열이에요: "[<LEVEL>]: <MESSAGE>".

로그 레벨은 세 가지가 있어요:

  • INFO
  • WARNING
  • ERROR

세 가지 과제가 있는데, 각 과제는 로그 줄을 주고 그것으로 무언가를 해 보라고 해요. 이 과제를 푸는 방법은 아주 많아요. 위의 예제에서 좋아하는 기법을 골라서 무엇을 만들 수 있는지 확인해 봐요.

1. 로그 줄에서 메시지 가져오기

message 함수를 구현해서 로그 줄의 메시지를 반환하게 해요:

"[ERROR]: Invalid operation" | message
# => "Invalid operation"

앞뒤의 공백은 제거해야 해요:

"[WARNING]:  Disk almost full\r\n" | message
# => "Disk almost full"

2. 로그 줄에서 로그 레벨 가져오기

log_level 함수를 구현해서 로그 줄의 로그 레벨을 반환하게 해요. 이때 소문자로 반환해야 해요:

"[ERROR]: Invalid operation" | log_level
# => "error"

3. 로그 줄 형식 바꾸기

reformat 함수를 구현해서 로그 줄의 형식을 바꿔요. 메시지를 먼저 놓고 그 뒤 괄호 안에 로그 레벨을 넣어요:

"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
jq Exercism

로그 라인 파서 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 jq 트랙을 개념 12개연습 문제 75개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.