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指定了分隔符号,然后读入到两个变量xrest中。(注意,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