단일 명령에서 두 개의 구분 기호를 사용하여 awk에서 결과 얻기

단일 명령에서 두 개의 구분 기호를 사용하여 awk에서 결과 얻기

ping 명령에서만 출력:

[root@servera ~]# ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=8.04 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.72 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.50 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms

"4 반환"에서 정수 4를 캡처하고 싶습니다.

ping -c 4 8.8.8.8 | awk -F ',' '/received/ { print $2 }'

밝혀지다 4 received. 위 명령에서 숫자 4만 캡처하고 싶습니다. 어떻게 해야 하나요? 이제 구분 기호는 공백입니다.

답변1

필요한 것은 다음과 같습니다.

awk '/received/{print $4}'

예를 들어, 질문과 cat file동일한 입력을 얻으려면 다음을 수행하십시오.awk

$ cat file
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=8.04 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.47 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.72 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.50 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms

$ cat file | awk '/received/{print $4}'
4

분명히 실제 테스트 cat file로 바꾸십시오.ping -c 4 8.8.8.8

아래 OP의 의견에 대한 응답으로 어떤 줄이 일치하는지 묻습니다.

$ awk '/received/' file
4 packets transmitted, 4 received, 0% packet loss, time 3007ms

그리고 필드 4가 인쇄되는 이유는 다음과 같습니다.

$ awk '/received/{for (i=1; i<=NF; i++) print i, "<" $i ">"}' file
1 <4>
2 <packets>
3 <transmitted,>
4 <4>
5 <received,>
6 <0%>
7 <packet>
8 <loss,>
9 <time>
10 <3007ms>

답변2

이를 수행하는 다른 방법이 있습니까 awk(답변 중 하나에 대한 의견과 유사)

awk -F, '/received/ {print int($2)}'

이 함수는 int()첫 번째 숫자 뒤의 숫자가 아닌 정보를 "삭제"합니다.

답변3

좋은 답변이 있으므로 여기에 몇 가지 대안이 있습니다.

  1. 암소 비슷한 일종의 영양grep

    $ ping -c 4 8.8.8.8 | grep -oP '\d+(?= received,)'
    4
    
  2. 진주

    $ ping -c 4 8.8.8.8 | perl -lne 'print $1 if /(\d+) received,/'
    4
    
  3. sed

    $ ping -c 4 8.8.8.8 | sed -En 's/.*, ([0-9]+) received,.*/\1/p'
    4
    

답변4

 ping -c4 <ipadress>|awk '/received/{for(i=1;i<=NF;i++){if($i ~ /received/){print $(i-1)}}}'

산출

4

관련 정보