Труба выводится для использования в качестве спецификации поиска для grep в Linux - PullRequest
27 голосов
/ 13 января 2009

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

Как пример:

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

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

Ответы [ 9 ]

14 голосов
/ 21 октября 2009

Вам необходимо использовать xargs s -i switch:

grep ... | xargs -ifoo grep foo file_in_which_to_search

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

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

grep `grep ...` file_in_which_to_search
12 голосов
/ 13 января 2009

Попробуйте

grep ... | fgrep -f - file1 file2 ...
8 голосов
/ 13 января 2009

Если вы используете Bash, вы можете использовать backticks:

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

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

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

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

4 голосов
/ 22 июня 2012

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

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

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

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

2 голосов
/ 08 октября 2013

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

ls -la | grep 'file-in-which-to-search'
1 голос
/ 01 июня 2017

Я пробовал таким образом, и он прекрасно работает.

[opuser@vjmachine abc]$ cat a
not problem
all
problem
first
not to get
read problem
read not problem

[opuser@vjmachine abc]$ cat b
not problem xxy
problem abcd
read problem werwer
read not problem  98989
123 not problem 345
345 problem tyu

[opuser@vjmachine 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

[opuser@vjmachine abc]$ 
1 голос
/ 03 июля 2015

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

% 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

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

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

0 голосов
/ 21 мая 2019

Вы должны выполнить 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

0 голосов
/ 07 июня 2012

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

grep $(dig +short) file

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...