awk / grep / sed: найти несколько шаблонов в одной строке в моих файлах - PullRequest
0 голосов
/ 19 апреля 2020

Я много читал здесь о awk и переменных, но не смог найти то, что хочу. У меня есть несколько файлов ($ FILES) в каталоге ($ DIR), и я хочу найти в этих файлах все строки, содержащие: обе строки (SEARCH1 и SEARCH2). Использование sh (/ bin / bash): я НЕ хочу использовать команду чтения, поэтому я предпочитаю awk / grep / sed. Требуемый вывод - это строка (-и), содержащая 2 строки и соответствующий код. имя файла (ов) файла (ов). Когда я использую этот код, все в порядке:

FILES="news_*.txt"
DIR="/news"

awk '/Corona US/&&/Infected/{print a[FILENAME]?$0:FILENAME RS $0;a[FILENAME]++}' ${DIR}/${FILES}

Теперь я хочу заменить 2 шаблона («Corona US» и «Infected») переменными в команде awk, и я попытался:

SEARCH1="Corona US"
SEARCH2="Infected"

awk -v str1="$SEARCH1" -v str2="$SEARCH2" '/str1/&&/str2/{print a[FILENAME]?$0:FILENAME RS $0;a[FILENAME]++}' ${DIR}/${FILES}

Однако это не дало мне правильного вывода: оно оказалось пустым (ничего не нашел).

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

Поскольку вы не показали пример выходных данных, поэтому не могли его протестировать, основываясь на коде OP, пытающемся это исправить.

awk -v str1="$SEARCH1" -v str2="$SEARCH2" 'index($0,str1) && index($0,str2){print (seen[FILENAME]++ ? "" : FILENAME ORS) $0;a[FILENAME]++}' ${DIR}/${FILES}

ИЛИ

awk -v str1="$SEARCH1" -v str2="$SEARCH2" '$0 ~ str1 && $0 ~ str2{print (seen[FILENAME]++ ? "" : FILENAME ORS) $0;a[FILENAME]++}' ${DIR}/${FILES}

Проблема с кодом OP: Мы не можем искать переменные внутри /var/ in, следует использовать стиль index или $0 ~ str.

0 голосов
/ 19 апреля 2020

Не на 100% ясно, что именно вы ищете, но звучит как grep -H с альтернативным шаблоном, который позволит вам вывести имя файла и строку, которая соответствует $SEARCH1 или $SEARCH2 в любом месте линия. Например, вы можете сделать:

grep -H "$SEARCH1.*$SEARCH2\|$SEARCH2.*$SEARCH1" "$DIR/"$FILES

( примечание $FILES должно НЕ указываться , чтобы * расширение имело место.)

Если вы просто хотите получить список имен файлов, содержащих совпадения в любой строке, вы можете изменить -H на -l.

...