出力から末尾のコロンを削除するためにこの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'は出力を1行ずつ処理し、 '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

    行に文字が含まれている場合は、その行を印刷します。

関連情報