我从一个由管道(|)字符分隔的字符串组成的现有程序中获得输入:
$ echo "$list_of_nodes"
NODE-BB-4|NODE-AA-1|DUMMY现在,我需要检查每个文件是否存在于一个单独的文件中:
$ cat file
NODE-BB-4 1.1.1.1
NODE-AA-1 2.2.2.2"NODE-BB-4|NODE-AA-1"时传递,因为这两个字符串都在文件中,"NODE-BB-4|NODE-AA-1|DUMMY"时,应该会失败,因为文件中不存在"DUMMY"。我就是这么想的,但这显然不是最好的主意:
$ echo "$list_of_nodes" |tr '|' '\n' |while read line;
> do grep -q "$line" foo ;
> echo $? ;
> done|awk '{s=s+$0} END{print s}' |awk '$1>0{print "Fail"}'
Fail在这里,我将每个模式循环到grep,并存储返回代码,然后检查它是否是grater,然后检查它是否为0。
发布于 2018-05-07 19:44:10
当节点被指定为文件中的第一列时,可以使用grep。
我想使用您的tr方法,以不同的方式编写。
tr '|' '\n' <<< "${list_of_nodes}"可以使输出看起来像一个具有进程替换的文件。
<(tr '|' '\n' <<< "${list_of_nodes}"当您想使用文件的第一个字段检查这些字段时,请将该文件剪切。
cut -d' ' -f1 file您可以将outoput用于另一个进程substition,并使用grep (选项x:完全匹配)。
grep -xvf <(cut -d' ' -f1 file) <(tr '|' '\n' <<< "${list_of_nodes}")现在,您可以用sed替换输出。
sed -r 's/.+/FAIL: &/'零件合在一起:
grep -xvf <(cut -d' ' -f1 file) <(tr '|' '\n' <<< "${list_of_nodes}") |
   sed 's/.+/FAIL/'https://stackoverflow.com/questions/50213379
复制相似问题