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