Linux grep количество совпадений

Count all occurrences of a string in lots of files with grep

Can you tell me what the grep -v :0 does ? . I know it counts for files having occurrences greater than 0. What does the -v option and :0 mean ?. Kindly let me know.

@GauthamHonnavara grep :0 looks for line that match the string :0. -v is an option to invert that search so instead using grep -v :0 means find all line that don’t contain :0 so a line with file4:5 and file27:193 all would pass through since they don’t contain :0

16 Answers 16

This works for multiple occurrences per line:

This one shows the relevant files and then the total count of matches: grep -rc test . | awk -F: ‘$NF > 0 END’

This has the same limitation that it counts multiple occurrences on one line only once. I am guessing that this behavior is OK in this case, though.

This doesn’t work if you want to search in subdirectories too, whereas grep -o and wc -l does. cat is quicker in cases like the original question though.

will count multiple occurrences in a line

Instead of using -c, just pipe it to wc -l.

This will list each occurrence on a single line and then count the number of lines.

This will miss instances where the string occurs 2+ times on one line, though.

Piping to «wc -l» works also nicely together with «grep -r ‘test’ .» which scans recursively all files for the string ‘test’ in all directories below the current one.

One of the rare useful applications of cat .

You can add -R to search recursively (and avoid to use cat) and -I to ignore binary files.

grep -c string * | awk 'BEGINEND' 

Take care if your file names include «:» though.

Something different than all the previous answers:

If you want number of occurrences per file (example for string «tcp»):

grep -RIci "tcp" . | awk -v FS=":" -v OFS="\t" '$2>0 < print $2, $1 >' | sort -hr 
53 ./HTTPClient/src/HTTPClient.cpp 21 ./WiFi/src/WiFiSTA.cpp 19 ./WiFi/src/ETH.cpp 13 ./WiFi/src/WiFiAP.cpp 4 ./WiFi/src/WiFiClient.cpp 4 ./HTTPClient/src/HTTPClient.h 3 ./WiFi/src/WiFiGeneric.cpp 2 ./WiFi/examples/WiFiClientBasic/WiFiClientBasic.ino 2 ./WiFiClientSecure/src/ssl_client.cpp 1 ./WiFi/src/WiFiServer.cpp 
  • grep -RIci NEEDLE . — looks for string NEEDLE recursively from current directory (following symlinks), ignoring binaries, counting number of occurrences, ignoring case
  • awk . — this command ignores files with zero occurrences and formats lines
  • sort -hr — sorts lines in reverse order by numbers in first column
Читайте также:  Тренажер командной строки linux

Of course, it works with other grep commands with option -c (count) as well. For example:

grep -c "tcp" *.txt | awk -v FS=":" -v OFS="\t" '$2>0 < print $2, $1 >' | sort -hr 

The AWK solution which also handles file names including colons:

grep -c string * | sed -r 's/^.*://' | awk 'BEGIN<>END' 

Keep in mind that this method still does not find multiple occurrences of string on the same line.

You can use a simple grep to capture the number of occurrences effectively. I will use the -i option to make sure STRING/StrING/string get captured properly.

Command line that gives the files’ name:

grep -oci string * | grep -v :0 

Command line that removes the file names and prints 0 if there is a file without occurrences:

Could you please elaborate more your answer adding a little more description about the solution you provide?

short recursive variant:

find . -type f -exec cat <> + | grep -c 'string' 

Grep only solution which I tested with grep for windows:

grep -ro "pattern to find in files" "Directory to recursively search" | grep -c "pattern to find in files" 

This solution will count all occurrences even if there are multiple on one line. -r recursively searches the directory, -o will «show only the part of a line matching PATTERN» — this is what splits up multiple occurences on a single line and makes grep print each match on a new line; then pipe those newline-separated-results back into grep with -c to count the number of occurrences using the same pattern.

Источник

16 полезных примеров grep

img

Изначально разработанный для Unix-систем grep, является одной из наиболее широко используемых утилит командной строки в среде Linux.

grep расшифровывается как «глобальный поиск строк, соответствующих регулярному выражению и их вывод» (globally search for a regular expression and print matching lines). grep в основном ищет на основе указанного посредством стандартного ввода или файла шаблона, или регулярного выражения и печатает строки, соответствующие заданным критериям. Часто используется для фильтрации ненужных деталей при печати только необходимой информации из больших файлов журнала.

Это возможно благодаря совместной работе регулярных выражений и поддерживаемых grep параметров.

Здесь мы рассмотрим некоторые из часто используемых сисадминами или разработчиками команд grep в различных сценариях.

Синтаксис grep

Команда grep принимает шаблон и необязательные аргументы вместе со перечислять файлов, если используется без трубопровода.

$ grep [options] pattern [files]

1. Поиск среди нескольких файлов

grep позволяет выполнять поиск заданного шаблона не только в одном, но и среди нескольких файлах. Для этого можно использовать подстановочный символ * .

$ sudo grep -i err /var/log/messages

$ sudo grep -i err /var/log/message

Как видно из вывода, утилита перед результатом искомого шаблона выводит также название файла, что позволяет определить где именно было найдено совпадение.

Читайте также:  Edit text files in linux

2. Регистронезависимый поиск

grep позволяет искать шаблон без учета регистра. Чтобы указать grep игнорировать регистр используется флаг –i .

$ grep -i [pattern] [file]

3. Поиск слова

Иногда появляется необходимость поиска не части, а целого слова. В таких случаях утилита запускается с флагом -w .

$ grep -w [pattern] [file]

4. Вывод количества совпадений

Не всегда нужно выводить результат совпадения. Иногда достаточно только количества совпадений с заданным шаблоном. Эту информацию мы можем получить с помощью параметра -c .

$ grep -c [pattern] [file]

5. Поиск в поддиректориях

Часто необходимо искать файлы не только в текущей директории, но и в подкаталогах. grep позволяет легко сделать это с флагом -r .

$ grep -r [pattern] *

6. Инверсивный поиск

Если вы хотите найти что-то, что не соответствует заданному шаблону, grep позволяет сделать только это с флагом -v .

$ grep -v [pattern] [file]

Можно сравнить выходные резултаты grep для одного и того же шаблона и файла с флагом -v и без него. С параметром -v выводятся любые строки, которые не соответствуют образцу.

7. Вывод нумерации строк

grep позволяет нумеровать совпавшие строки, что позволяет легко определить, где строка находится в файле. Чтобы получить номера строк в выходных данных. используйте параметр –n :

$ grep -n [pattern] [file]

8. Ограничение вывода

Результат вывода grep для файлов вроде журналов событий и т.д. может быть длинным, и вам может просто понадобиться фиксированное количество строк. Мы можем использовать -m [num] , чтобы ограничить выводимые строки.

Обратите внимание, как использование флага -m влияет на вывод grep для одного и того же набора условий в примере ниже:

$ grep -m[num] [pattern] [file]

9. Вывод дополнительных строк

Часто нам нужны не только строки, которые совпали с шаблоном, но некоторые строки выше или ниже их для понимания контекста.

С помощью флагов -A , -B или -C со значением num можно выводить строки выше или ниже (или и то, и другое) совпавшей строки. Здесь число обозначает количество дополнительных печатаемых строк, которое находится чуть выше или ниже соответствующей строки. Это применимо ко всем совпадениям, найденным grep в указанном файле или списке файлов.

$ grep -A[num] [pattern] [file] $ grep -B[num] [pattern] [file] $ grep -C[num] [pattern] [file]

Ниже показан обычный вывод grep, а также вывод с флагом -A , -B и -C один за другим. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующих выходных данных. С флагом -A1 grep печатает 1 строку, которая следует сразу после соответствующей строки.

Аналогично, с флагом -B1 он печатает 1 строку непосредственно перед соответствующей строкой. С флагом -C1 он печатает 1 строку, которая находится до и после соответствующей строки.

A1/B1/C1

10. Вывод списка файлов

Чтобы напечатать только имя файлов, в которых найден образец, а не сами совпадающие строки, используйте флаг -l .

Читайте также:  Test if linux is 64 bit

$ grep -l [pattern] [file]

11. Вывод абсолютных совпадений

Иногда нам нужно печатать строки, которые точно соответствуют заданному образцу, а не какой-то его части. Флаг -x grep позволяет делать именно это.

В приведенном ниже примере файл file.txt содержит строку только с одним словом «support», что соответствует требованию grep с флагом –x . При этом игнорируются строки, которые могут содержать слова «support» с сопутствующим текстом.

$ grep -x [pattern] [file]

12. Поиск совпадения в начале строки

С помощью регулярных выражений можно найти последовательность в начале строки. Вот как это сделать.

^

Обратите внимание, как с помощью символ каретки ^ изменяет выходные данные. Символ каретки указывает grep выводить результат, только если искомое слово находится в начале строки. Если в шаблоне есть пробелы, то можно заключить весь образец в кавычки.

13. Поиск совпадения в конце строки

Другим распространенным регулярным выражением является поиск шаблона в конце строки.

[string]$

В данном примере мы искали точку в конце строки. Поскольку точка . является значимым символом, нужно её экранировать, чтобы среда интерпретировала точку как команду. Обратите внимание, как изменяется вывод, когда мы просто ищем совпадения . и когда мы используем $ для указания grep искать только те строки, которые заканчиваются на . (не те, которые могут содержать его где-либо между ними).

14. Использования файла шаблонов

Могут возникнуть ситуации, когда у вас есть сложный список шаблонов, которые вы часто используете. Вместо записи его каждый раз можно указать список этих образцов в файле и использовать с флагом -f . Файл должен содержать по одному образцу на каждой строке.

$ grep -f [pattern_file] [file_to_match]

В нашем примере мы создали файла шаблона с названием pattern.txt со следующим содержимым:

pattern.txt

Для его использования используйте флаг -f .

-f

15. Поиск по нескольким шаблонам

grep позволяет задать несколько шаблонов с помощью флага -e .

$ grep -e [pattern1] -e [pattern2] -e [pattern3]. [file]

$ grep -e [pattern1] -e [pattern2] -e [pattern3]. [file]

16. Указание расширенных регулярных выражений

grep также поддерживает расширенные регулярные выражения (Extended Regular Expressions – ERE) или с использованием флага -E . Это похоже на команду egrep в Linux.

Использование ERE имеет преимущество, когда вы хотите рассматривать метасимволы как есть и не хотите экранировать их. При этом использование -E с grep эквивалентно команде egrep .

$ grep -E '[Extended RegEx]' [file]

Ниже приведён пример использование ERE, для вывода не пустых и не закомментированных строк. Это особенно полезно для поиска чего-то в больших конфигурационных файлах. Здесь дополнительно использован флаг –v , чтобы НЕ выводить строки, соответствующих шаблону ‘^ (# | $)’ .

$ grep -E

Заключение

Приведенные выше примеры являются лишь верхушкой айсберга. grep поддерживает ряд вариантов и может быть очень полезным инструментом в руке человека, который знает, как его эффективно использовать. Мы можем не только использовать приведенные выше примеры, но и комбинировать их различными способами, чтобы получить то, что нам нужно. Для получения дополнительной информации можно воспользоваться встроенной системой справки Linux – man .

Источник

Оцените статью
Adblock
detector