使用awk的输出来运行命令

时间:2013-12-05 01:42:35

标签: linux bash shell awk

我是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后附加?

3 个答案:

答案 0 :(得分:65)

在awk中使用system

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

答案 1 :(得分:10)

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

要实际运行该命令,您可以使用system()或管道(后者只有在命令可以从stdin读取时才有意义,我认为在你的情况下openssl不会)。 最简单的就是

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

注意,这只会返回退出状态。如果需要捕获stdout,则必须通过getline管道命令。

安德烈亚斯

PS:发布你得到的实际错误会有所帮助。

答案 2 :(得分:9)

xargs命令专门用于该用例。

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

对于示例案例,此版本稍长一些,因为awk已用于解析$0。但是,当您已经有一个要使用的事物列表并且没有运行可以执行子shell的东西时,xargs会派上用场。例如,下面可以使用awk来执行mv,但xargs更加简单。

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

上述命令将当前目录中的每个文本文件重命名为带日期戳的备份。 awk中的等效项要求从date命令的结果中生成变量,将其传递到awk,然后构造并执行命令。

xargs命令还可以将多个参数累积到一行中,如果输入有多个列,或者在输入文件中将单个记录拆分为重复组,则会很有用。

有关使用它的所有方法的更多信息,请查看UNIX Mantra上的"xargs" All-IN-One Tutorial Guide