以下gawk命令仅打印第一个匹配项,而我需要输入文件中的所有匹配项。
$ gawk 'BEGIN{RS="{Mon,Tue} Mar {21,22} [0-9]{2}:[0-9]{2}:[0-9]{2} 2016";FS ="\n";OFS="\n"} {print savedRT, $1, $2, $3, $4} {savedRT = RT}' iostat.20160321
Mon Mar 21 20:05:00 2016
cpu
us sy wt id
4 2 0 94
这是输入数据格式的模板:
Mon Mar 21 20:05:00 2016
cpu
us sy wt id
4 2 0 94
...
...
...
Mon Mar 21 20:10:00 2016
cpu
us sy wt id
3 2 0 94
...
...
...
gawk是否有全局标志?我想念什么?
您可以按以下方式解决此问题(需要GNU awk 1):
$ awk 'BEGIN {
RS = "(Mon|Tue) Mar (21|22) [0-9]{2}:[0-9]{2}:[0-9]{2} 2016"
FS = OFS = "\n"
}
NR > 1 { print savedRT $1, $2, $3, $4 }
{ savedRT = RT }' infile
Mon Mar 21 20:05:00 2016
cpu
us sy wt id
4 2 0 94
Mon Mar 21 20:10:00 2016
cpu
us sy wt id
3 2 0 94
需要进行以下更改:
{Mon,Tue}
和{21,22}
,在记录分离到(Mon|Tue)
和(21|22)
适当交替的正则表达式NR
大于1,则仅开始打印;否则,仅开始打印。该文件以记录分隔符开头,因此第一条记录为空,我们不想打印一堆空行。savedRT
包含一个换行符,因此如果我们像打印一个换行符一样,那么print savedRT, $1
换行符会太多。更改为print savedRT $1
会删除该多余的换行符。1确切地说,是GNU awk 4.0.0或更高版本,因为[0-9]{2}
较早的gawks无法识别间隔表达式,请参见发行说明。一种解决方法是仅使用[0-9][0-9]
替代方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句