使用 grep、awk 等过滤命令输出

使用 grep、awk 等过滤命令输出

我将用它route作为例子。

route -n

以上输出路由信息。顶行是您的活动连接。我可以通过执行以下操作将输出仅操纵到第二列:

route -n | awk '{print $2}'

现在,我如何按行进行过滤?

答案1

要打印特定行,您可以使用sed

route -n | sed -n 2p

打印第二行。

sed, 什么是

我将对 做一个简短而不完整的解释sed。如需完整描述,我建议查看sed信息页面(运行info sed)。

sed意思是s 编辑伊托尔,即可以对文本数据流(或管道)进行操作的编辑器,尽管它也可以对文件进行操作;实质上,这意味着(与ed)它永远不能返回到前一行。

sed,asawk每次读取一行,并将脚本应用于该行以对其进行修改。在脚本结束时,默认情况下,修改后的行将输出到 stdout。然后sed继续下一行。

脚本是一对地址-命令的序列,如果行与地址匹配,则执行命令。

的典型用法sed是用某种东西替换模式,例如

command | sed 's/ *$//'

这里单引号之间的字符串是脚本,由单个地址命令对组成。地址缺失(它出现在 之前s),在这种情况下,默认情况下命令将应用于所有输入行。s是命令,字符串的其余部分是命令特定的指令,表示“用空字符替换行 ( *)末尾的 0 个或多个空格 ( ) 字符$(即删除它们)”。

其他有用的命令是pd。该p命令打印当前行,这与-n选项结合使用很有用,可以修改默认行为以在脚本末尾打印当前行。所以在

sed -n '2p'

2p该脚本是由地址2和命令组成的字符串p,因此将打印第 2 行,而由于该选项,其他所有行都不会被打印-n

命令d删除一行,例如

    sed '3,6d'

会删除从第三行到第六行的所有行。3,6是一个地址范围。我观察到,在这种情况下不应该使用该-n选项,因为我们想打印所有其他行。

最后,地址可以是一个模式,例如

sed -n '/^#/p'

此命令将打印^#字符()开头的所有行。

答案2

您可以通过管道传输到 grep 并找到以您感兴趣的 IP 地址开头的行来过滤一行,例如,如果您想查看 192.168.1.1 的行,您可以执行以下操作:

$ route | grep ^192.168.1.0
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0

'^' 标记表示“行开头为”。因此,你可以使用更通用的格式:

$ route | grep ^192.168.1
192.168.1.0     *               255.255.255.0   U     2      0        0 wlan0
192.168.111.0   *               255.255.255.0   U     0      0        0 virbr0

答案3

您可以使用正则表达式来告诉 awk 您想要哪些行,例如

route -n | awk '/^192.168/ {print $2}'

将输出以 开头的所有行的秒列192.168

答案4

awk 答案也可能类似于:

$0 ~ ( /matchthis/ ) { print $2 }

$0 仅指整行

sed 和 awk 的组合非常强大

正则表达式值得掌握

相关内容