Вывод трубы для использования в качестве спецификации поиска для grep в Linux
Как мне передать вывод grep в качестве шаблона поиска для другого grep?
В качестве примера:
grep <Search_term> <file1> | xargs grep <file2>
Я хочу, чтобы выход первого grep использовался как поисковый термин для второго grep. Вышеприведенная команда обрабатывает вывод первого grep как имя файла для второго grep. Я попытался использовать параметр -e
для второго grep, но он тоже не работает.
Ответы
Ответ 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-адреса, когда мне присваивается имя хоста.