前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell如何解决文件流管道的文本拼接失效问题

Shell如何解决文件流管道的文本拼接失效问题

作者头像
云海谷天
发布2022-08-09 14:41:24
5520
发布2022-08-09 14:41:24
举报
文章被收录于专栏:技术一点点成长

前言:

  近期由于业务的需要,需实现通过监控日志文件的内容并定时将日志的有效内容通过邮件进行告警。  

文本内容的格式如下:

代码语言:javascript
复制
1 aaa
2 bbb
4 ccc
7 ddd

希望输出:

代码语言:javascript
复制
bbb
ccc

版本一

代码语言:javascript
复制
#!/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 --"

版本二修改如下

 在循环内部增加变量"index",最后通过判断"index"是否到达最后一行进行结果输出

代码语言:javascript
复制
#!/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 --"

分析:

  如上版本一之所以输出为空是因为"msg"在循环内部是属于局部变量,循环内部赋值有效,且打印的局部变量值不为空,但随之cat管道关闭,子进程被关闭,msg的值又恢复为初始值"'。

附:

管道外的局部变量赋值失效的场景可以使用如下命令进行测试

$  a=1; echo $a; echo "hello, world" | while read line ; do ((a++)); echo $a; done; echo $a

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档