我需要从/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
- grep 可用于匹配正则表达式,因此您可以从中选择数字
/proc/dev/net
- 然而,正则表达式描述但不能执行。
换句话说,我没有看到任何正则表达式应用于单个 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
这远不是实现这一目标的最佳方法。