【问题标题】:Parsing data from ifconfig with awk or sed?使用 awk 或 sed 从 ifconfig 解析数据?
【发布时间】:2012-04-16 03:25:41
【问题描述】:

我正在尝试使用 sed 解析 ifconfig 输出中的一些数据,但我无法正确执行。我希望该命令仅提取我所追求的数字。

例如,我有兴趣提取发送的字节:

eth1      Link encap:Ethernet  HWaddr 00:00:00:09:15:f7  
      inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: fe80::92e2:baff:fe08:35c7/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:75141 errors:0 dropped:0 overruns:0 frame:0
      TX packets:78046 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:9040489 (9.0 MB)  TX bytes:34806464 (34.8 MB)

如果我使用 sed:

ifconfig eth1 | sed 's|.*RX bytes:\([0-9]*\).*|\1|g'

我得到这个输出:

eth1      Link encap:Ethernet  HWaddr 00:00:00:09:15:f7  
      inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
      inet6 addr: fe80::92e2:baff:fe08:35c7/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:75141 errors:0 dropped:0 overruns:0 frame:0
      TX packets:78046 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
9040627

但我只对“9040627”感兴趣有没有办法用 sed 来做,或者我应该使用 awk 还是其他替代方法?

编辑:我使用的是busybox二进制文件,所以我的选择有限。

【问题讨论】:

    标签: linux parsing sed awk ifconfig


    【解决方案1】:

    恕我直言,ifconfig - 输出没有标准。它(可能)从一个系统到另一个系统,从一个版本到另一个版本。

    如果我是你,我会选择/sys 文件系统。您也可以从那里获得所有信息 - 无需后处理。

    $ cat /sys/class/net/eth0/statistics/rx_bytes
    37016050
    

    【讨论】:

    • 那将是理想的答案,但是我正在使用的 linux 系统已经很老了,并且没有 /sys 文件系统可用。
    • 您正在使用哪个 Linux - 系统? /proc/net/dev可用吗?
    • 这是一个带有旧 2.6.x 内核的嵌入式系统。 /proc/net/dev 可用。我认为从“ifconfig”解析数据比从 /proc/net/dev 解析数据更容易。
    • These are used by the ifconfig(8) program to report device status. /proc/net/dev 的手册页。恕我直言,/proc 接口定义明确。
    • 谢谢,我去看看!
    【解决方案2】:

    使用grep:

    ifconfig | grep -oP '(?<=RX bytes:)[0-9]*'
    

    使用awk:

    ifconfig | awk -F: '/RX bytes/{print $2+0}'
    

    【讨论】:

    • 谢谢。它可以工作,但不幸的是我需要在命令有限的系统上使用它(busybox)。有什么选择吗?
    • 你可能已经找到了一个不错的选择,但这是我的(在 OpenWRT 的 busybox 上测试过):awk '/eth0: / { print $2; }' /proc/net/dev
    【解决方案3】:

    默认情况下,在您对该行进行任何更改后,sed 会打印出输入的每一行。由于您只想从带有“RX 字节”的行中打印出一些内容,因此您告诉 sed 不要打印每一行 (-n)。因此,您要指定应执行替换的范围,仅匹配 RX bytes 的行,然后执行替换并显式打印结果。

    ifconfig eth1 | sed '/RX bytes/{s|.*RX bytes:\([0-9]*\).*|\1|; p}'
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2018-03-31
      • 2012-09-25
      相关资源
      最近更新 更多