Linux 使用awk的输出运行命令

Linux 使用awk的输出运行命令,linux,bash,shell,awk,Linux,Bash,Shell,Awk,我对shell脚本是全新的,似乎无法理解这个看似简单的任务。我有一个大约250行的文本文件(ciphers.txt),我想在命令中使用每行的第一列作为参数。任何帮助都将不胜感激 命令是: openssl s_client -connect host:port -cipher argument 当我一次执行一个命令时,它工作得很好,但我真的不想运行同一个命令250多次以上。以下是我目前的脚本: awk '{command = "openssl s_client -connect localhos

我对shell脚本是全新的,似乎无法理解这个看似简单的任务。我有一个大约250行的文本文件(ciphers.txt),我想在命令中使用每行的第一列作为参数。任何帮助都将不胜感激

命令是:

openssl s_client -connect host:port -cipher argument
当我一次执行一个命令时,它工作得很好,但我真的不想运行同一个命令250多次以上。以下是我目前的脚本:

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

我一直在出错,所以我很确定我的某个地方有语法错误。awk的输出是否附加在-cipher之后?

使用awk中的
系统

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

你的命令有很多地方不对劲。对于要使用第一列的。这在awk中被称为$1,而不是$0(这将是整行)。其次,在命令定义的末尾忘记了分号

要实际运行该命令,您可以使用system()或管道(后者只有在命令可以从stdin读取时才有意义,我认为在您的情况下,openssl不会读取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
中的等效项要求从
date
命令的结果中生成一个变量,将其传递到
awk
,然后构造并执行该命令


xargs
命令还可以将多个参数累积到一行中,如果输入有多个列,或者将一条记录拆分为输入文件中的重复组,这将非常有用

有关使用它的所有方法的更多信息,请查看UNIX Mantra

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