grep

grep

我需要从/proc/net/dev用空格分隔的第二列和第十列中提取内容。换句话说,接收和发送的字节数。

是否可以使用grep反向引用来做到这一点?

答案1

回答你的问题:

awk '{print $2,$10}' /proc/net/dev

屈服

Receive
|bytes packets
6385384218 42314607745
12034420041 12034420041

这可能不是你想要的。

您可以使用

awk '$1 ~ /:/ {print $2,$10}' dev
6385389751 42314610935
12034420241 12034420241

在哪里

  • $1 ~ /:/选择第一个字段为 foo 的行:
  • {print $2,$10}打印第二个和第十个字段

grep

  1. grep 可用于匹配正则表达式,因此您可以从中选择数字/proc/dev/net
  2. 然而,正则表达式描述但不能执行。

换句话说,我没有看到任何正则表达式应用于单个 grep 命令然后会转

  eth0: 6385654376 26986310    0 107680    0     0          0      4665 42314947519 21475282    0    0    0     0       0          0
    lo: 12034424441 4553238    0    0    0     0          0         0 12034424441 4553238    0    0    0     0       0          0

到(不准确的数字)

6385389751 42314610935
12034420241 12034420241

使用grep FOO

其中FOO仅包含 grep 的选项和参数。

在 @Emeric 的尝试中,当我在我的操作系统上运行时,他可以有两列:

6385672702
42314983073
12034425441
12034425441

不过,你可以试试你的运气https://codegolf.stackexchange.com/

答案2

如果您只能使用grep,请尝试以下操作:

grep -Eo '[^ ]+:( *[0-9]*){9}' /proc/net/dev | grep -Eo '(: *[0-9]*|[0-9]*$)' | grep -o '[0-9]*'
137517672
9029195
  • 第一个表达式打印接口名称 + 冒号,然后是接下来的 9 组数字。
  • 第二个表达式仅提取以冒号开头或以行结尾结尾的数字组(第一个和最后一个选定的列)。这是该行被分成每个匹配列一行的地方。
  • 最后一个表达式去掉了前导冒号(这里没有任何政治内容)。

正如之前指出的,grep这远不是实现这一目标的最佳方法。

相关内容