前言:測試
近期因爲業務的須要,需實現經過監控日誌文件的內容並定時將日誌的有效內容經過郵件進行告警。 spa
文本內容的格式以下:3d
1 aaa 2 bbb 4 ccc 7 ddd
但願輸出:日誌
bbb
ccc
版本一code
#!/bin/sh msg="" echo -e "start-msg=${msg}" cat aa.txt | while read line do num=`echo ${line} | awk -F ' ' '{ print $1 }'` text=`echo ${line} | awk -F ' ' '{ print $2 }'` if [ $((num%2)) = 0 ]; then # 按行拼接 msg="${msg}\n${text}" echo -e "msg=${msg}" fi done echo -e "final-msg=${msg}" echo "-- all done --"
版本二修改以下:blog
在循環內部增長變量"index",最後經過判斷"index"是否到達最後一行進行結果輸出進程
#!/bin/sh msg="" #經過判斷行數決定是否輸出 total_row=`wc -l aa.txt | awk '{ print $1 }'` index=0 echo -e "start-msg=${msg}" cat aa.txt | while read line do ((index++)) num=`echo ${line} | awk -F ' ' '{ print $1 }'` text=`echo ${line} | awk -F ' ' '{ print $2 }'` if [ $((num%2)) = 1 ]; then # 按行拼接 msg="${msg}\n${text}" echo -e "msg=${msg}" fi if [ ${index} = ${total_row} ]; then echo -e "final-msg=${msg}" fi done echo "-- all done --"
分析:class
如上版本一之因此輸出爲空是由於"msg"在循環內部是屬於局部變量,循環內部賦值有效,且打印的局部變量值不爲空,但隨之cat管道關閉,子進程被關閉,msg的值又恢復爲初始值"'。awk
附:監控
管道外的局部變量賦值失效的場景能夠使用以下命令進行測試
$ a=1; echo $a; echo "hello, world" | while read line ; do ((a++)); echo $a; done; echo $a