【问题标题】:Error "awk: too many output files 10" when splitting SSL certificates拆分 SSL 证书时出现错误“awk: too many output files 10”
【发布时间】:2017-07-25 23:10:17
【问题描述】:

我正在尝试使用 AWK 拆分包含多个 SSL 证书的文件,但显示错误消息: awk: 输出文件太多 10

我正在使用的命令如下:

cat ${SSL_CERTIFICATES_PATH} | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'

错误信息:

awk: too many output files 10
record number 735

你知道我该如何解决这个问题吗?

【问题讨论】:

    标签: bash unix ssl awk openssl


    【解决方案1】:

    你必须close()文件,

    awk '/BEGIN/ {f=i++".extracted.crt"}/BEGIN/,/END/{print > f;if(/END/)close(f)}'

    Ed Morton 建议的最佳解决方案,不应该使用范围表达式,更多细节Read Here

    awk '/BEGIN/{f=(++i)".extracted.crt"} f{print>f} /END/{close(f);f=""}' 
    

    这是样品(不是证书)

    输入

    $ cat file
    BEGIN
    1
    END
    
    BEGIN
    2
    END
    
    BEGIN
    3
    END
    

    执行

    $ awk '/BEGIN/{f=i++".extracted.crt"}/BEGIN/,/END/{print > f;if(/END/)close(f)}' file

    $ awk '/BEGIN/{f=(++i)".extracted.crt"} f{print>f} /END/{close(f);f=""}' file
    

    输出文件

    $ ls *.crt
    0.extracted.crt  1.extracted.crt  2.extracted.crt
    

    每个文件的内容

    $ for i in *.crt; do echo $i; cat $i; done
    0.extracted.crt
    BEGIN
    1
    END
    1.extracted.crt
    BEGIN
    2
    END
    2.extracted.crt
    BEGIN
    3
    END
    

    【讨论】:

    • 看起来不工作,正在显示awk: syntax error near line 1 awk: illegal statement near line 1
    • @JavierSalas 哪个版本的 awk 或者尝试awk '/BEGIN/ {f=sprintf("%d.extracted.crt",i++)}/BEGIN/,/END/{print > f;if(/END/)close(f)}'
    • @JavierSalas 该错误消息意味着您使用的是旧的、损坏的 awk(Solaris 上的 /bin/awk)。永远不要使用那个awk。如果您在 Solaris 上,则使用/安装 gawk,如果由于某种原因无法安装,请改用 /usr/xpg4/bin/awk。
    • 但是 nawk 的功能比 /usr/xpg4/bin/awk 少,并且离 POSIX 兼容更远,因此恕我直言,因为 xpg4 可用并且优于 nawk。
    • @EdMorton 我按照你的建议做了;
    【解决方案2】:

    每次变量 i 的值增加 1 时,我们都必须关闭文件,因此请尝试关注并告诉我这是否对您有帮助。

    awk '/BEGIN/ {close(i".extracted.crt");i++} /BEGIN/, /END/ { print > i".extracted.crt" }' ${SSL_CERTIFICATES_PATH}
    

    编辑: Xavier,我已经与一位与他一起使用 SUN 5 的朋友进行了检查,并且以下操作运行良好,没有任何错误。您可以根据需要放置变量。

    /usr/xpg4/bin/awk '/BEGIN/ {close(i".extracted.crt");i++} /BEGIN/, /END/ { print > i".extracted.crt" }' *.crt
    

    【讨论】:

    • 我刚刚尝试了您给我的命令,但仍然显示相同的消息...
    • 现在试试编辑过的,如果这对你有帮助,请告诉我。我相信它应该可以工作,因为我改变了 close 的位置,现在我变了。
    • 输出重定向右侧未加括号的表达式是未定义的行为,因此您的 awk 可能将 print > i".extracted.crt" 解释为 (print > i)".extracted.crt"(无论这意味着什么!)而不是可能的预期 print > (i".extracted.crt")。始终为输出重定向右侧的任何表达式加上括号。
    • @JavierSalas 我告诉你提前 3 小时更改为 /usr/xpg4/bin/awk....
    • 这不是解决方案,这是Akshay's solution 下的第二条评论。不客气。
    猜你喜欢
    • 2022-10-14
    • 2015-07-24
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2020-09-27
    • 2021-09-13
    • 2023-04-11
    • 2018-03-22
    相关资源
    最近更新 更多