Вывести общий счетчик для совпадающего шаблона

journalctl - листовые сапоги | голова -1 | вырезать -d '' -f 3

1
20.03.2018, 14:44
2 ответа

Идея правильная, но правильный синтаксис для этого в awkможно было бы использовать для

$apiCall | awk '$1=="xx"{ count++ }END{ print count }'

Поскольку awkоснован на pattern { action }, как только мы сопоставляем шаблон xxв первом столбце, мы выполняем часть действия, увеличивая счетчик при каждом появлении, и когда мы заканчиваем обработку файла, в END, мы распечатываем окончательный счет. Re -направляет вывод в файл в конце с помощью > fileпо мере необходимости.

2
28.04.2021, 23:49

Вы можете обнаружить, что:

LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)'

значительно быстрее, так как позволяет избежать накладных расходов, связанных с интерпретацией языка более высокого уровня awk.

Мы используем LC_ALL=Cдля упрощения интерпретации текста. Это также означает, что только SPC и TAB понимаются как разделители, но это касается и многих awkреализаций, независимо от локали.

Некоторые тайминги многоядерной системы GNU/Linux amd64 -изzsh:

$ (repeat 3000 printf '%s\n' {{,xx}{1..1000},xx}" blah blah blah")> a
$ wc a
  6003000  24012000 119412000 a
$ time LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a
3000
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a  0.15s user 0.03s system 99% cpu 0.175 total
$ time gawk '$1=="xx"{n++};END{print n}' < a
3000
gawk '$1=="xx"{n++};END{print n}' < a  2.00s user 0.05s system 99% cpu 2.055 total
$ time LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a
3000
LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a  1.96s user 0.03s system 99% cpu 1.985 total
$ time mawk '$1=="xx"{n++};END{print n}' < a
3000
mawk '$1=="xx"{n++};END{print n}' < a  1.23s user 0.04s system 99% cpu 1.277 total
$ time gawk '$1=="xx"' < a | wc -l
3000
gawk '$1=="xx"' < a  1.91s user 0.05s system 99% cpu 1.967 total
wc -l  0.00s user 0.00s system 0% cpu 1.967 total
3
28.04.2021, 23:49

Теги

Похожие вопросы