簡體   English   中英

捕獲bash命令的輸出,解析它並存儲到不同的bash變量中

[英]Capture output of a bash command, parse it and store into different bash variables

說明:

我有一個小的bash腳本,它只運行任何 Linux命令(例如說ifconfig

ifconfig的典型輸出是這樣的:

eth0      Link encap:Ethernet  HWaddr 30:F7:0D:6D:34:CA
          inet addr:10.106.145.12  Bcast:10.106.145.255  Mask:255.255.255.0
          inet6 addr: fe80::32f7:dff:fe6d:34ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1104666 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2171 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:444437904 (423.8 MiB)  TX bytes:238380 (232.7 KiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.255.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:15900 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15900 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:467306 (456.3 KiB)  TX bytes:467306 (456.3 KiB)

現在大多數人通常會將整個輸出存儲到文件/變量中並根據它進行解析。 然而,我想知道是否有可能將輸出的特定部分放在多個變量中(比如一個名為${IPETH0}bash變量來從eth0攜帶IP地址10.106.145.12並且${IPLO}攜帶在上面的示例中,來自lo的IP地址127.0.0.1 沒有運行ifconfig命令兩次 )。

類似於tee命令對輸入執行的操作,但我想為輸出執行此操作並將輸出一次性存儲到2個或更多變量中。 有任何想法嗎?

$ read IPETH0 IPLO <<< $(ifconfig | awk '/inet[[:space:]]/ { print $2 }')
$ echo "${IPETH0}"
192.168.23.2
$ echo "${IPLO}"
127.0.0.1

這假定了eth0lo接口的順序,但它顯示了基本思想。

您可以使用awk和bash數組:

arr=( $(awk -F ':' '$1 == "inet addr"{sub(/ .*/, "", $2); print $2}' < <(ifconfig)) )

然后你可以這樣做:

read IPETH0 IPLO <<< ${arr[@]}

你可以讀取ifconfig的每一行並設置變量:

while read l1 ;do 
   if [[ $l1 =~ inet ]];then     
      set -- $l1 
      echo  "ip is  $2  " 

   fi
done < <(ifconfig)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM