AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 697944
Accepted
Cruise5
Cruise5
Asked: 2022-04-05 07:18:23 +0800 CST2022-04-05 07:18:23 +0800 CST 2022-04-05 07:18:23 +0800 CST

在单个命令中使用两个分隔符从 awk 获取结果

  • 772

仅 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。我怎样才能做到这一点?分隔符现在是空格。

shell-script awk
  • 8 8 个回答
  • 882 Views

8 个回答

  • Voted
  1. Best Answer
    Ed Morton
    2022-04-05T09:48:28+08:002022-04-05T09:48:28+08:00

    所有你需要的是:

    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>
    
    • 10
  2. terdon
    2022-04-05T07:52:27+08:002022-04-05T07:52:27+08:00

    您已经得到了一些很好的 awk 答案,所以这里有一些替代方案。

    1. GNUgrep

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

      $ 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
      
    • 7
  3. Romeo Ninov
    2022-04-05T08:55:18+08:002022-04-05T08:55:18+08:00

    还有另一种方法可以做到这一点awk(类似于对其中一个答案的评论)

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

    函数int()将在第一个数字之后“丢弃”非数字信息

    • 7
  4. jesse_b
    2022-04-05T07:23:04+08:002022-04-05T07:23:04+08:00

    字段分隔符可以是正则表达式,因此您可以在 awk 中设置多个字段分隔符,[ ]例如:

    awk -F '[, ]' '/received/ {print $5}'
    

    但是在这种情况下,我可能会删除收到的单词:

     awk -F, '/received/ {sub(/received/, "", $2); print $2}'
    

    awk sub() 函数sub(regexp, replacement [, target])将找到由正则表达式表示的模式,将其替换为replacement,并且可以选择将其缩小到目标列。

    • 6
  5. Praveen Kumar BS
    2022-04-05T10:56:42+08:002022-04-05T10:56:42+08:00
     ping -c4 <ipadress>|awk '/received/{for(i=1;i<=NF;i++){if($i ~ /received/){print $(i-1)}}}'
    

    输出

    4
    
    • 3
  6. shadowtalker
    2022-04-06T06:20:21+08:002022-04-06T06:20:21+08:00

    这里的所有答案都很好地解决了 OP 的特定要求。

    但是,它们都没有解决在除主 AWK 循环使用的“主”分隔符之外的分隔符上拆分字段的一般问题。

    答案是使用我所知道的所有 AWK 版本中都可用的split()函数,包括One True AWK和POSIX 规范:

    /received/ {
      split($2, recv, " "); print(recv[1])
    }
    

    这在标准输出上发出4:

    awk -F ',' '
    /received/ {
      split($2, recv, " "); print(recv[1])
    }
    ' <<\EOD
    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
    EOD
    

    Notesplit()与顶级记录拆分具有相同的语义FS。也就是说,它的行为应该与第二个分隔符完全相同。POSIX 规范暗示了这一点(但未明确说明),并在 GNU AWK 手册页中明确说明。这样做的主要效果是(如FS)如果分隔符模式是" ",则前导和尾随空格被剥离,连续的空白字符被视为单个空格。

    • 2
  7. Wastrel
    2022-04-06T06:44:06+08:002022-04-06T06:44:06+08:00

    bash 命令行:

    recv=( $(ping -c 4 8.8.8.8 | grep received) ); echo ${recv[3]}
    

    将“ping”的结果通过管道传输到“grep”作为数组“recv”;显示数组的第三个元素。

    输出:

    4
    
    • 1
  8. RARE Kpop Manifesto
    2022-04-07T01:29:54+08:002022-04-07T01:29:54+08:00

    或者以最 awk 的方式进行操作,而无需实际计算字段:

    mawk NF RS='^.+tted,[ \t]*|[ \t]*recei.+$' testfile4.txt
    
    4
    

    如果您使用 gawk 的快速打印功能,您可以看到 RT 匹配它的整个尾部:

    RT: " received, 0% packet loss, time 3007ms\nrtt min/avg/max/mdev = 7.473/7.683/8.037/0.225 ms\n"
    
    • 0

相关问题

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • 多行文件洗牌

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve