종료되지 않는 입력의 줄 수를 계산합니다.

종료되지 않는 입력의 줄 수를 계산합니다.

종료되지 않은 입력 소스의 라인 수를 계산할 수 있는 방법이 있습니까? 예를 들어, 요청 수를 계산하기 위해 일정 기간 동안 다음을 실행하고 싶습니다.

ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | wc

분명히 이것은 작동하지 않습니다. 내가 그것을 Ctrl죽일 때 C, 나는 그것으로부터 어떤 결과도 얻지 못합니다 wc. 가능하다면 파일 생성을 피하고 싶습니다.

답변1

Ctrl터미널에서 +를 입력하면 전경 프로세스 그룹으로 전송됩니다. 이벤트에서 살아남고 출력을 생성하려면 신호를 무시하도록 해야 합니다.CSIGINTwc

해결책은 하위 쉘에서 실행 하고 wc실행하기 전에 상위 쉘을 SIGINT무시하도록 설정하는 것입니다 wc. wc이 설정은 상속되며 SIGINT프로세스 그룹으로 전송될 때 사라지지 않습니다. 파이프의 나머지 부분은 사라지고 wc다른 쪽 끝에서는 프로세스 없이 파이프에서 읽기만 수행됩니다. 이렇게 하면 파이프가 wc표시되고 EOF그 수를 인쇄하고 종료됩니다.

ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" | (trap '' INT ; wc)

답변2

현재 카운트를 읽은 후 계속 카운트하는 방법은 다음과 같습니다.

종료되지 않는 테스트 입력 소스는 ping입니다.

$ ping 127.0.0.1  
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.041 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.028 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.030 ms
^C

다른 솔루션의 경우 라인 수를 읽고 실행 명령을 중단할 시기를 결정해야 합니다.
하지만 이상적으로는 현재 행 수만 알고 싶습니다. 그렇죠?

그렇다면 행 수를 세어보면 어떨까요? 작업에 적합한 도구는 다음과 같습니다.nl, 각 줄 앞에 현재 개수를 추가합니다.

$ ping 127.0.0.1 | nl
     1  PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
     2  64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.040 ms
     3  64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.022 ms
     4  64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.025 ms
     5  64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.021 ms
     6  64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.022 ms
     7  64 bytes from 127.0.0.1: icmp_seq=6 ttl=64 time=0.022 ms
     8  64 bytes from 127.0.0.1: icmp_seq=7 ttl=64 time=0.021 ms
     9  64 bytes from 127.0.0.1: icmp_seq=8 ttl=64 time=0.029 ms
^C

답변3

당신은 그것을 사용할 수 있습니다 :

$ ngrep -W byline port 80 and dst host 1.2.3.4 | grep ":80" |
perl -nle 'system("clear");print $.'

perl인쇄하기 전에 이전 출력을 지우고 어떤 줄이 있는지 추적합니다.

답변4

즉흥적으로 행동하는 대신 시간 제한을 지정하려는 경우 이 방법을 사용할 수 있습니다.

(cmdpid=$BASHPID; (sleep 300; Kill $cmdpid) & exec ngrep(ngrep 매개변수)) | grep ":80" |

에서 영감을 받다이 답변본질적으로 SU에 관한 최근 질문입니다.5분 후에 실행 중인 프로그램을 중지하고 계속하는 방법은 무엇입니까?

관련 정보