-2

Каждый файл имеет первую строку, начинающуюся с a 1 b за которой следует unknown_string, а остальные строки начинаются с c за которым следует unknown_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

2 ответа2

2

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), если строка найдена
  • В конце файла счетчик строк сбрасывается, и имя файла печатается с результатом.
0

Игра с в с циклом 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .