我需要显示 Centos 7 服务器上的以太网接口。在 centos 6.5 上,我使用了这个命令(来自另一篇文章),它在 6.5 上运行良好。
ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo
在 Centos 7 上,接口输出现在有一个尾随“:”
所以我的输出看起来像这样
ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo
ens32:
lo:
删除“lo:”我对此进行了修改。结果是 ens32:
ifconfig -a | sed -n 's/^\([^ ]\+\).*/\1/p' | grep -Fvx -e lo:
ens32:
如何删除末尾的“:”?这个sed可以修改吗?或其他想法
答案1
不幸的是,您没有提供 ifconfig 命令的原始输出。但我会去做类似的事情:
$ ifconfig -a | perl -anle 'print $F[0] if /(^\w)/'
$ enp2s0f0
lo
tun0
wlp3s0b1
原始输出如下:
enp2s0f0 Link encap:Ethernet HWaddr 3c:07:54:5f:5e:35
inet addr:192.168.1.114 Bcast:192.168.1.255
[...]
perl -anle,其中 'a' 分割列中的行并填充变量 $F 'n' 是逐行处理输出,'l' 是在每次打印之间放置一个新行,'e' 是在命令行中执行perl命令。然后按照正则表达式,我只是说我想匹配在“^”行开头包含一个字符“\w”的行“//”。
答案2
这适用于没有冒号的旧系统和在带有冒号的新系统上:
$ /sbin/ifconfig -a | awk -F'[ :]+' '$1 && $1!="lo" {print $1}'
eth0
或者,使用 sed,这也适用于新旧系统:
$ /sbin/ifconfig -a | sed -n 's/[ :].*//; /^lo$/t; /./p'
eth0
当使用 awk 或 sed 时,很少需要额外的进程来运行 grep。
awk 命令如何工作
-F'[ :]+'
这告诉 awk 将任何连续的空格或冒号视为字段分隔符。
$1 && $1!="lo" {print $1}
如果存在第一个字段并且该字段不是
lo
,则打印它。
sed 命令如何工作
-n
这告诉 sed 除非明确要求,否则不要打印任何内容。
s/[ :].*//
这告诉 sed 删除从第一个空格或冒号到行尾的所有内容。
/^lo$/t
如果该行匹配
lo
,则跳过其余命令并从下一行开始。/./p
如果该行包含任何字符,则打印该行。