Grep linux примеры несколько условий

Grep: how to add an «OR» condition? [duplicate]

How can I introduce a conditional OR into grep? Something like, grepping a file’s type for (JPEG OR JPG), and then sending only those files into the photos folder. For example. I know how to send the file where I want it, and get the file type, I just need some help with the grep part. I’m on OS X, which IMO seems to have modified/customized *nix utilities than what I’m used to in a *nix environment. So hopefully the answers can be as generic/portable as possible.

One might argue that OSX has the more *nix binaries since it is mostly BSD based. I suspect you are far more used the gnu tools.

@Zoredache Uhh .. sure! What you said! I am most familiar with Debian, though I have dabbled with Slackware, CentOS, Gentoo, Ubuntu, and a few others. Debian is my favourite, I almost can’t stand Gentoo and Ubuntu, and Slackware I find to be a bit too unfriendly for me. I tend to break stuff. Great way to learn, though.

You don’t need regexes if you just want to grep for different fixed patterns. Just use the -e parameter for each pattern you want to match, or one -F if you want to supply them as a newline separated list, or -f if you want to read them from a file (see man grep ).

5 Answers 5

You can pass multiple regexes to grep by using the -e option more than once:

grep -e regex1 -e regex2 input_file

will match lines matching regex1 or regex2 .

grep -E «ATTN|MASS|BOND|ANGLE|DIHE|IMPROPER» temp.dat and grep -e ATTN -e MASS -e BOND -e ANGLE -e DIHE -e IMPROPER temp.dat are the same.

I’m also fairly new to regex, but since noone else has answered I’ll give it a shot. The pipe-operator «|» is used for an OR operator.

The following REGEX should get you going somewhere.

(Match anything one or more times followed by either «JPG» or «JPEG» at the end)

Extended answer (editted after learning a bit about (e)grep): Assuming you have a folder with following files in them:

test.jpeg, test.JpEg, test.JPEG, test.jpg, test.JPG, test.notimagefile, test.gif 

(Not that creative with names. )

First we start by defining what we know about our pattern: We know that we are looking for the end of the name. Ergo we use the «$» operand to define that each line has to end with the defined pattern. We know that the pattern needs to be either JPEG or JPG. To this we use the pipeline «|» as an or operand. Our pattern is now:

Читайте также:  Linux остаток от деления

(Match any line ending with EITHER «JPEG» or «JPG»)

However we see that in this example, the only difference is the optional «E». To this we can use the «?» operand (meaning optional). We write:

(Mach any file ending with a pattern like: «J», followed by «P», followed by an optional «E», followed by a «G»).

However we might also like to match files with lowercase letters in file name. To this we introduce the character-class «[. ]». meaning match either of the following. We write:

(Match any file ending with at pattern like: «j» or «J», followed by «p» or «P», followed by an optional «e» or «E», followed by «g» or «G») (This could also be done using the «-i» option in grep, but I took this as an exercise in REGEX)

Finally, since we (hopefully) start to see a pattern, we can omit the unnecessary parentheses. Since there is only one optional letter («E»), we can omit this one. Also, since the file only has this pattern to end on, we can omit the starting and ending parenthesis. Thus we simply get:

Finally; lets assume you also want to find files with «.gif»-filetype, we can add this as a second parameter:

(Here I’ve again added extra parenthesis for readability/grouping. Feel free to remove them if they seem obfuscating.)

Finally, I used ls and a pipeline to send all file names to (e)grep:

test.gif test.JPG test.JpEg test.JPEG test.jpg test.JPG 

Second edit: Using the -i option and omitting parenthesis we can shorten it down to only:

Источник

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

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

Читайте также:  Удалить содержимое папки через командную строку 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 .

Читайте также:  Steam dedicated server linux

$ 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