라이브 스트림 필터링 변경 로그 파일

라이브 스트림 필터링 변경 로그 파일

이 샘플이 있습니다 file.log.

11-Feb-2022 18:34:42 lorem uneeded5
11-Feb-2022 18:34:43 water uneeded6
11-Feb-2022 18:34:44 ipsum uneeded7
11-Feb-2022 18.34.45 waterfall uneeded8

나는 filtered.log 이 샘플의 결과를 기대한다.

1644579283 water
1644579285 waterfall

기본적으로 내가 원하는 필터는 다음과 같습니다.

cut uneeded lines(나는 노력했다 grep)

cut uneeded column(나는 노력했다 cut)

convert date string to timestamp(나는 노력했다 date)

걱정하지 마세요. 저는 잘라내고 변환하는 방법을 알고 있습니다. 문제는 파이프나 stdout, tee 등을 사용하여 출력을 스트리밍하고 리디렉션한다는 것입니다. 나는 이것에 대해 혼란스러워합니다.

이것이 내가 한 일입니다.

tail -f file.log | grep --line-buffered "water" | tee temp.file | cut -d' ' -f1,2 | date +%s -f- | paste -d' ' - temp.file | cut -d' ' -f1,4 >> filtered.log

왜 작동하지 않나요? 새 줄이 전달되면 file.log공백 filtered.log으로 유지됩니다.

이론적으로 명령에 대한 내 두뇌의 해석은 다음과 같습니다.

  • tail -f스트리밍하거나 새 회선을 가져오는 데 사용됩니다.
  • grep --line-buffered물이 들어 있는 필터 라인.
  • tee temp.file나중에 붙여넣을 수 있도록 임시 파일을 만듭니다.
  • cut -f1,2나중에 타임스탬프로 변환하기 위해 열 1과 열 2만 가져오기date
  • date이전 출력의 타임스탬프 변환(출력 잘라내기)
  • paste이전에 백업한 첫 번째 열 temp.file에 타임스탬프를 붙여넣거나 병합합니다.
  • cut불필요한 기둥을 잘라내세요.

이것이 버퍼링 문제인 것 같은데 버퍼를 사용하는 방법을 모르겠습니다. 시도했지만 stdbuf여전히 작동하지 않습니다.

답변1

해결되었습니다!

이전 작업에서는 기본적으로 stdbuf각 파이프만 필요했습니다. 왜 stdbuf가 필요한지 모르겠습니다.

stdbuf -oL tail -f file.log | grep --line-buffered "water" | tee temp.file | stdbuf -oL -i0 cut -d' ' -f1,2 | stdbuf -oL -i0 date +%s -f- | stdbuf -oL -i0 paste -d' ' - temp.file | stdbuf -oL -i0 cut -d' ' -f1,4 >> filtered.log

관련 정보