파일 추적 및 날짜/시간 제거

파일 추적 및 날짜/시간 제거

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

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

tail -f이 파일을 갖고 결과를 명령에 파이프하고 싶지만 jqJSON 문자열이 필요하기 때문에 파이핑하기 전에 섹션을 제거해야 합니다.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.

-usedGNU에는 출력을 버퍼링하지 않는 옵션이 있습니다 . 이 옵션이 없으면 sed결과가 버퍼링되고 jq버퍼(4Kb?)가 가득 찼을 때만 데이터가 전송됩니다. 이러한 버퍼링은 도구의 출력이 터미널 자체가 아닌 경우 표준 절차이며 효율성을 위해 수행됩니다. 이 경우 버퍼링을 끄고 싶을 수 있으므로 -u.

DEBUGJSON 데이터 앞에 문자열이 포함된 행만 선택합니다 .

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 -oLGNU 또는 FreeBSD 시스템에서 볼 수 있는 cut블록 기반 출력 버퍼링이 아닌 라인 기반 출력 버퍼링에 대한 팁 )

관련 정보