Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 从文本文件以范围模式打印行_Regex_Perl_Sed_Awk_Pattern Matching - Fatal编程技术网

Regex 从文本文件以范围模式打印行

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

我有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     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