我是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后附加?
system
在awk中使用:
awk '{ system("openssl s_client -connect host:port -cipher " $1) }' ciphers.txt
你的命令有很多问题.对于想要使用第一列的人.这在awk中被称为$ 1而不是$ 0(这将是整行).其次,在命令定义的末尾忘记了分号.
要实际运行该命令,您可以使用system()或管道(后者只有在命令可以从stdin读取时才有意义,我认为在您的情况下不会打开openssl).最简单的就是这样的
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
当您已经有一个要使用的东西列表并且没有运行可以执行子shell的东西时,它会派上用场.例如,awk
可以在下面使用来执行mv
但xargs
更简单.
ls -1 *.txt | xargs -I{} mv "{}" "{}.$(date '+%y%m%d')"
上面的命令将当前目录中的每个文本文件重命名为带日期戳的备份.等效函数awk
需要从date
命令的结果中生成变量,将其传递给awk
,然后构造并执行命令.
该xargs
命令还可以将多个参数累积到一行上,如果输入有多列,或者在输入文件中将单个记录拆分为重复组,这将非常有用.
有关使用它的所有方法的更多信息,请查看UNIX Mantra 上的"xargs"All-IN-One教程指南.