Shell如何解决文件流管道的文本拼接失效问题
前言:
近期由于业务的需要,需实现通过监控日志文件的内容并定时将日志的有效内容通过邮件进行告警。
文本内容的格式如下:
1 aaa
2 bbb
4 ccc
7 ddd
希望输出:
bbb
ccc
版本一
#!/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%)) = ]; then
# 按行拼接
msg="${msg}\n${text}"
echo -e "msg=${msg}"
fi
done
echo -e "final-msg=${msg}"
echo "-- all done --"

版本二修改如下:
在循环内部增加变量"index",最后通过判断"index"是否到达最后一行进行结果输出
#!/bin/sh
msg=""
#通过判断行数决定是否输出
total_row=`wc -l aa.txt | awk '{ print $1 }'`
index=
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%)) = ]; 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

Shell如何解决文件流管道的文本拼接失效问题的更多相关文章
- Ruby操作VBA的注意事项和技巧(1):乱码、获取VBA活动和非活动窗口的名称与路径、文件路径的智能拼接与截取(写入日期)
1.VBA编辑器复制粘贴出来的代码乱码 解决方法:切换到中文输入模式再复制出来就行了 2.获取VBA活动和非活动窗口的名称与路径 Dim wbpath, filename As String ...
- 【POI】使用POI 创建生成XLS,打开xls文件提示【此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数。】
使用POI 创建生成XLS,打开xls文件提示[此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数.] 原因: 是因为在POI处理xls的过程中,太多次调用了: HSSFFont fon ...
- Linux 输出文件列数,拼接文件
如果我只想看看文件的前几行,每行的字段数(列数),我的文件已tab作为分隔符(这个可以自己指定),其具体命令如下: head fileName | awk -F'\t' '{print NF}' 如果 ...
- HTML中解决双击会选中文本的问题
HTML中解决双击会选中文本的问题 <div unselectable="on" style="-moz-user-select:none;" onsel ...
- ASP.Net MVC_DotNetZip简单使用方法,解决文件压缩的问题[转]
准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. ? 1 2 3 4 5 6 7 8 9 10 11 ...
- shell脚本中文件测试
shell脚本中文件测试 author:headsen chen 2017-10-17 14:35:19 个人原创,转载请注明作者,否则 依法追究法律责任 [ -f filename ] ...
- Shell脚本统计文件行数
Shell脚本统计文件行数 转自 http://www.jb51.net/article/61943.htm 示例:row_count.sh文件 awk '{print NR}' row_cou ...
- 使用shell命令给文件中每一行的前面、后面添加字符
shell command shell给一个文件中的每一行开头插入字符的方法:awk '{print "xxx"$0}' fileName shell给一个文件中的每一行结尾插入字 ...
- 【转载】 C#往文件中追加文本内容信息
在C#的文件相关操作中,往已有的文件中追加相关内容信息也是常有的操作,例如我们在写网站日志文件的时候,很多时候是1天的日志存放在一个txt文件中,此时就涉及到往原有文件中追加写入文本内容信息,追加文本 ...
随机推荐
- Visual Studio模板
转载自MSDN,此文仅作参考. http://msdn.microsoft.com/zh-cn/library/6db0hwky(VS.80).aspx 1. 如何导入“项目模板(Project Te ...
- EnyimMemcached中用DateTime参数设置过期后赋值有问题的解决.
环境: win10 64位.memcached 1.4.4 64位.EnyimMemcached 2.16.0(ps:2.13.0也有此问题,别的版本就没试了). EnyimMemcached git ...
- 使用ABP框架踩过的坑系列5
DDD领域驱动开发,实际是为复杂的业务场景而生的,为了让开发人员专注于业务,而操作系统.数据库.网络之类的技术细节,必须要持久透明化:实际就是数据库系统DBMS的ORM抽象,目标就是业务不需要考虑数据 ...
- MSSQL 全库搜索 指定字符串
平时在在MSSql中查询数据的时候,想查找,某个字段在数据库中是否存在,并且查询出在哪个表中,哪个字段下面,在不知道的情况下,操作起来会很麻烦,然后就写了一个sql语句,使用起来感觉挺方便的.当然了, ...
- 20164317《网络对抗技术》Exp3 免杀原理与实践
一.实验要求 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),veil-evasion(0.5分),加壳工具(0.5分),使用shellcode编程( ...
- Elasticsearch入门 + 基础概念学习
原文地址:https://www.cnblogs.com/shoufeng/p/9887327.html 目录 1 Elasticsearch概述 1.1 Elasticsearch是什么 1.2 E ...
- 二叉堆的实现(数组)——c++
二叉堆的介绍 二叉堆是完全二元树或者是近似完全二元树,按照数据的排列方式可以分为两种:最大堆和最小堆.最大堆:父结点的键值总是大于或等于任何一个子节点的键值:最小堆:父结点的键值总是小于或等于任何一个 ...
- 二叉查找树的实现——c++
二叉查找树的c++实现: 1. 节点和二叉查找树的定义 1.1 二叉查找树节点 template <class T> class BSTNode{ public: T key; // 关键 ...
- 设置jade高亮
来自:https://segmentfault.com/a/1190000002896247 打开sublime3,再打开 view > show console,把下列代码复制到console ...
- pods报错修复方法
### Error ``` RuntimeError - [!] Xcodeproj doesn't know about the following attributes {"inputF ...