실행하려고 하는데
tail -100000f MXMLExchangeMonitoring_Mx3.log | egrep "INTENTO.*Workflow" | cut -d ":" -f "3" | cut -c 3,4,5,6 | awk '{if($1>20)print$1}'
나는 아무것도 얻지 못했습니다.
하지만 함께
tail -100000 MXMLExchangeMonitoring_Mx3.log | egrep "INTENTO.*Workflow" | cut -d ":" -f "3" | cut -c 3,4,5,6 | awk '{if($1>20)print$1}'
예상되는 결과를 얻습니다.
212
45
29
463
544
556
543
1115
830
802
119
95
33
31
194
170
127
97
-f
파일에 나타나는 20보다 큰 새 숫자를 읽으려면 이 정보가 필요합니다 .
행 수를 줄이는 것도 옵션입니다. -100과 같이 적은 양으로 시작할 수 있습니다.
이 tail -f
작품은 다음에 적합합니다:
tail -100000f MXMLExchangeMonitoring_Mx3.log | egrep "INTENTO.*Workflow" | cut -d ":" -f "3"
답변1
명령하다표준 출력fwrite()
터미널(여기서 파이프 앞의 명령) 에는 청크(일명 전체) 버퍼링을 수행하는 stdio C 함수(예: )가 없습니다 . 다음은 동작에 대한 설명입니다.setvbuf(3)
(이것은 표준 C이고POSIX기능이지만 설명은 GNU 변형에서 따왔습니다.POSIX정확한 동작이 정의된 구현임을 나타낼 수 있습니다.
대개모든 파일은 블록 버퍼링됩니다.. 스트림이 터미널(예:표준 출력일반적으로 그렇습니다.) 라인 버퍼링됩니다.. 표준 오류 스트림표준 에러기본값은 항상 버퍼링 없음입니다.
마지막 명령을 제외한 일련의 파이프에 있는 모든 명령이 영향을 받을 수 있습니다. 출력을 버퍼링하는 정상적인 동작을 얻습니다.
이것은 적어도 Linux 및 FreeBSD에서 작동하는 것입니다.
일부 명령(
tail
)은 "예상"한 대로 작동합니다.할 것이 없다.
other(
grep
)에는 이에 대한 옵션이 있습니다.GNU 및 *BSD(및 심지어 Mac OS X)의 경우 동작을 변경하는
grep
내장 옵션이 있습니다.--line-buffered
그 외(
cut
)는 그렇지 않습니다. 해결 방법이 있습니다. 아마도 시스템에 따라 다를 수 있습니다.GNU 및 FreeBSD 시스템용 libc 래퍼가 있습니다(그러나 다른 *BSD 변형은 아닌 것으로 보입니다).
stdbuf
목적은 다음과 같습니다.tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
그러면 access.log의 유일한 항목이 즉시 표시됩니다.
awk
파이프의 끝에 있고 터미널로 출력되므로 영향을 받지 않습니다(즉, 이미 라인 버퍼링되어 있습니다).나중에 필요한 경우 이 도구에는
fflush()
동일한 효과를 얻기 위한 명령이 포함되어 있습니다.
이러한 동적으로 연결된 도구는 모두 일부 특수 기능을 사용하지 않고도 지원되어야 stdbuf -o L
하지만 가능하다면 libc 래퍼를 사용하지 않는 것이 좋습니다.
이 모든 것을 염두에 두고 stdbuf
일단 설치되면 이 수정된 줄은 예상대로 실행되어야 합니다(읽기 쉽도록 여러 줄로 분할했습니다).
tail -100000f MXMLExchangeMonitoring_Mx3.log |
egrep --line-buffered "INTENTO.*Workflow" |
stdbuf -o L cut -d ":" -f "3" |
stdbuf -o L cut -c 3,4,5,6 |
awk '{if($1>20)print$1}'
일부 간단한 필터링의 경우 동작을 쉽게 변경할 수 없는 명령(마지막 명령처럼)만 유지하도록 명령의 순서를 변경하는 것만으로도 충분할 수 있습니다. 하지만 그렇지 않다면 파이프라인에 stdbuf
두 개가 있어도 cut
문제가 해결되지 않습니다.