Bashのネットワークインタフェース数の計算

Bashのネットワークインタフェース数の計算

文字列"で始まる項目の数を計算したいと思います。トゥエン「コマンド出力を取得しましたifconfig

たとえば、これが私の出力であれば、数が2になることを望みます。を試してみましたが、grepまだ解決策はありません。

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.0.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:16:73:86:ba  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s31f6: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 00:00:00:00:00:00  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xa1300000-a1320000

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 905  bytes 80293 (80.2 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 905  bytes 80293 (80.2 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 00.00.00.00  netmask 255.255.255.255  destination 192.168.105.77
        inet6 ::  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 438  bytes 52174 (52.1 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 457  bytes 33911 (33.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tun1: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 0.0.0.0  netmask 255.255.255.255  destination 192.168.104.61
        inet6 ::  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10  bytes 584 (584.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

答え1

grepとを組み合わせて使用​​するwcか、次のものを使用できます。awk

最初の方法、使用grep:

ifconfig | grep "^tun" | wc -l

これは、grepを介して出力をパイプし、ifconfig文字列で始まるすべての行を一致させてからtun(これは「アンカー」インジケータを使用して実行されます)、出力で一致する行を^計算wcするために使用されます。grep

指摘したとおり@schaibaを使用すると、一致するすべての行を自動的に計算するwcオプションgrepを使用せずにこれを実行できます。-c

ifconfig | grep -c "^tun"

2番目の方法、使用awk:

ifconfig | awk 'BEGIN {tuns=0}; /^tun/ {tuns++}; END {print tuns}'

これにより出力がにパイプされますawkawk一重引用符で囲まれたプログラムは、' ... '次のことを行います。

  • 最初()では、会計処理に使用するBEGIN { ... }内部変数を0に初期化します。tuns
  • メインループで文字列tun(正規表現で表される/^tun/)で始まる各行に対してカウンタをインクリメントします。tuns
  • 入力が完了した後(END { ... })は結果値を出力します。tuns

答え2

これは必要ないかもしれませifconfigip。インターフェースは次の場所にリストされています/sys/class/net

% ls /sys/class/net
eth0  lo  tun0  tun1  tun2  wlan0

したがって、次のようにディレクトリ数を計算できます。

$ printf "%s\n" /sys/class/net/tun* | wc -l
3

関連情報