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
小的状态机:
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
刚编辑我的问题,你能不能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是单独位于一行,定制适当。
请解释逻辑 – Sadhun
状态= 0表示第一个事件(日期和时间行)尚未命中。当该行被命中时,State = 1被设置,并且是匹配abc行时唯一的状态。当发生第二个日期和时间事件时,状态设置为2,abc行不再计数。结束子句打印结果。单线sed解决方案是我的最爱,只要您的输入保持简单。 – Rumbleweed
感谢您的回答 – 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
我想在'日期和时间:2016-01-23 02:00:00'和'日期和时间:2016-01-24 03:00:00'之间wc -l ie)我需要把确切的案例放在grep -oz'my精确模式的位置“。我试过但没有工作 – Sukan
@Sukan嗯,是的,因为你现在改变了这个问题。 –
@Benjawin你可以请你调整你的答案,然后谢谢 – Sukan