【问题标题】:Using awk print all lines after a regular expression and change output field separator使用 awk 打印正则表达式后的所有行并更改输出字段分隔符
【发布时间】:2014-03-12 21:35:30
【问题描述】:

我一直在使用 another stackoverflow post 中的“b”示例返回模式匹配后的所有行(空行 - $^),直到 EOF 才包括匹配。第一个示例是未过滤的输出供参考(包括“正在加载对...的支持”之后的空行),第二个示例是当前使用 awk 获取的输出。

[root@servername ~]# yum -C check-update 2>/dev/null
Loaded plugins: kabi, product-id, refresh-packagekit, security, subscription-manager
Loading support for Red Hat kernel ABI

kernel.x86_64                       2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-abi-whitelists.noarch        2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-devel.x86_64                 2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-doc.noarch                   2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-firmware.noarch              2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-headers.x86_64               2.6.32-431.5.1.el6        rhel-6-server-rpms

[root@servername ~]# yum -C check-update 2>/dev/null | awk 'f;/$^/{f=1}'
kernel.x86_64                       2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-abi-whitelists.noarch        2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-devel.x86_64                 2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-doc.noarch                   2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-firmware.noarch              2.6.32-431.5.1.el6        rhel-6-server-rpms
kernel-headers.x86_64               2.6.32-431.5.1.el6        rhel-6-server-rpms

我不知道如何更改 awk 命令以使用不同的输出字段分隔符“,”以 CSV 格式输出。我希望输出看起来像这样:

kernel.x86_64,2.6.32-431.5.1.el6,rhel-6-server-rpms
kernel-abi-whitelists.noarch,2.6.32-431.5.1.el6,rhel-6-server-rpms
kernel-devel.x86_64,2.6.32-431.5.1.el6,rhel-6-server-rpms
kernel-doc.noarch,2.6.32-431.5.1.el6,rhel-6-server-rpms
kernel-firmware.noarch,2.6.32-431.5.1.el6,rhel-6-server-rpms
kernel-headers.x86_64,2.6.32-431.5.1.el6,rhel-6-server-rpms

编辑: 试图将其保持在 awk 中并作为单行。我可以直接输入awk '{OFS=","} $2 = $2'

【问题讨论】:

    标签: regex awk pattern-matching


    【解决方案1】:
    sed 's/\t+/,/g' output > output2
    

    “sed”是一个查找和替换正则表达式的命令,例如带逗号的制表符。如果您想了解更多 sed 可以做的事情,请在命令行中输入“man sed”。

    完整的命令如下:

    yum -C check-update 2>/dev/null | awk 'f;/$^/{f=1}' | sed 's/\t+/,/g'
    

    【讨论】:

      【解决方案2】:

      您可以通过设置OFS 来更改输出字段分隔符。要触发重新格式化输出,您必须分配给其中一个字段或$0;如果您不修改任何内容,则习惯用法是将行分配给自身:

      awk -v OFS=, 'f { $0 = $0; print; }
                    /^$/ { f = 1 }'
      

      【讨论】:

        【解决方案3】:

        将现有命令修改为 -

        yum -C check-update 2>/dev/null | awk '{$1=$1}f;/$^/{f=1}' OFS=','
        
        • {$1=$1} 这只是一个 awk 习惯用法,它强制 awk 重新计算 $1 的值
        • OFS 将输出字段分隔符设置为 ,

        【讨论】:

        • 我可以发誓我试着把它放在f; 前面,但似乎我错过了。现在使用yum -C check-update 2>/dev/null | awk '{OFS=","} {$1=$1}f;/$^/{f=1}'。谢谢!
        • $1=$1 重新计算整行$0,而不仅仅是第一个字段$1
        【解决方案4】:

        如果 yum 输出保持相同的格式,这个脚本会更直接。

        yum -C check-update 2>/dev/null | awk 'NR>3{$1=$1;print}' OFS=, 
        

        【讨论】:

          猜你喜欢
          • 2015-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-25
          • 1970-01-01
          • 1970-01-01
          • 2013-09-27
          • 1970-01-01
          相关资源
          最近更新 更多