- Grep OR – Grep AND – Grep NOT – Match Multiple Patterns
- GREP OR: Match Any Of Multiple Patterns
- GREP AND: Match Multiple Patterns
- GREP NOT: Negative Matching
- Linux Grep OR, AND, NOT Operator and Logic Examples
- Example Text
- OR Logic
- OR with Extended Grep
- OR with Egrep
- AND Logic
- AND with Multiple Grep
- NOT Logic
- NOT with Multiple Grep Conditions
- Как грепнуть одновременно по нескольким условиям?
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.
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 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 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 .
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 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
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 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).
Я привел это как пример, на самом деле условия будут достаточно вложенными.
Без регулярок невозможно объединить. И вообще, у Вас есть man grep .
Сначала его читайте, а потом вопросы задавайте.
cat access.log | grep -P ‘foo|bar|baz’
Ну я спрашиваю не чисто по grep, может есть более «умная» утилита.
А ваш пример:
grep -P ‘foo|bar|baz’
вообще не требует регулярок
И как вы в терминах этой регулярки напишите мне условие:
bar или (baz и foo) ?
Сергей, алло) Флаг -e это тоже регулярное выражение, если что.)
А по поводу а || б&в
Это условие нелогично, ибо мы не знаем, что подразумевается под «и». Строка «baz и foo»?
Кейс в вакууме.
> Флаг -e это тоже регулярное выражение, если что.)
да я ж не спорю, если так посудить: grep baz тоже регулярка.
> Это условие нелогично, ибо мы не знаем, что подразумевается под «и». Строка «baz и foo»?
если вам что то не логично, то можно это уточнить.
А именно одновременное присутствие baz и foo в строке. Я кажется привел пример в вопросе,
но вы почему то не удосужились прочитать и понять это.
Если нужен разделитель — можно * на + поменять.
➜ ~ 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
спасибо, но не то. Я именно хочу получить эквивалент
по вашей регулярке имеет значение местоположение относительно друг-друга.
Сергей,
>если так посудить: grep baz тоже регулярка.
Википедия передает привет:
Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them»
> давай все условия, соберем всю регулярку
я условия все выше написал, я хочу получить строки в которых есть:
baz
или
одновременно foo и bar в любой последовательности.
cat access.log | grep -P ‘foo|bar’ | grep -P baz
а В чем проблемма то?
или или и
ну и в купе с этим | grep -v ‘исключить’
Да я все это знаю, и проблема в том что не дает это столь большой гибкости.
То что вы привели в примере, совершенно не работает как: #1|(#2 & #3).
это совершенно не то, вы просто ошиблись.
Сергей, Было бы достаточно, не спрашивал бы.
Будьте добры оформить как положено тогда вопрос.
Что такое строка №1 — это первая строка или первое соответствие, или текст №1 ?
Соответственно остальные то-же самое
Вдруг вам нужно каждую первую вторую или третью строку парсить с разными условиями.
Тогда это sed + grep, а вдруг у вас это шаблон соответствие №1 ( да и кстати греп строчный у него нет возможности работаь с переводом строки)
Мы тут телепатией не обладаем, хотя порой нужно. Если это аксесс лог( а по тз это он) то вам нужно парсить не через греп а авк или кут в зависимости от того что вы хотите получить в конечном итоге
В конце концов может вам нужен лог в реал тайме тогда это tail -f или мультитайл в несколько потоков.
Вы уж определитесь пожалуйста 😉
яу ж не знаю дайте 3 строчки с лога сотрите вы данные которые нужно но в том же формате впишите левые.
И что на выход собираетесь получить.
Напоминает ситуацию у хирурга.
-Больной раздевайтесь
-не шеф через шубу лечи.
😉
Ок. Есть строка А, строка Б и В
нужно в логах найти все строки которые удовлетворяют правилу:
в строке лога присутствует строка А
или
одновременно присутствуют строки Б и В.
Я могу придумать миллион вариаций на эту тему.
Ну например:
в строке лога присутствует А
или
одновременно присутсвует Б и не присутсвует В.
> В конце концов может вам нужен лог в реал тайме тогда это tail -f или мультитайл в несколько потоков.
я про tail -f вас не спрашивал 🙂 я четко обозначил что есть файл, ну вы же понимаете что это может быть пайп, ну кого я учу, а ?
Сергей, из миллиона придуманых вариация я не увидел ни 1 строчки примера.
Ну да ладно, проявим свои телепатические способности, ммммммммммммммммммммм
думаю так
Вы хотите сказать что вам нужен поиск по условию или соответствие одной строки или соответствие двум значениям в одной строке.
Собственно на это вам уже давно ответили. или|или
Если же вы хотите чтоб для вашего файла составили регулярку не видя ни одного примера то это как минимум странно.
Или или это как раз то что вам нужно
Это будет или условие А или условие Б плюс В
Или вам принципиально впадлу расписать пример?
я уже молчу про такую вещь как «Строка А Строка Б» про это я вам так же писал
Что ГРЕП НЕ УМЕЕТ РАБОТАТЬ СО СТРОКАМИ — СТРОКИ это множественное число!!
Только с каждой по отдельности, если вы хотите работать со строками то добро пожаловтаь в SED
Но опять же без примера работать с ним сможет лишь телепат гранд мастер а я только подмастерье ;(
Регулярки я и сам составлю. Все примеры которые приведены выше никак не покажут строки которые мне нужны. Ок положим вот так:
Есть файл: 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)