在寻找一种格式化“ ifconfig”输出并仅显示网络接口名称的方法时,我发现了一个正则表达式,它对OS X很有用。
ifconfig -a | sed -E 's/[[:space:]:].*//;/^$/d'
如何分解这个正则表达式以便我理解它?
答案 0 :(得分:2)
这是sed
命令
s/[[:space:]:].*//;/^$/d
中间有一个分号,因此实际上是两个命令:
s/[[:space:]:].*//
/^$/d
第一个命令是替换项。替代什么?它位于第一个2个斜杠之间。
[[:space:]:].*
任何类型的空格或冒号的字符类[],后跟零个或多个任何字符*
的{{1}}。这将匹配第一个空格或冒号后一行中的所有内容。
用什么代替?在第二个斜杠之间:.
:什么都没有。匹配的字符串将从每一行中删除。
这将保留以其行开头的接口名称,其他行也将保留,但是它们是空的,因为它们以空格开头。
如何删除这些空行?那是第二个命令:
s/...//
在行/^$/d
的开始和行^
的结束之间找到与regex匹配的空行。然后使用命令$
删除它们。
剩下的就是接口名称。
答案 1 :(得分:0)
感谢本杰明和许福克斯提供的资源。看一看,这就是我的结论:
s / [[[:space:]:]。* //;
[[:space:]:]
将搜索空格和/或:
并开始执行命令,此后以及随后出现的所有内容(因此'.*
')将被替换(因为下一个是//
,介于两者之间应该是我们想要替代的东西,在这种情况下,它就是空)。
;
标记第一个命令的结尾
然后我们有
/ ^ $ / d
其中^$
表示搜索所有空白,而d
表示将其删除。
这是错误的一半。看一下其他答案,它可以为您提供完整正确的答案!谢谢大家。
答案 2 :(得分:0)
比起正则表达式,这更多的是命令序列,但是我认为分解序列可能是有益的。
阅读ifconfig
上的联机帮助页以查找
(可选)可以使用-a标志代替接口名称。这个 标志指示ifconfig显示有关所有接口的信息 系统。 -d标志将其限制为关闭的接口,并且 -u将其限制为启动的接口。如果没有给出任何参数, -a是隐含的。
完成了一部分。管道(|
将ifconfig
通常会打印的内容发送到标准输出到sed
的标准输入。
您正在向sed
传递选项-E
。同样,man sed
是您的朋友,并告诉您此选项的意思是
将正则表达式解释为扩展(现代)正则 表达式而不是基本正则表达式(BRE)。的 re_format(7)手册页全面介绍了这两种格式。
虽然这不是您所需要的全部...给您的第一个字符串sed
让它知道要执行哪个操作。
在同一手册中搜索“替代”一词即可达到此目的 段落:
[2addr] s /正则表达式/替换/标志
用替换字符串替换第一个实例 模式空间中的正则表达式。除以下以外的任何字符 可以使用反斜杠或换行符代替斜杠来分隔RE 和替换。在可再生能源及其替代品中 分隔符本身可以用作文字字符(如果在前面) 反斜杠。
现在,我们可以运行man 7 re_format
来解码第一个命令s/[[:space:]:].*//
,这意味着“对于传递给标准输入的每一行,用空字符串替换匹配扩展正则表达式[[:space:]:].*
的部分“
[[:space:]:]
=匹配字符集:
中的任何字符[:space:]
.*
=匹配任意字符(.
),零次或多次(*
)要了解第二条命令,请查看[2addr]d
手册页的sed
部分。
[2addr] d
删除图案空间并开始下一个循环。
然后让我们看一下下一个命令/^$/d
,该命令说:“对于传递给标准输入的每一行,如果它与扩展的正则表达式^$
相对应,则将其删除”
^$
=在开始(^
)和结束($
)之间没有任何字符的行我们已经讨论了如何从手册页开始,并遵循线索来“解码”您在日常生活中看到的命令。