使用awk的输出来运行命令

 刘诗宪668964 发布于 2023-02-12 18:41

我是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 个回答
  • system在awk中使用:

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

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

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

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

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

    安德烈亚斯

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

    2023-02-12 18:43 回答
  • xargs命令专门针对该用例.

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

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

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

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

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

    有关使用它的所有方法的更多信息,请查看UNIX Mantra 上的"xargs"All-IN-One教程指南.

    2023-02-12 18:44 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有