1

Я анализирую текст в командной строке. Как я могу взять вывод одной команды и использовать его в двух местах в следующей команде?

some_command | head -n $( awk '/search_term/ {print FNR} output_of_some_command ) output_of_some_command

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

Могу ли я сделать это или мне нужно записать во временный файл?

1 ответ1

1

Для этой конкретной задачи вы можете использовать sed вместо head - или вы можете использовать awk вместо head:

some_command | awk '{print} /search_term/{exit}'

Выведите строки, но, если вы найдете строку, соответствующую поисковому запросу, выйдите (и после этого больше не обрабатывайте строки).

Более общее решение проблемы, которую вы описываете:

some_command | tee >(command2) | command3

или же

some_command | tee >(command2) >(command3)

Они будут работать в bash , но, вероятно, не слишком много других оболочек (включая sh).  >(command) дает вам дескриптор файла для канала для command запуска процесса.  Как вы, вероятно, знаете, tee позволяет вам брать поток данных и записывать его в нескольких местах.

Но ваша проблема тоньше, чем то, что вы сказали.  Ты не пытаешься сделать

                                          A → B и A → C параллельно

ты пытаешься сделать

                A → B → C и A → C параллельно

где команда head (соответствующая C на диаграмме) получает входные данные от « some_command » (A), но также имеет аргумент командной строки, установленный из выходных данных awk (B).  Я подозреваю, что общее решение для этого было бы намного хитрее.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .