Использование вывода команды awk для запуска

Я новичок в сценариях оболочки и не могу понять эту, казалось бы, простую задачу. У меня есть текстовый файл (ciphers.txt), содержащий около 250 строк, и я хотел бы использовать первый столбец каждой строки в качестве аргумента в команде. Любая помощь будет принята с благодарностью!

команда:

openssl s_client -connect host:port -cipher argument

Он отлично работает, когда я делаю это за один раз, но я действительно не хочу запускать ту же команду в 250 раз. Вот мой script:

awk '{command = "openssl s_client -connect localhost:4433 -cipher > results.txt"
print $0 | command}' ciphers.txt

Я продолжаю получать ошибку, поэтому я уверен, что у меня есть синтаксическая ошибка где-то. Является ли вывод awk добавленным после -cipher?

Ответы

Ответ 1

Используйте system из awk:

awk '{ system("openssl s_client -connect host:port -cipher " $1) }' ciphers.txt

Ответ 2

в вашей команде есть немало вещей. Для одного вы хотите использовать первый столбец. Это называется $1 в awk, а не $0 (это будет целая строка). Во-вторых, вы забыли точку с запятой в конце вашего определения команды.

Чтобы фактически запустить команду, вы можете либо использовать system(), либо pipe (последнее имеет смысл только в том случае, если команда может читать из stdin, которая, как мне кажется, откроет в вашем случае, в вашем случае не будет). Проще всего было бы что-то вроде

awk '{cmd="openssl s_client -connect host:port -cipher" $1; system(cmd)}' results.txt

Обратите внимание, что это только вернет статус выхода. Если вам нужно записать stdout, вам нужно будет выполнить команду через getline.

Андреас

PS: Проводка фактической ошибки, которую вы получили, помогла бы.

Ответ 3

Команда xargs предназначена специально для этого случая использования.

awk '{print $0}' <ciphers.txt | xargs -I{} openssl s_client -connect host:port -cipher {} >>results.txt

Эта версия немного длиннее для примера, потому что awk уже использовался для анализа $0. Тем не менее, xargs пригодится, когда у вас уже есть список вещей, которые нужно использовать, и не запускает что-то, что может выполнять подоболочку. Например, awk можно использовать ниже для выполнения mv, но xargs намного проще.

ls -1 *.txt | xargs -I{} mv "{}" "{}.$(date '+%y%m%d')"

Вышеупомянутая команда переименовывает каждый текстовый файл в текущем каталоге в резервную копию с отметкой даты. Для эквивалента в awk требуется сделать переменную из результатов команды date, передав ее в awk, а затем создав и выполнив команду.

Команда xargs также может накапливать несколько параметров в одной строке, что полезно, если вход имеет несколько столбцов или когда одна запись разделяется на повторяющиеся группы во входном файле.

Чтобы узнать больше о всех способах его использования, просмотрите "xargs" Руководство для всех в одном руководстве в UNIX Мантра.