нахождение нескольких линий паттернов и остановка после первого появления - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть множество файлов в разных местах, включая * / synth / debug / * в их шаблоне пути, все файлы имеют расширение * .list.Файлы выглядят так:

MODULE XYZ
SIGNED_A 0
WIDTH 12
SIGNED_B 1
(...)

MODULE XXX
SIGNED_A 1
WIDTH 12
SIGNED_B 0
(...and so on...)

Мне нужно найти первый файл с шаблоном MODULE XXX (то же самое для XYZ и т. Д.) И шаблоном SIGNED * 1 в первых 3 строках после MODULE XXX и прекратить поиск.Подписанное слово всегда появляется в 1-3 строке после МОДУЛЯ.

У меня есть что-то подобное:

find . -name *.list -path "*/synth/debug/*" -type f -exec grep -FHI "MODULE XXX" -A 3 {} \; | grep "SIGNED 1" -A 3 | head -1

, но я получил:

find: ‘grep’ terminated by signal 13

после первого (правильного) вхождения, и команда все еще ищет и анализирует файлы, теряявремя.

1 Ответ

0 голосов
/ 15 ноября 2018

Использование awk

find . -name *.list -path "*/synth/debug/*" -type f -exec awk '/MODULE XXX/{xxx=1;next}xxx{xxx+=1}/SIGNED.*1/&&xxx<=4{print FILENAME; exit}xxx>4{nextfile;}ENDFILE{xxx=0}' {} +

Выход - это имя первого файла, соответствующего вашим условиям

Удалить xxx>4{nextfile;}, если файл содержит несколько блоков MODULE XXX

Для обработки каждого модуля в 1 команде:

find . -name *.list -path "*/synth/debug/*" -type f -exec awk '/MODULE/{current=$2; line=1; next}current in results{next;}{line+=1}/SIGNED.*1/&&line<=4{results[current]=FILENAME}END{for(module in results){print module, results[module]}}' {} +

Вывод: имя модуля + условия соответствия первого файла:

ABC file2.txt
XXX file1.txt
XYZ file1.txt
...