Восьмая часть перевода статьи «Learn 10 good UNIX usage habits» от IBM. В этой части рассмотрим возможности утилиты grep
.
8. Знайте, когда grep
может считать, а когда это стоит оставить другим.
Избегайте комбинирования grep
и wc -l
для подсчёта строк вывода. У команды grep
есть ключ -c
специально для этого. В большинстве случаев он быстрее, чем передавать вывод дальше, а считать утилитой wc
:
~ $ time grep and tmp/a/longfile.txt | wc -l 2811 real 0m0.097s user 0m0.006s sys 0m0.032s
~ $ time grep -c and tmp/a/longfile.txt 2811 real 0m0.013s user 0m0.006s sys 0m0.005s
Плюсом к скорости ключ -c
ещё и зачастую удобнее. При работе со списком файлов grep -c
выводит количество вхождений строки поиска по каждому файлу. В то время, как wc
даст только общее количество.
Однако, этот пример демонстрирует ещё одну распространённую ошибку. Такой способ подсчёта даёт лишь количество строк, в которых находится искомая подстрока. И если вам это и нужно, то это хорошо. Если же вам нужно найти количество вхождений искомой подстроки — возможны ошибки, ведь искомая строка может встречаться несколько раз в одной и той же строке…
Пример:
And if you save yourself
You will make him happy
He’ll keep you in a jar
And you’ll think you’re happy
He’ll give you breathing holes
And you’ll think you’re happy
He’ll cover you with grass
And you’ll think you’re happy now
Здесь «you» встречается 12 раз. Но оба вышеприведённых варианта выведут 8 — в восьми строках она встречается (стоит добавить ключ -i
для игнорирования регистра букв).
Чтобы избежать этой ошибки, используйте ключ -o
— на каждое вхождение искомой подстроки она будет выведена.
$ grep -oi you <<SONG And if you save yourself You will make him happy He'll keep you in a jar And you'll think you're happy He'll give you breathing holes And you'll think you're happy He'll cover you with grass And you'll think you're happy now SONG you you You you you you you you you you you you
Да, мы добавили ещё ключ -i
для игнорирования регистра.
Но с ключом -o не работает ключ -c. Так что в этом случае нам всё же стоит посчитать результат с помощью wc -l
~ $ grep -o and tmp/a/longfile.txt | wc -l 3402