Grep linux выражение или

Grep OR – Grep AND – Grep NOT – Match Multiple Patterns

The grep , egrep , sed and awk are the most common Linux command line tools for parsing files.

From the following article you’ll learn how to match multiple patterns with the OR , AND , NOT operators, using grep , egrep , sed and awk commands from the Linux command line.

I’ll show the examples of how to find the lines, that match any of multiple patterns, how to print the lines of a file, that match each of provided patterns and how to find and print the lines, that do not match a pattern (negative matching).

Cool Tip: Find and validate email addresses with grep command! The best regular expression for email addresses! Read more →

GREP OR: Match Any Of Multiple Patterns

Find all the lines of a file, that match any of provided patterns.

Using grep and egrep commands:

$ grep "PATTERN1\|PATTERN2" FILE $ grep -E "PATTERN1|PATTERN2" FILE $ grep -e PATTERN1 -e PATTERN2 FILE $ egrep "PATTERN1|PATTERN2" FILE
$ awk '/PATTERN1|PATTERN2/' FILE
$ sed -e '/PATTERN1/b' -e '/PATTERN2/b' -e d FILE

GREP AND: Match Multiple Patterns

It is also often required to grep a file for multiple patterns – when it is needed to find all the lines in a file, that contain not one, but several patterns.

Note, that you can both find the lines in a file that match multiple patterns in the exact order or in the any order.

Use one of the following commands to find and print all the lines of a file, that match multiple patterns.

Using grep command (exact order):

$ grep -E 'PATTERN1.*PATTERN2' FILE

Using grep command (any order):

$ grep -E 'PATTERN1.*PATTERN2|PATTERN2.*PATTERN1' FILE $ grep 'PATTERN1' FILE | grep 'PATTERN2'

Cool Tip: The server is out of memory? Check what processes are using all the RAM and SWAP! Bash one liner for the true Linux admins! Read more →

Using awk command (exact order):

$ awk '/PATTERN1.*PATTERN2/' FILE

Using awk command (any order):

$ awk '/PATTERN1/ && /PATTERN2/' FILE

Using sed command (exact order):

$ sed '/PATTERN1.*PATTERN2/!d' FILE

Using sed command (any order):

$ sed '/PATTERN1/!d; /PATTERN2/!d' FILE

GREP NOT: Negative Matching

Cool Tip: Find and validate IP addresses with grep command! The best regular expression for IP addresses! Read more →

Find and print all the lines, that do not match a pattern.

Источник

Linux Grep OR, AND, NOT Operator and Logic Examples

lo grep is very useful tool for text search and pattern matching. We have all ready provided tutorial and examples about grep and egrep . In this tutorial we will look grep command or , and , not logic operations in detail.

Читайте также:  Linux joining pdf files

Example Text

We will use following text during tutorial for grep operations. This is the wage list of Manchester United Football Team.

David de Gea 26 £200,000 2 Years (2019) Sergio Romero 30 £50,000 4 Years (2021) Marcos Rojo 27 £70,000 2 Years (2019) Phil Jones 25 £50,000 2 Years (2019) Chris Smalling 27 £80,000 2 Years (2019) Eric Bailly 23 £75,000 3 Years (2020)

OR Logic

or logic matches all lines if one of the pattern match. We will use \| to specify OR logic. In this example we will look players those age 23 OR 30 .

OR Logic

OR with Extended Grep

Another way to implement OR logic is using grep command extended option with -E . We will specify OR logic with | . In this example we will look players those age 23 OR 30 .

$ grep -E "23|30" manchester.txt

OR with Extended Grep

OR with Egrep

Another tool used to implement OR logic is egrep . We will use | operator again. In this example we will look players those age 23 OR 30 .

OR with Egrep

AND Logic

AND logic will match lines those have all provided patterns. We will use .* for AND operator. In this example we will list players those contract is 2 years and age is 27.

$ grep "27.*2 Years" manchester.txt

AND Logic

AND with Multiple Grep

Another implementation is using multiple grep commands to filter given patterns. In this example we will list players those contract is 2 years and age is 27.

$ grep "2 Years" manchester.txt | grep 27

AND with Multiple Grep

NOT Logic

NOT logic is used to get results those do not matched given pattern. We will use -v option for grep. In this example we will list players those do not 27 years old.

NOT Logic

NOT with Multiple Grep Conditions

We can implement NOT logic multiple times with multiple grep commands. We will pipe multiple grep commands in bash. In this example we will list players those is not 27 years old and not have 2 Years contract.

$ grep -v "27" manchester.txt | grep -v "2 Years"

Источник

Как грепнуть одновременно по нескольким условиям?

Вот есть лог файл.
Нужно grep-нуть его по нескольким условиям.
Типа встречается строка №1 или (строка №2 и строка №3).
В в случае когда просто строка #1: grep #1
Когда #2 и #3: grep #2 | grep #3
А как попроще организовать «или», т.е. объединить результаты этих 2х выражений ?
Ну вот так чтобы поменьше печатать и без регулярок.

вот было бы идеально: #1|(#2 & #3).
Я привел это как пример, на самом деле условия будут достаточно вложенными.

miraage

Без регулярок невозможно объединить. И вообще, у Вас есть man grep .
Сначала его читайте, а потом вопросы задавайте.
cat access.log | grep -P ‘foo|bar|baz’

Читайте также:  Linux bash очистить файл

begemot_sun

Ну я спрашиваю не чисто по grep, может есть более «умная» утилита.
А ваш пример:
grep -P ‘foo|bar|baz’

вообще не требует регулярок

И как вы в терминах этой регулярки напишите мне условие:
bar или (baz и foo) ?

miraage

Сергей, алло) Флаг -e это тоже регулярное выражение, если что.)
А по поводу а || б&в

Это условие нелогично, ибо мы не знаем, что подразумевается под «и». Строка «baz и foo»?
Кейс в вакууме.

begemot_sun

> Флаг -e это тоже регулярное выражение, если что.)
да я ж не спорю, если так посудить: grep baz тоже регулярка.

> Это условие нелогично, ибо мы не знаем, что подразумевается под «и». Строка «baz и foo»?
если вам что то не логично, то можно это уточнить.
А именно одновременное присутствие baz и foo в строке. Я кажется привел пример в вопросе,
но вы почему то не удосужились прочитать и понять это.

miraage

Если нужен разделитель — можно * на + поменять.

➜ ~ cat foo.txt foo bar and baz random words foo of the Shire Legendary bar defeated baz ➜ ~ cat foo.txt | ggrep -P 'foo|(bar.*?baz)' foo bar and baz foo of the Shire Legendary bar defeated baz

begemot_sun

спасибо, но не то. Я именно хочу получить эквивалент

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

miraage

shambler81

ololopishpishrealne

Сергей,
>если так посудить: grep baz тоже регулярка.
Википедия передает привет:
Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them»

begemot_sun

> давай все условия, соберем всю регулярку
я условия все выше написал, я хочу получить строки в которых есть:
baz
или
одновременно foo и bar в любой последовательности.

shambler81

cat access.log | grep -P ‘foo|bar’ | grep -P baz
а В чем проблемма то?
или или и
ну и в купе с этим | grep -v ‘исключить’

begemot_sun

Да я все это знаю, и проблема в том что не дает это столь большой гибкости.
То что вы привели в примере, совершенно не работает как: #1|(#2 & #3).
это совершенно не то, вы просто ошиблись.

shambler81

begemot_sun

shambler81

Сергей, Было бы достаточно, не спрашивал бы.
Будьте добры оформить как положено тогда вопрос.
Что такое строка №1 — это первая строка или первое соответствие, или текст №1 ?
Соответственно остальные то-же самое
Вдруг вам нужно каждую первую вторую или третью строку парсить с разными условиями.
Тогда это sed + grep, а вдруг у вас это шаблон соответствие №1 ( да и кстати греп строчный у него нет возможности работаь с переводом строки)
Мы тут телепатией не обладаем, хотя порой нужно. Если это аксесс лог( а по тз это он) то вам нужно парсить не через греп а авк или кут в зависимости от того что вы хотите получить в конечном итоге
В конце концов может вам нужен лог в реал тайме тогда это tail -f или мультитайл в несколько потоков.
Вы уж определитесь пожалуйста 😉
яу ж не знаю дайте 3 строчки с лога сотрите вы данные которые нужно но в том же формате впишите левые.
И что на выход собираетесь получить.
Напоминает ситуацию у хирурга.
-Больной раздевайтесь
-не шеф через шубу лечи.
😉

Читайте также:  Linux how to videos

begemot_sun

Ок. Есть строка А, строка Б и В
нужно в логах найти все строки которые удовлетворяют правилу:
в строке лога присутствует строка А
или
одновременно присутствуют строки Б и В.

Я могу придумать миллион вариаций на эту тему.
Ну например:
в строке лога присутствует А
или
одновременно присутсвует Б и не присутсвует В.

begemot_sun

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

shambler81

Сергей, из миллиона придуманых вариация я не увидел ни 1 строчки примера.
Ну да ладно, проявим свои телепатические способности, ммммммммммммммммммммм
думаю так
Вы хотите сказать что вам нужен поиск по условию или соответствие одной строки или соответствие двум значениям в одной строке.
Собственно на это вам уже давно ответили. или|или
Если же вы хотите чтоб для вашего файла составили регулярку не видя ни одного примера то это как минимум странно.
Или или это как раз то что вам нужно
Это будет или условие А или условие Б плюс В
Или вам принципиально впадлу расписать пример?
я уже молчу про такую вещь как «Строка А Строка Б» про это я вам так же писал
Что ГРЕП НЕ УМЕЕТ РАБОТАТЬ СО СТРОКАМИ — СТРОКИ это множественное число!!
Только с каждой по отдельности, если вы хотите работать со строками то добро пожаловтаь в SED
Но опять же без примера работать с ним сможет лишь телепат гранд мастер а я только подмастерье ;(

begemot_sun

Регулярки я и сам составлю. Все примеры которые приведены выше никак не покажут строки которые мне нужны. Ок положим вот так:
Есть файл: cat log

foo
bar baz
xxx yyy
baz bar foo
zzzz bar

Мне нужно выбрать все строки с foo или все строки одновременно с bar и baz (строго одновременно).
Как я поступлю с grep? вот команда которая решает мои задачи:
cat log | grep -e foo -e baz | grep -e foo -e bar

но вы видите, это достаточно сложная команда. foo встречается 2 раза. А если я хочу более «заковыристое» условие, так я должен тогда еще больше пайпов писать + еще больше foo добавлять и т.п.
придет момент, когда я обычным grep так вообще не сделаю, я могу ошибится ит.п.
т.о. я спрашиваю как мне упростить все это дело так, чтобы я просто описал некое правило фильтрации (один раз) со всякими скобочками и приортетами операций, и получил на выходе то что мне нужно.
Т.е. в данном случае было бы идеально если бы мне дали сделать фильтр такой:
foo|(bar&baz)

Источник

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