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

Regex 使用awk打印正则表达式后的所有行,并更改输出字段分隔符,regex,awk,pattern-matching,Regex,Awk,Pattern Matching,我一直在使用中的“b”示例返回模式匹配(空行-$^)后的所有行,直到EOF才包括匹配。第一个示例是用于引用的未过滤输出(包括“Loading support for…”之后的空行),第二个示例是当前使用awk获得的输出 [root@servername ~]# yum -C check-update 2>/dev/null Loaded plugins: kabi, product-id, refresh-packagekit, security, subscription-manager

我一直在使用中的“b”示例返回模式匹配(空行-$^)后的所有行,直到EOF才包括匹配。第一个示例是用于引用的未过滤输出(包括“Loading support for…”之后的空行),第二个示例是当前使用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'

sed 's/\t+/,/g' output > output2
“sed”是一个查找和替换正则表达式的命令,例如用逗号替换制表符。如果您想了解sed可以做的更多事情,请在命令行中键入“mansed”

完整命令如下所示:

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

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

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

将现有命令修改为-

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

如果yum-output保持相同的格式,则此脚本将更直接

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

我可以发誓我试着把它放在
f但是我好像错过了。使用
yum-C check update 2>/dev/null | awk'{OFS=“,”}{$1=$1}f/$^/{f=1}'
现在。谢谢
$1=$1
重新计算整行
$0
,而不仅仅是第一个字段
$1