Regex 从文本文件以范围模式打印行
我有log.txt文件:Regex 从文本文件以范围模式打印行,regex,perl,sed,awk,pattern-matching,Regex,Perl,Sed,Awk,Pattern Matching,我有log.txt文件: ====================== Tue Jun 25 00:02:00 WIT 2013 ====================== pool INFO name work INFO threads.total 30 INFO threads.active 7 INFO threads.waiting 23 INFO j
======================
Tue Jun 25 00:02:00 WIT 2013
======================
pool
INFO name work
INFO threads.total 30
INFO threads.active 7
INFO threads.waiting 23
INFO jobs.queue.latency 0
INFO jobs.run.latency 139
INFO jobs.queue.tps 3
INFO jobs.start.tps 3
INFO jobs.finish.tps 3
NORMAL jobs.count 0
pool
INFO name recv
INFO threads.total 40
INFO threads.active 27
INFO threads.waiting 13
INFO jobs.queue.latency 0
INFO jobs.run.latency 0
INFO jobs.queue.tps 0
INFO jobs.start.tps 0
INFO jobs.finish.tps 0
NORMAL jobs.count 0
pool
INFO name send
INFO threads.total 10
INFO threads.active 0
INFO threads.waiting 10
INFO jobs.queue.latency 0
INFO jobs.run.latency 1
INFO jobs.queue.tps 5
INFO jobs.start.tps 5
INFO jobs.finish.tps 5
NORMAL jobs.count 0
======================
Tue Jun 25 00:03:00 WIT 2013
======================
pool
INFO name work
INFO threads.total 30
INFO threads.active 15
INFO threads.waiting 15
INFO jobs.queue.latency 0
INFO jobs.run.latency 13
INFO jobs.queue.tps 1
INFO jobs.start.tps 0
INFO jobs.finish.tps 0
NORMAL jobs.count 46
INFO jobs.1.type request
pool
INFO name recv
INFO threads.total 40
INFO threads.active 27
INFO threads.waiting 13
INFO jobs.queue.latency 0
INFO jobs.run.latency 0
INFO jobs.queue.tps 0
INFO jobs.start.tps 0
INFO jobs.finish.tps 0
NORMAL jobs.count 0
pool
INFO name send
INFO threads.total 10
INFO threads.active 0
INFO threads.waiting 10
INFO jobs.queue.latency 0
INFO jobs.run.latency 0
INFO jobs.queue.tps 0
INFO jobs.start.tps 0
INFO jobs.finish.tps 0
NORMAL jobs.count 0
我想要这样的结果:
我已经使用:
cat log.txt |grep -B14 -A1 -i 'jobs.count [1-9]\{2,\}' |
egrep -i "jobs.1.type|=|WIT|jobs.count [1-9]"
如果名称不是“work”而是“send”或“recv”,那么“grep-B14”将无法获取日期。
还有其他解决办法吗?另一方面,我希望grep if“jobs.count”不是“0”,而不是get date=“Tue Jun 25 00:03:00 WIT 2013”,get name=“INFO name work”和get jobs type“INFO jobs.1.type request”:GNU代码:
/WIT | INFO+name | jobs.1.键入| jobs.count+[1-9]/{
如果($0~/WIT/)
{cheader=$0}
如果($0~/INFO+name/)
{cname=$0}
如果($0~/jobs.count+[1-9]/)
{ccount=$0}
如果($0~/jobs.1.type/)
{
我++
标题[i]=cheader
名称[i]=cname
count[i]=ccount
类型[i]=$0
}
}
结束{
line=“===========================================”
对于(a=1;aGNU代码:
/WIT | INFO+name | jobs.1.键入| jobs.count+[1-9]/{
如果($0~/WIT/)
{cheader=$0}
如果($0~/INFO+name/)
{cname=$0}
如果($0~/jobs.count+[1-9]/)
{ccount=$0}
如果($0~/jobs.1.type/)
{
我++
标题[i]=cheader
名称[i]=cname
count[i]=ccount
类型[i]=$0
}
}
结束{
line=“===========================================”
对于(a=1;a)
第一个awk打印包含日期和所需字段的段落。
第二个awk读取段落并仅打印计数>0的段落
第一个awk打印包含日期和所需字段的段落。
第二个awk阅读段落,只打印计数大于0的段落。欢迎使用Stack Overflow。请尽快阅读。我已尝试将您的问题的格式设置得更清楚,但我完全不确定它是否正确。我也不清楚您在问什么。要将代码和日志文件等显示为等宽字体,请选择代码,然后选择我们e编辑框上方的{}
按钮。这将代码统一缩进4个空格,产生恒定宽度的布局。破折号和等号行在第1列中产生格式效果。是的,这是我的问题。感谢您编辑。如果计数是10的偶数倍,您的正则表达式将无法匹配。您可能需要[1-9][0-9]*
,或者干脆[0-9]+
如果零也是一个有效的结果。欢迎使用堆栈溢出。请尽快阅读。我试图更清楚地格式化您的问题,但我不确定它是否正确。我也不清楚您在问什么。要将代码和日志文件等显示为等宽字体,请选择代码,然后使用{}编辑框上方的
按钮。这将代码统一缩进4个空格,产生恒定宽度的布局。破折号和等号行在第1列中产生格式效果。是的,这是我的问题。感谢您编辑计数为10的偶数倍时,您的正则表达式将无法匹配。您可能需要[1-9][0-9]*
相反,或者如果零也是一个有效的结果,那么只需[0-9]+
就可以了。如果标题下有多个池
和作业。计数>0
?因为你只会用新标题增加i
。@Qben是的,你是对的,谢谢。来源是“笨拙的”,我将计数器放置在作业中。1.键入。但这可能不够,每个字段可能都需要一个计数器。计数器数组的类型为。您好@Qben,谢谢您的完美工作。我只需将“if($0~/jobs.count+[1-9]/)”编辑为“if($0~/jobs.count+[1-9][0-9][0-9]/”,所以只打印3位jobscount 100)如果在标题下有多个池
,并且有jobs.count>0
,这真的有效吗?因为你只会在新标题下增加i
。@Qben是的,你是对的,谢谢。来源是“笨拙的”,我将计数器放置在作业中。1.键入。但这可能不够,每个字段可能都需要一个计数器。计数器数组的类型为。您好@Qben,谢谢您的完美工作。我只需将“if($0~/jobs.count+[1-9]/)”编辑为“if($0~/jobs.count+[1-9][0-9][0-9]/”,所以只打印3位jobscount 100)\n......................................................................................................................................................非常不是零。我正在检查最后一个字段(即“请求”)是否>0
cat log.txt |grep -B14 -A1 -i 'jobs.count [1-9]\{2,\}' |
egrep -i "jobs.1.type|=|WIT|jobs.count [1-9]"
/WIT|INFO +name|jobs.1.type|jobs.count +[1-9]/{
if ($0 ~ /WIT/)
{cheader=$0}
if ($0 ~ /INFO +name/)
{cname=$0}
if ($0 ~ /jobs.count +[1-9]/)
{ccount=$0}
if ($0 ~ /jobs.1.type/)
{
i++
header[i]=cheader
name[i]=cname
count[i]=ccount
type[i]=$0
}
}
END {
line="======================"
for (a=1 ;a<=i ;a++)
{
if (count[a] != "")
{
print line
print header[a]
print line
print name[a]
print count[a]
print type[a]
}
}
}
$awk -f c.awk file
======================
Tue Jun 25 00:03:00 WIT 2013
======================
INFO name work
NORMAL jobs.count 46
INFO jobs.1.type request
awk '/WIT/ {date=$0} /name/ {printf "\n%s\n%s\n", date, $0} /count|type/' file |
awk -v RS="" '{for (i=1; i<=NF; i++) if ($i~/count/ && $(i+1)>0) {print; break}}'
Tue Jun 25 00:03:00 WIT 2013
INFO name work
NORMAL jobs.count 46
INFO jobs.1.type request