Поиск в поиске

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

Вот моя попытка, когда я ищу «инструмент» в моем результате:

 grep tool | grep -rl embed= 

Это возвращает некоторые результаты, а затем консоль зависает. Существуют ли простые / элегантные решения?

Трубопроводы идут слева направо. Точнее, процессы выполняются параллельно, но данные идут слева направо: вывод команды слева становится входом команды справа.

Здесь слева находится команда grep tool . Поскольку вы передаете один аргумент grep , он выполняет поиск в стандартном вводе. Поскольку вы не перенаправили стандартный ввод, grep читает с терминала: он ждет вас, чтобы набрать.

Чтобы выполнить поиск в файле, используйте

 grep tool path/to/file | … 

Для поиска в каталоге рекурсивно используйте

 grep -r tool path/to/directory | … 

Вы можете фильтровать результаты, чтобы отображать только строки, содержащие embed= . Бросьте опции -l и -r , они не имеют никакого смысла, когда вход поступает со стандартного ввода.

 grep -r tool path/to/directory | grep 'embed=' 

Здесь перечислены строки, содержащие как tool и embed= (в любом порядке). Альтернативный метод с более простой сантехникой – сделать один поиск с помощью шаблона или шаблона; это всегда возможно, но если шаблоны могут перекрываться (не здесь), шаблон может стать очень сложным.

 grep -E -r 'tool.*embed=|embed=.*tool' path/to/directory 

Если вы хотите перечислить файлы, содержащие как tool и embed= , вам понадобится другая структура команд, в которой первые имена файлов списков grep ( -l ), а второй – имена этих файлов в качестве аргументов , а не как входные данные. Преобразование стандартного ввода в аргументы командной строки, для чего xargs команда xargs .

 grep -lZ -r tool path/to/directory | xargs -0 grep -l 'embed=' 

Эта команда будет искать foo в файле filename и в результатах для bar :

grep foo filename | grep bar

Альтернативой будет awk: awk '/foo/ && /bar/' filename

Вы можете использовать grep по-разному, например:

 cat myfile | grep keyword 

В приведенном выше примере дамп файла в stdout . Символ трубы | выберет этот вывод и передаст его команде grep keyword качестве stdin . В конце строки строки в myfile, содержащие keyword будут записаны в стандартный stdout , который обычно является экраном терминала. Это очень неэффективное использование ресурсов, тот же результат можно выполнить и с помощью этой команды:

 grep keyword myfile 

если вы хотите использовать grep в каскадном режиме, вот как это делается:

 grep keyword1 myfile | grep keyword2 

На этот раз первая команда grep находит строки, содержащие keyword1 в myfile. Вторая команда grep выводит результат первого и ищет keyword2 в них. Эффективно, вы ищете строки, содержащие как keyword1 и keyword2 в myfile .

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

По существу то, что вы пытаетесь сделать, логично И. grep – это инструмент для сопоставления строк, поэтому в терминах строки patter1 и patter2 логика означает, что они будут находиться на одной линии; при поиске файла, где вы хотите найти строку с одним термином и другой в одной строке, вы можете использовать регулярное выражение grep 'pattern1.*pattern2' input_file.txt

 $ ps -ef | grep 'xieerqi.*firefox' xieerqi 5069 2616 7 17:43 ? 00:07:25 /usr/lib/firefox/firefox xieerqi 24317 6901 0 19:22 pts/19 00:00:00 grep xieerqi.*firefox 

В этом примере вместо поиска всех процессов с моим именем пользователя и последующим подключением к другому grep который фильтрует процессы firefox .

Дополнительные сведения см. В этом руководстве.