查找字符串并检查第二个

查找字符串并检查第二个

每个文件的第一行都以a 1 bunknown_string 开头,其余行都以cunknown_string 开头

我想检查字符串是否a 1 b出现在下一行中(比较第一行的 unknown_string 和下一行的 unknown_string)。如果匹配 - 则打印,YES如果不匹配NO,则保留路径和文件名?

输入

loken@lokenU:/home$ cat /home/loken/Documents/bash-test/test1.cfg
 a 1 b Test_1
c Test_1
loken@lokenU:/home$ cat /home/loken/Documents/bash-test/test2.cfg
 a 1 b Test_2
c Test_2
loken@lokenU:/home$ cat /home/loken/Documents/bash-test/test3.cfg
 a 1 b Test_3
c Test_2
c Test_4
loken@lokenU:/home$ cat /home/loken/Documents/bash-test/test4.cfg
 a 1 b Test_4
c Test_2
c Test_3

输出应该类似:

/home/loken/Documents/bash-test/test1.cfg: Yes
/home/loken/Documents/bash-test/test2.cfg: Yes
/home/loken/Documents/bash-test/test3.cfg: NO
/home/loken/Documents/bash-test/test4.cfg: NO

答案1

Perl 来救援!

perl -lne 'if ($. == 1) { ($s) = /a 1 b (.*)/; $f = 0; }
           else { -1 != index $_, $s and $f = 1; }
           if (eof) { print $ARGV, "\t", $f ? "YES" : "NO"; $. = 0}
    ' *.cfg
  • -n逐行读取输入
  • -l在打印中添加换行符
  • $.包含输入行号。在第一行,字符串通过与捕获组匹配存储在 $s 中,并且 $f(“found”)设置为零(false)。
  • 否则(不是第一行),如果找到字符串,则 $f 设置为 true (1)
  • 在文件末尾,行数被重置,并且文件名与结果一起打印。

答案2

和谁玩在一个for 循环

for file in test*.cfg; do 
    awk '
        NR==1 && $1 == "a" && $2 == "1" && $3 == "b"{pattern=$4;next}
        (pattern !~ $2) {count++}
        END{print (count) ? FILENAME " NOK" : FILENAME " OK"}    
    ' "$file"
done

输出 :

test1.cfg OK
test2.cfg OK
test3.cfg NOK
test4.cfg NOK

相关内容