仅 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。我怎样才能做到这一点?分隔符现在是空格。
所有你需要的是:
例如,
cat file
用于获得与awk
您的问题相同的输入:显然只是替换
cat file
为ping -c 4 8.8.8.8
您的真实测试。回应下面的 OP 评论,询问它在哪一行匹配:
以及为什么要打印第 4 个字段:
您已经得到了一些很好的 awk 答案,所以这里有一些替代方案。
GNU
grep
Perl
sed
还有另一种方法可以做到这一点
awk
(类似于对其中一个答案的评论)函数
int()
将在第一个数字之后“丢弃”非数字信息字段分隔符可以是正则表达式,因此您可以在 awk 中设置多个字段分隔符,
[ ]
例如:但是在这种情况下,我可能会删除收到的单词:
awk sub() 函数
sub(regexp, replacement [, target])
将找到由正则表达式表示的模式,将其替换为replacement,并且可以选择将其缩小到目标列。输出
这里的所有答案都很好地解决了 OP 的特定要求。
但是,它们都没有解决在除主 AWK 循环使用的“主”分隔符之外的分隔符上拆分字段的一般问题。
答案是使用我所知道的所有 AWK 版本中都可用的
split()
函数,包括One True AWK和POSIX 规范:这在标准输出上发出
4
:Note
split()
与顶级记录拆分具有相同的语义FS
。也就是说,它的行为应该与第二个分隔符完全相同。POSIX 规范暗示了这一点(但未明确说明),并在 GNU AWK 手册页中明确说明。这样做的主要效果是(如FS
)如果分隔符模式是" "
,则前导和尾随空格被剥离,连续的空白字符被视为单个空格。bash 命令行:
将“ping”的结果通过管道传输到“grep”作为数组“recv”;显示数组的第三个元素。
输出:
或者以最 awk 的方式进行操作,而无需实际计算字段:
如果您使用 gawk 的快速打印功能,您可以看到 RT 匹配它的整个尾部: