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
좋은 답변이 있으므로 여기에 몇 가지 대안이 있습니다.
암소 비슷한 일종의 영양
grep
$ ping -c 4 8.8.8.8 | grep -oP '\d+(?= received,)' 4
진주
$ ping -c 4 8.8.8.8 | perl -lne 'print $1 if /(\d+) received,/' 4
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