使用awk打印正则表达式后的所有行并更改输出字段分隔符

时间:2014-02-13 19:35:09

标签: regex awk pattern-matching

我一直在使用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'

4 个答案:

答案 0 :(得分:1)

将现有命令修改为 -

yum -C check-update 2>/dev/null | awk '{$1=$1}f;/$^/{f=1}' OFS=','
  • {$1=$1}这只是一个迫使awk重新计算的成语 价值$1
  • OFS会将输出字段分隔符设置为,

答案 1 :(得分:0)

sed 's/\t+/,/g' output > output2

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

完整命令如下:

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

答案 2 :(得分:0)

您可以通过设置OFS来更改输出字段分隔符。要触发要重新格式化的输出,您必须分配给其中一个字段或$0;如果你没有修改任何东西,那么成语就是将这条线分配给它自己:

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

答案 3 :(得分:0)

如果yum输出保持相同格式,则此脚本将更直接。

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