Linux Shell 處理資料, 大多都用 cat、sed、grep、awk ... 等等, 但這些都是對整堆資料處理, 若需要將這些資料額外一行一行拉出來另外處理的時候, 於 Shell script 要怎麼做?
Bash Shell Pipeline 將資料一行一行分開處理 (read + while)
Shell script 要將資料一行一行處理, 可以使用 read 配合 while 來作到.
- ex: while read -r line ... do / done, line 是變數, 就是當行的資料.
範例
- vim /tmp/example.log
10,10.10.1.1 20,192.168.0.1 c30,168.95.1.1 c40,8.8.8.8 c50,8.8.4.4
- 註: 在下述處理寫的比較複雜點(把 , => ' ', 然後下面再多依照空白分割一次), 是因為一般前後都還會有很多沒用的資料.
- 將 IP 分開, 再分別 ping 一次 (while / read -r 會將每行的資料存到 $line 的變數去), 程式碼如下:
cat /tmp/example.log | grep '^c' | awk -F"," '{print $1, $2}' | while read -r line do id=`echo $line | awk '{print $1}'` ip=`echo $line | awk '{print $2}'` echo "$id $ip" echo $id `ping -c 1 $ip` done
- 將上述存成 ip-ping.sh, 下次使用就會方便許多~