![使用 grep、awk 等过滤命令输出](https://linux22.com/image/1094145/%E4%BD%BF%E7%94%A8%20grep%E3%80%81awk%20%E7%AD%89%E8%BF%87%E6%BB%A4%E5%91%BD%E4%BB%A4%E8%BE%93%E5%87%BA.png)
我将用它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 个或多个空格 ( ) 字符
$
(即删除它们)”。
其他有用的命令是p
和d
。该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 的组合非常强大
正则表达式值得掌握