У меня есть файл с разделенным каналом данных, я хочу получить grep текст между 2 раза. Ниже приведена структура файла
2017-04-23 06:43:00|1|2|3|4|5|TEST|
2017-04-23 06:43:01|1|2|3|4|5|TEST|
2017-04-23 06:43:02|1|2|3|4|5|A|
2017-04-23 06:44:00|1|2|3|4|5|TEST|
Теперь я хочу посчитать вхождение TEST между 06:43:00
и 06:44:00
. Я устал использовать grep
zgrep -a "06:43:00" filename.gz | grep "TEST" | wc -l
Но я не могу получить счет между 2 упомянутыми раза.
2 ответа
Используйте выражение grep (egrep) для grep для более чем одного шаблона
zegrep '06:43|06:44:00' filename.gz | grep TEST | wc -l
Или
zcat filename.gz | egrep '06:43|06:44:00' | grep TEST | wc -l
$ zcat file1.gz | egrep '06:43|06:44:00' | grep TEST
2017-04-23 06:43:00|1|2|3|4|5|TEST|
2017-04-23 06:43:01|1|2|3|4|5|TEST|
2017-04-23 06:44:00|1|2|3|4|5|TEST|
$ zcat file1.gz | egrep '06:43|06:44:00' | grep TEST | wc -l
3
Или очень хакерский
zcat file1.gz | perl -ne 'if(/06:43:00/){$p=1;}if($p){print $_;}if(/06:44:00/){$p=0;}' | grep TEST | wc -l 3
zcat filename.gz \
| awk '/06:43/,/06:44/ { print }' - \
| grep TEST | wc -l
В awk обычно используется /<pattern>/ { <action> }
, но также можно определить диапазон с двумя шаблонами, разделенными запятыми. /<start-pattern>/,/<end-pattern/ { <action> }
Новые вопросы
unix
Этот тег является ИСКЛЮЧИТЕЛЬНО для ПРОГРАММИРОВАНИЯ вопросов, непосредственно связанных с Unix; общие проблемы с программным обеспечением следует направлять на сайт Unix & Linux Stack Exchange или на Super User. Операционная система Unix - это ОС общего назначения, которая была разработана Bell Labs в конце 1960-х годов и сегодня существует в различных версиях.