Ответ 1
Используйте system
из awk:
awk '{ system("openssl s_client -connect host:port -cipher " $1) }' ciphers.txt
Я новичок в сценариях оболочки и не могу понять эту, казалось бы, простую задачу. У меня есть текстовый файл (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?
Используйте system
из awk:
awk '{ system("openssl s_client -connect host:port -cipher " $1) }' ciphers.txt
в вашей команде есть немало вещей. Для одного вы хотите использовать первый столбец. Это называется $1 в awk, а не $0 (это будет целая строка). Во-вторых, вы забыли точку с запятой в конце вашего определения команды.
Чтобы фактически запустить команду, вы можете либо использовать system(), либо pipe (последнее имеет смысл только в том случае, если команда может читать из stdin, которая, как мне кажется, откроет в вашем случае, в вашем случае не будет). Проще всего было бы что-то вроде
awk '{cmd="openssl s_client -connect host:port -cipher" $1; system(cmd)}' results.txt
Обратите внимание, что это только вернет статус выхода. Если вам нужно записать stdout, вам нужно будет выполнить команду через getline.
Андреас
PS: Проводка фактической ошибки, которую вы получили, помогла бы.
Команда 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 Мантра.