我如何修改此 sed 命令以删除输出中的尾随冒号

我如何修改此 sed 命令以删除输出中的尾随冒号

我需要显示 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

    如果该行包含任何字符,则打印该行。

相关内容