다음 내용이 포함된 로그 파일이 있습니다.
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
tail -f
이 파일을 갖고 결과를 명령에 파이프하고 싶지만 jq
JSON 문자열이 필요하기 때문에 파이핑하기 전에 섹션을 제거해야 합니다.2021-06-15T22:50:11+00:00 DEBUG
jq
jq
로그 파일을 추적하고 날짜/시간 부분을 동시에 제거하는 방법이 있습니까?
궁극적으로 다음 명령을 사용하고 싶습니다.
tail -f :file | jq
답변1
sed
버퍼링되지 않은 출력을 수행할 수 있는 GNU 에 액세스할 수 있다고 가정합니다 .
tail -f file | sed -u 's/^[^{]*//' | jq .
이 명령은 tail -f
파일에서 실행되고 계속해서 새 데이터를 으로 보냅니다 sed
. 이 sed
명령은 줄의 첫 번째 공백까지 모든 것을 제거한 {
다음 결과를 으로 보냅니다 jq
.
-u
sed
GNU에는 출력을 버퍼링하지 않는 옵션이 있습니다 . 이 옵션이 없으면 sed
결과가 버퍼링되고 jq
버퍼(4Kb?)가 가득 찼을 때만 데이터가 전송됩니다. 이러한 버퍼링은 도구의 출력이 터미널 자체가 아닌 경우 표준 절차이며 효율성을 위해 수행됩니다. 이 경우 버퍼링을 끄고 싶을 수 있으므로 -u
.
DEBUG
JSON 데이터 앞에 문자열이 포함된 행만 선택합니다 .
tail -f file | sed -u -e '/^[^{]*DEBUG /!d' -e 's///' | jq .
또는
tail -f file | sed -u -n 's/^[^{]*DEBUG //p' | jq .
여기의 명령은 문자를 포함하지 않는 텍스트로 시작하고 끝나지 sed
않는 모든 줄을 제거합니다 . 그러한 행이 발견되면 일치하는 텍스트가 제거되고 JSON 데이터는 남습니다.{
DEBUG
여기서는 초기화된 JSON 개체 DEBUG
가 아닌 문자열을 기반으로 JSON을 추출하고 있습니다 .{
파이프의 버퍼링과 관련:
답변2
공백으로 구분된 처음 2개의 열을 제거하려면:
tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .
( stdbuf -oL
GNU 또는 FreeBSD 시스템에서 볼 수 있는 cut
블록 기반 출력 버퍼링이 아닌 라인 기반 출력 버퍼링에 대한 팁 )