前言:测试
近期因为业务的须要,需实现经过监控日志文件的内容并定时将日志的有效内容经过邮件进行告警。 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