이 샘플이 있습니다 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