Bash 文件中两个模式之间的Grep

Bash 文件中两个模式之间的Grep,bash,awk,grep,Bash,Awk,Grep,范例 我想计算两种模式之间的abc总数(比如2016-01-23和01-24),然后(比如2016-01-24到2016-01-26)。一个小状态机: Date & Time : 2016-01-23 02:00:00 abc abc abc Date & Time : 2016-01-24 03:00:00 abc abc abc abc Date & Time : 2016-01-25 05:00:00 在两个特定日期之间 awk '/Date & Tim

范例


我想计算两种模式之间的abc总数(比如2016-01-23和01-24),然后(比如2016-01-24到2016-01-26)。

一个小状态机:

Date & Time : 2016-01-23 02:00:00
abc
abc
abc
Date & Time : 2016-01-24 03:00:00
abc
abc
abc
abc
Date & Time : 2016-01-25 05:00:00

在两个特定日期之间

awk '/Date & Time/ {if (n) print n; n=0; next} {n++}' file

一个小型状态机:

Date & Time : 2016-01-23 02:00:00
abc
abc
abc
Date & Time : 2016-01-24 03:00:00
abc
abc
abc
abc
Date & Time : 2016-01-25 05:00:00

在两个特定日期之间

awk '/Date & Time/ {if (n) print n; n=0; next} {n++}' file

有很多方法可以做到这一点。下面是一个使用简单状态的awk示例,该状态指示何时找到匹配条件(状态=1)


希望这能有所帮助。我假设您的abc是单独在线的,请根据需要进行自定义。

有很多方法可以做到这一点。下面是一个使用简单状态的awk示例,该状态指示何时找到匹配条件(状态=1)

BEGIN { state = 0; count = 0; }
/^Date \& Time : 2016-01-23 02:00:00$/ { state = 1; next; }
/^Date \& Time : 2016-01-24 03:00:00$/ {state = 2; next; }
/^abc$/ { if (state == 1) count++; }
END { print "Found abc " count " times."
希望这能有所帮助。我假设您的abc是单独在线的,请根据需要定制

BEGIN { state = 0; count = 0; }
/^Date \& Time : 2016-01-23 02:00:00$/ { state = 1; next; }
/^Date \& Time : 2016-01-24 03:00:00$/ {state = 2; next; }
/^abc$/ { if (state == 1) count++; }
END { print "Found abc " count " times."
将文件视为二进制文件以忽略换行符(
-z
),只保留匹配的(
-o
),然后匹配所有出现的
abc
,并对它们进行计数(
wc-l

以稍微好一点的脚本格式:

$ grep -zo 'Date & Time : 2016-01-23 02:00:00.*Date & Time : 2016-01-24 03:00:00' infile |
> grep -zo 'abc' | wc -l
3
$ grep -zo 'Date & Time : 2016-01-24 03:00:00.*Date & Time : 2016-01-25 05:00:00' infile |
> grep -zo 'abc' | wc -l
4
使用sed的解决方案(与上面使用的模式变量相同):

这假设每行的abc
abc
。如果有:

$ sed -n "/$pattern1/,/$pattern2/{/abc/p}" infile | wc -l
3
将文件视为二进制文件以忽略换行符(
-z
),只保留匹配的(
-o
),然后匹配所有出现的
abc
,并对它们进行计数(
wc-l

以稍微好一点的脚本格式:

$ grep -zo 'Date & Time : 2016-01-23 02:00:00.*Date & Time : 2016-01-24 03:00:00' infile |
> grep -zo 'abc' | wc -l
3
$ grep -zo 'Date & Time : 2016-01-24 03:00:00.*Date & Time : 2016-01-25 05:00:00' infile |
> grep -zo 'abc' | wc -l
4
使用sed的解决方案(与上面使用的模式变量相同):

这假设每行的abc
abc
。如果有:

$ sed -n "/$pattern1/,/$pattern2/{/abc/p}" infile | wc -l
3

当然,Perl可以做到这一点

鉴于:

sed -n "/$pattern1/,/$pattern2/p" infile | grep -o 'abc' | wc -l
在Perl中:

$ echo "$tgt" 
Date & Time : 2016-01-23 02:00:00
abc
abc
abc
Date & Time : 2016-01-24 03:00:00
abc
abc
abc
abc
Date & Time : 2016-01-25 05:00:00

当然,Perl可以做到这一点

鉴于:

sed -n "/$pattern1/,/$pattern2/p" infile | grep -o 'abc' | wc -l
在Perl中:

$ echo "$tgt" 
Date & Time : 2016-01-23 02:00:00
abc
abc
abc
Date & Time : 2016-01-24 03:00:00
abc
abc
abc
abc
Date & Time : 2016-01-25 05:00:00


刚刚编辑了我的问题,你能修改一下答案吗?刚刚编辑了我的问题,你能修改一下答案吗?我想在“日期和时间:2016-01-23 02:00:00”和“日期和时间:2016-01-24 03:00:00”之间切换到wc-l,即)我需要将确切的案例放在grep-oz“我的确切模式”的位置。我试过了,但没有working@Sukan嗯,是的,因为你现在改变了问题。@Benjawin你能调整一下你的答案吗Thanks@Sukan我会的。如果这个问题第一次能反映出你真正想要的,那就太棒了。谢谢你的回答,但它不起作用,我的o/p是0,我试过这个,grep-zo“日期和时间:2016-01-23 02:00:00.*日期和时间:2016-01-24 03:00:00”infle | grep-zo“abc”| wc-lI想在“日期和时间:2016-01-23 02:00:00”和“日期和时间:2016-01-24 03:00:00”之间wc-l(即)我需要将确切的案例放在grep-oz“我的确切模式”的位置。我试过了,但没有working@Sukan嗯,是的,因为你现在改变了问题。@Benjawin你能调整一下你的答案吗Thanks@Sukan我会的。如果这个问题第一次能反映出你真正想要的,那就太棒了。谢谢你的回答,但它不起作用,我的o/p是0,我试过这个,grep-zo“日期和时间:2016-01-23 02:00:00.*日期和时间:2016-01-24 03:00:00”infle | grep-zo“abc”| wc-l请解释logicState=0表示第一个事件(日期和时间线)尚未命中。State=1在命中该行时设置,并且是统计匹配abc行时的唯一状态。当第二个日期和时间事件发生时,状态设置为2,abc行不再计数。end子句打印结果。如果您的输入保持简单,我最喜欢单线sed解决方案。感谢您的回答。请解释logicState=0表示第一个事件(日期和时间线)尚未命中。State=1在命中该行时设置,并且是统计匹配abc行时的唯一状态。当第二个日期和时间事件发生时,状态设置为2,abc行不再计数。end子句打印结果。如果您的输入保持简单,我最喜欢单线sed解决方案。谢谢您的回答