grep的两者之间

问题描述:

grep的两者之间

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年1月23日和01-24)之间,然后ABC的总数(比如2016年1月24日到2016-01-26)。

$ 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 

将这个文件看作二进制忽略换行符(-z),并只保留匹配什么(-o),然后匹配的abc所有出现并计数(wc -l)。

在稍好的脚本化格式:

$ pattern1='Date & Time : 2016-01-23 02:00:00' 
$ pattern2='Date & Time : 2016-01-24 03:00:00' 
$ grep -zo "$pattern1"'.*'"$pattern2" infile | grep -zo 'abc' | wc -l 
3 

使用SED溶液(相同图案的变量如以上所使用):

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

这假定有从未超过一个abc每行。如果有:

sed -n "/$pattern1/,/$pattern2/p" infile | grep -o 'abc' | wc -l 
+0

我想在'日期和时间:2016-01-23 02:00:00'和'日期和时间:2016-01-24 03:00:00'之间wc -l ie)我需要把确切的案例放在grep -oz'my精确模式的位置“。我试过但没有工作 – Sukan

+0

@Sukan嗯,是的,因为你现在改变了这个问题。 –

+0

@Benjawin你可以请你调整你的答案,然后谢谢 – Sukan

小的状态机:

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

2个特定日期

awk -v d1="2016-01-24" -v d2="2016-01-26" ' 
    /Date & Time/ {if ($5 >= d1) counting = 1; else if ($5 >= d2) exit; next} 
    counting {count++} 
    END {print count} 
' file 
+0

刚编辑我的问题,你能不能tweat答案满足这种。 – Sukan

还有一堆的方式来做到这一点之间。下面是使用一个简单的状态下,当匹配条件被发现指示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." 

希望这helps.I已经假设你的ABC是单独位于一行,定制适当。

+0

请解释逻辑 – Sadhun

+1

状态= 0表示第一个事件(日期和时间行)尚未命中。当该行被命中时,State = 1被设置,并且是匹配abc行时唯一的状态。当发生第二个日期和时间事件时,状态设置为2,abc行不再计数。结束子句打印结果。单线sed解决方案是我的最爱,只要您的输入保持简单。 – Rumbleweed

+0

感谢您的回答 – Sadhun

当然,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:

$ echo "$tgt" | perl -0777 -lne 'while(/(^Date & Time :[\d\-: ]+)\s+(\S.*?)(?=^Date & Time :[\d\-: ]+)/gsm){$x=$2=~tr/\n//; print "$1 $x lines\n"}' 
Date & Time : 2016-01-23 02:00:00 3 lines 
Date & Time : 2016-01-24 03:00:00 4 lines