Для вашей первой части достаточно fgrep -c "Summarized attacks: 4"
или fgrep -F "Summarized attacks: 4"
.
Если я понимаю вашу вторую часть, для каждого из этих блоков вы хотите сложить строки атаки и вывести общую сумму . Вы можете сделать это с помощью
gawk '/^Summarized attack: 4/ { on=1; next} /^ 4[0-9.]*/ { if (on) ++ids; next} /^ IDnum/ {next} /^ */ {next} { on=0} END {print ids;}'< master-listfile-condensed.txt
Первый оператор говорит, ищите (/.../
) для каждой строки, которая начинается с (^
) «Суммированная атака: 4», и, найдя ее, включите флаг «включено» и go до следующей строки. Второй оператор говорит, что если это запись атаки (т.е. начинается с 4
, за которым следует строка [*
] цифр), то проверьте флаг; если горит, посчитайте. По сути, мы хотим, чтобы флаг был включен, когда мы находимся в разделе записей об атаке на цель. Следующие два оператора говорят, что для каждой строки, начинающейся с «IDnum» или состоящей из пробелов (иногда вставляются пустые строки), go до следующей строки; это необходимо, чтобы противодействовать следующему оператору, в котором говорится, что если эта строка не соответствует ни одному из предыдущих операторов, выключите флаг «on». Это не позволяет нам считать атаки вне цели. Наконец, END
означает, что в конце выведите общую сумму. Я получаю 757
, что довольно далеко от вашего диапазона. Но я думаю, что это правильно.
Но гораздо проще, если предположить, что Summarized timestamp всегда повторяется в IDnum по крайней мере до первого значимого di git, было бы использовать
grep -Ec '^ 4' master-listfile-condensed.txt
Это означает, что посчитайте все строки, начинающиеся с пробела-4. В этом случае это дает нам правильный результат.