while_read
之前有遇见过别人写的代码里面用到了while-read组合,当时觉得很神奇,没有仔细研究。最近一次,有个需求,有需要了这个命令。故记录之。
需求如下:批量执行的shell,每行一个命令,而产生的日志文件my.sh |tee log.prod.txt,也正好是每个命令输出一行。需要将输出错误的日志,跟其对应的命令,进行关联,输出到一个新的文件中。我知道,可以使用awk的关联数组(awk非常的强大,能模拟出类似与sql的查询功能)。
简单描述:将两个文件的每1行,按行交叉输入到同一个文件中。(发现paste命令可能更适合)
正文
while-read <
最终执行的代码如下:
下面的代码,好像效率并不高,因为,每次循环都要启动grep命令,这让我想起我之前写的一个程序,也是这样的,循环中执行grep,整个执行时间略长。
优化:感觉可以用awk来代替,将其中一个文件中的数据放到关联数组中,然后在第二个文件中输出。(有空想想)
#!/bin/bash
file1=log.prod.txt
file2=02pinyin_and_git_add.sh
while
IFS=" " read -r x <&3
IFS=" " read -r y <&4
do
echo $x|grep '"code":200' > /dev/null
if [ $? -ne 0 ];then
echo $x
echo $y
fi
done 3<${file1} 4< ${file2}
备注:上面的grep中因为要查找的内容中有双引号,"code":200,故还需要加单引号,括起来。另外,read貌似还能读多个变量。
示例如下:
IFS指定了分隔符号,然后读入到两个变量
x,rest中。(注意,x与rest中如果用tab分隔,好像还是错的,出现语法解析不正确)
IFS=" " read -r x rest <&3
cat |while read
方式1:
cat test1 | while read line;do echo $line;done
方式2:
针对一个文件时:
while read line;do echo $line;done <test1
无限套娃
只要是标准的输入、输出就行,无碍乎多几个进程而已。
虽然我们写不会写能像管道符号那样使用的命令行,但是呢,我们通过while能达到这样的目的。(但是,需要主要while里面 如果频繁调用其他的命令,其实也是有时间开销的,性能比较低)
seq 1 10| while read line;do echo $line;done | while read p;do echo $p;done
seq 1 10| while read line;do echo $line;done | while read p;do echo $p;done | while read p;do echo $p;done