Подтвердить что ты не робот

Вывод трубы для использования в качестве спецификации поиска для grep в Linux

Как мне передать вывод grep в качестве шаблона поиска для другого grep?

В качестве примера:

grep <Search_term> <file1> | xargs grep <file2>

Я хочу, чтобы выход первого grep использовался как поисковый термин для второго grep. Вышеприведенная команда обрабатывает вывод первого grep как имя файла для второго grep. Я попытался использовать параметр -e для второго grep, но он тоже не работает.

4b9b3361

Ответ 1

Если вы используете Bash, вы можете использовать обратные ссылки:

> grep -e "`grep ... ...`" files

флаг -e, а двойные кавычки должны гарантировать, что любой вывод из начального grep, который начинается с дефиса, затем не интерпретируется как опция ко второй grep.

Обратите внимание, что трюк с двойным кавычками (который также гарантирует, что вывод grep обрабатывается как единственный параметр) работает только с Bash. Он не работает с (t) csh.

Обратите внимание также, что обратные ссылки являются стандартным способом получения вывода из одной программы в список параметров другого. Не все программы имеют удобный способ считывать параметры из stdin так, как это делает (f) grep.

Ответ 2

Вам нужно использовать переключатель xargs -i:

grep ... | xargs -ifoo grep foo file_in_which_to_search

В этом случае этот параметр принимает после -i (foo) и заменяет каждое его появление в команде выходом первого grep.

Это то же самое, что:

grep `grep ...` file_in_which_to_search

Ответ 3

Попробуйте

grep ... | fgrep -f - file1 file2 ...

Ответ 4

Я хотел найти текст в файлах (используя grep), которые имели определенный шаблон в именах файлов (найденных с помощью find) в текущем каталоге. Я использовал следующую команду:

 grep -i "pattern1" $(find . -name "pattern2")

Здесь pattern2 - это шаблон в именах файлов, а pattern1 - это шаблон, в файлах, соответствующих шаблону2.

изменить: Не строго конвейерно, но все еще связанный и весьма полезный...

Ответ 5

Это то, что я использую для поиска файла из списка:

ls -la | grep 'file-in-which-to-search'

Ответ 6

Хорошо, нарушая правила, поскольку это не ответ, просто примечание о том, что я не могу заставить любое из этих решений работать.

% fgrep -f test file

отлично работает.

% cat test | fgrep -f - file
fgrep: -: No such file or directory

не выполняется.

% cat test | xargs -ifoo grep foo file 
xargs: illegal option -- i
usage: xargs [-0opt] [-E eofstr] [-I replstr [-R replacements]] [-J replstr]
             [-L number] [-n number [-x]] [-P maxprocs] [-s size]
             [utility [argument ...]]

не удается. Обратите внимание, что необходим капитал I. Если я использую это, все хорошо.

% grep "`cat test`" file

kinda работает в том, что он возвращает строку для членов, которые соответствуют, но также возвращает строку grep: line 3 in test: No such file or directory для каждого файла, который не находит соответствия.

Я что-то упустил или это просто различия в распределении Дарвина или оболочки bash?

Ответ 7

Я пробовал этот путь, и он отлично работает.

[[email protected] abc]$ cat a
not problem
all
problem
first
not to get
read problem
read not problem

[[email protected] abc]$ cat b
not problem xxy
problem abcd
read problem werwer
read not problem  98989
123 not problem 345
345 problem tyu

[[email protected] abc]$ grep -e "`grep problem a`" b --col
not problem xxy
problem abcd
read problem werwer
read not problem  98989
123 not problem 345
345 problem tyu

[[email protected] abc]$ 

Ответ 8

Вы должны выполнить grep таким образом, чтобы извлечь только имена файлов, см. Параметр -l (строчная буква L):

grep -l someSearch * | xargs grep otherSearch

Потому что на простом grep вывод гораздо больше информации, чем только имена файлов. Например, когда вы делаете

grep someSearch *

Вы будете передавать информацию в xargs, как это

filename1: blablabla someSearch blablabla something else
filename2: bla someSearch bla otherSearch
...

Трубопровод любой из вышеперечисленных строк делает бессмысленным переход на xargs. Но когда вы выполните grep -l someSearch *, ваш вывод будет выглядеть так:

filename1
filename2

Такой вывод теперь можно передать в xargs

Ответ 9

Я нашел следующую команду для работы с помощью $() с моей первой командой внутри скобки, чтобы сначала выполнить ее оболочку.

grep $(dig +short) file

Я использую это для просмотра файлов для IP-адреса, когда мне присваивается имя хоста.