파일을 추적하고 날짜/시간을 제거합니다.

파일을 추적하고 날짜/시간을 제거합니다.

다음 내용이 포함된 로그 파일이 있습니다.

2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}

tail -f이 파일을 사용하여 결과를 명령으로 파이프하고 싶지만 JSON 문자열이 필요 하므로 파이프하기 전에 부분을 jq제거해야 합니다 .2021-06-15T22:50:11+00:00 DEBUGjqjq

로그 파일을 추적하고 동시에 날짜/시간 부분을 제거하는 방법이 있습니까?

궁극적으로 다음 명령을 사용하고 싶습니다.

tail -f :file | jq

답변1

sed버퍼링되지 않은 출력을 수행할 수 있는 GNU에 액세스할 수 있다고 가정합니다 .

tail -f file | sed -u 's/^[^{]*//' | jq .

이는 tail -f파일에서 실행되고 지속적으로 새 데이터를 sed. 이 명령은 줄의 sed첫 번째 공백까지 모든 것을 제거한 다음 결과를 에 보냅니다 .{jq

-uGNU 옵션을 사용하면 출력 sed을 버퍼링하지 않습니다. 이 옵션이 없으면 결과를 버퍼링하고 버퍼(4Kb?)가 가득 찬 경우에만 sed데이터를 보냅니다 . jq이와 같이 버퍼링을 수행하는 것은 도구의 출력이 터미널 자체가 아닐 때 표준 절차이며 효율성을 위해 수행됩니다. 이 경우 버퍼링을 끄고 싶을 수도 있으므로 를 사용합니다 -u.

DEBUGJSON 데이터 앞에 문자열이 포함된 줄만 선택하려면 다음 안내를 따르세요 .

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 -oLGNU 또는 FreeBSD 시스템에서 볼 수 있듯이 cut블록 기반 출력 버퍼링 대신 라인 기반을 수행하는 트릭입니다.)

관련 정보