
다음 내용이 포함된 로그 파일이 있습니다.
2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}
tail -f
이 파일을 사용하여 결과를 명령으로 파이프하고 싶지만 JSON 문자열이 필요 하므로 파이프하기 전에 부분을 jq
제거해야 합니다 .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
GNU 옵션을 사용하면 출력 sed
을 버퍼링하지 않습니다. 이 옵션이 없으면 결과를 버퍼링하고 버퍼(4Kb?)가 가득 찬 경우에만 sed
데이터를 보냅니다 . jq
이와 같이 버퍼링을 수행하는 것은 도구의 출력이 터미널 자체가 아닐 때 표준 절차이며 효율성을 위해 수행됩니다. 이 경우 버퍼링을 끄고 싶을 수도 있으므로 를 사용합니다 -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
포함하지 않는 일부 텍스트로 시작하지 않고 {
로 끝나는 모든 줄을 삭제합니다 DEBUG
. 해당 줄이 발견되면 일치하는 텍스트가 제거되고 JSON 데이터는 남습니다.
여기서는 JSON 개체를 시작하는 DEBUG
문자열이 아닌 문자열을 기반으로 JSON을 추출합니다 .{
파이프라인의 버퍼링과 관련:
답변2
공백으로 구분된 처음 2개의 열을 제거하려면 다음을 수행하십시오.
tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .
( stdbuf -oL
GNU 또는 FreeBSD 시스템에서 볼 수 있듯이 cut
블록 기반 출력 버퍼링 대신 라인 기반을 수행하는 트릭입니다.)