Мне нужно найти в наших почтовых журналах конкретный адрес электронной почты. Мы сохраняем текущий файл с именем maillog, а также файлы .bz2 за неделю в той же папке. В настоящее время я запускаю следующие команды для поиска файла:
grep person@domain.com maillog
bzgrep person@domain.com *.bz2
Есть ли способ объединить grep
и bzgrep
команды в один выход? Таким образом, я мог бы перенаправить объединенные результаты в одно электронное письмо или в один файл.
()
вместо{}
?()
но не в{}
любом случае +1, так как это то, что мне было нужно!bzgrep автоматически по умолчанию использует обычный grep, если файл не сжат в bzip. Таким образом, следующего должно быть достаточно:
о, конечно же, вот и мое обязательное параллельное решение GNU :
что может быть намного быстрее, если вы проверяете много файлов.
источник
Вот еще один способ сделать это (при условии, что вы используете bash, что, вероятно, и есть):
Здесь bash прозрачно передает выходные данные команд bzgrep и grep в cat, как если бы они были файлами (и они вроде находятся под капотом, детали в url внизу).
В вашем конкретном случае я бы порекомендовал решение Фила, но вышесказанное - хороший прием, чтобы держать его в сумке.
Если вам интересно, вы можете прочитать больше здесь: http://www.tldp.org/LDP/abs/html/process-sub.html
источник
На момент написания этой статьи синтаксис принятого ответа был неправильным для большинства, если не для всех оболочек, производных от Борна, в том числе
bash
. Я предложил правку сверху и принял ответ, чтобы исправить это, но я также был склонен добавить всю эту другую информацию, и это было бы скорее переписать, чем редактировать.Вы можете использовать составные команды:
..или подоболочки (обратите внимание на круглые скобки вместо фигурных скобок):
..группировать команды. Способ subshell имеет более приятный синтаксис (более простое отсутствие пробелов и позволяет пропустить последнюю точку с запятой), но он либо разветвляет новый процесс, либо «делает вид», выполняя команды в очищенной среде. Оба имеют свои преимущества в зависимости от того, что вы хотите сделать, которые здесь не имеют значения, но их стоит посмотреть, если вы хотите больше владеть оболочкой.
Примечание. С этими приемами вы также можете использовать конвейерную обработку, так что вы можете сделать что-то вроде этого:
PS если вы не заботитесь о упорядочении матчей в вашей совокупной продукции, вы можете использовать один
&
между двумя командами, например , так:{ grep ... & bzgrep ...; }
. Затем две команды выполняются одновременно:grep
запускается и оболочка помещает его в фоновый режим, затем оболочка запускаетbzgrep
. (Но с этим есть небольшая оговорка: объяснение, включающее перенаправление файлов и буферизацию файлового потока, потенциально может привести к разделению / искажению очень маленькой части строк в выходном файле: увидите ли вы, что это будет зависеть от тогоgrep
, как вы ,bzgrep
иlibc
stdio.h
функции реализованы. В большинстве реализаций я полагаю, что передача команды перед перенаправлением в файл позволит избежать проблемы, так что вы можете сделать это{ foo & bar; } | cat - >file
в качестве обходного пути.)источник
Вы можете связать команды вместе с &&, что позволит вам выполнить каждую команду.
Вы также можете добавить >> textfile.txt в конец каждой команды, чтобы результат попадал в файл, а затем отправлял его по почте.
источник
grep ... && bzgrep ...
, если у grep нет попаданий, он вернет ошибку и команда остановится.>>
Это хорошая идея, хотя, в отличие от этого>
, она добавит вывод в конец существующего файла.