передача результатов команды awk в качестве параметра

Предположим, что я использовал awk для получения значения двух разных столбцов:

Скажем, выход:

азбука

Защита

Теперь я хочу использовать abc и def как шаблоны для grep , используя конвейер с предыдущей командой. Есть какой-либо способ сделать это?

Для уточнения:

У меня есть файл в формате pdf, и я ищу ключевое слово в файле, используя:

 pdftotext 'filename.pdf' - | grep 'pattern' 

Теперь, если найдено какое-либо совпадение, я хочу использовать первый и второй столбцы результата в качестве параметров grep в конвейере с предыдущей командой. Я могу получить первые два столбца, используя

 pdftotext 'filename.pdf' - | grep 'pattern' | awk '{ print $1, "\t"$2 }' 

Теперь, как я буду передавать эти два значения снова (2-й раз) как шаблоны после команды grep в конвейере с указанным выше?

Вы можете сделать это с заменой процесса следующим образом:

 grep -f <(awk '{print $1 "\n" $3}' filename) otherfile 

Это приведет к тому, что grep прочитает свои шаблоны из файла (флага -f ), который в этом случае фактически является результатом процесса awk...filename который печатает шаблоны по одному в каждой строке. Затем grep-поиски для этих шаблонов в otherfile

Хотя, возможно, менее эффективно, если вы действительно хотите сделать это в конвейере, вы можете сделать это с помощью grep читающего его шаблоны из stdin, как

 awk '{print $1 "\n" $3}' filename | grep -f - otherfile 

Изменить: видя редактирование вашего вопроса об использовании grep, а затем awk, вы можете позволить awk выполнить шаблон для вас, выполнив:

 grep -Ff <(awk '/pattern/ {print $1 "\n" $3}' <(pdftotext 'filename.pdf' -)) otherfile 

или как трубопровод:

 pdftotext 'filename.pdf' - | awk '/pattern/ {print $1 "\n" $3}' | grep -Ff - otherfile 

Многие оболочки поддерживают подстановку команд, так что, например,

 p=$(awk '{ print $1,$3 }' filename) 

захватывает вывод команды awk '{ print $1,$3 }' filename в переменную p . Обратите внимание, что ваша cat избыточна здесь: awk может читать непосредственно из filename .

Тем не менее, я подозреваю, что вы действительно хотите сделать, это последовательные строки вывода awk и проанализировать их на отдельные переменные. Если это так, вы можете сделать что-то вроде

 awk '{print $1,$3}' filename | while read -r p1 p2; do grep -F "$p1" otherfile | grep -F "$p2"; done 

найти строки в otherfile которые соответствуют обоим полям $1 и $3 от filename .

Это можно сделать с помощью подстановки команд.

Цитируя отсюда :

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

$(command)

или (backquoted version):

`command`

Вы можете узнать, как использовать xargs для передачи и определения параметров.

 cat filename|awk '{print $1,"\n"$3}'|xargs -I {} grep {} somefile 

xargs -I {} замените параметр на "{}", чтобы использовать grep