tail -1000f는 tail -1000과 동일한 출력을 표시하지 않습니다.

tail -1000f는 tail -1000과 동일한 출력을 표시하지 않습니다.

실행하려고 하는데

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문제가 해결되지 않습니다.

관련 정보