- grep с логическими операторами
- xandroskin blog | it or not it
- Операция ИЛИ
- grep -E (расширенный regexp) и эквивалентный ему egrep
- grep -e
- Операция И
- grep -E
- Операция НЕ
- grep -v
- Регулярные выражения
- подскажите как grep по двум условиям В СТРОКУ?
- Как грепнуть одновременно по нескольким условиям?
- 7 Linux Grep OR, Grep AND, Grep NOT Operator Examples
- Grep OR Operator
- 1. Grep OR Using \|
- 2. Grep OR Using -E
- 3. Grep OR Using egrep
- 4. Grep OR Using grep -e
- Grep AND
- 5. Grep AND using -E ‘pattern1.*pattern2’
- 6. Grep AND using Multiple grep command
- Grep NOT
- 7. Grep NOT using grep -v
grep с логическими операторами
Есть ли grep-подобная утилита, которая позволит мне выполнять поиск grep с помощью логических операторов. Я хочу иметь возможность свободно вкладывать и комбинировать логические конструкции. Например, такие вещи должны быть возможны:
Я понимаю, что это можно сделать с помощью vanilla grep и дополнительных сценариев bash, но моя цель здесь — избежать этого.
С awk , как и с perl , вам придется заключить термины // , но это можно сделать:
Есть много способов использования grep с логическими операторами.
Используется \| для разделения нескольких шаблонов для условия ИЛИ .
Пример: grep ‘pattern1\|pattern2’ filename
Используйте -E опцию для отправки нескольких шаблонов для условия ИЛИ .
Пример: grep -E ‘pattern1|pattern2’ filename
Использование одного -e соответствует только одному шаблону, но использование нескольких -e параметров соответствует более чем одному шаблону.
Пример: grep -e pattern1 -e pattern2 filename
grep -v может имитировать операцию НЕ .
Там нет оператора AND grep , но вы можете имитировать грубой силой AND , используя -E опцию.
Пример : grep -E ‘pattern1.*pattern2|pattern2.*pattern1’ filename
Приведенный выше пример будет соответствовать всем строкам , которые содержат и образец pattern1 и pattern2 в любом порядке.)
Вы можете использовать Perl:
Я верю, что это завершает то, что вы пытаетесь сделать. Он d выводит из вывода любую строку, которая не совпадает term1 , b из сценария (и, таким образом, автоматически печатается) выходит любая строка, которая остается и совпадает term2 , а для строк, которые остаются, удаляет любую, которая не совпадает , и строку, term3 которая совпадает. term4 ,
sed сценарии оцениваются по порядку, и все тесты являются логическими, поэтому любые действия, возникающие в результате теста, будут напрямую влиять на поведение любых следующих действий.
Я использую для цепочки grep команд для достижения логического И:
Я считаю, что это довольно просто, Unix-как и элегантно.
Затем вы можете объединить (как подробно объяснил @Tushi) с -E опцией для OR-ing и -v для отрицания.
Ваш конкретный пример довольно неприятен и, вероятно, выиграет от более мощной утилиты (см. Ответ @ muru).
Источник
xandroskin blog | it or not it
Операция ИЛИ
grep -E (расширенный regexp) и эквивалентный ему egrep
grep -e
Операция И
grep -E
(в только таком порядке)
(независимо от порядка)
Операция НЕ
grep -v
Регулярные выражения
Регулярные выражения состоят из двух типов символов: обычные символы языка и метасимволы, позволяющие усилить мощность выражений. Рассмотрим текстовый файл, содержащий перечисленные через запятую страны, их население и континент расположения:
Метасимволы ^ и $ указывают на начало и конец шаблона выражения:
Метасимвол точка (.) позволяет задать любой один символ в выражении, а обрамление в квадратные скобки []
указывает на наличие одного из шаблонов внутри скобов. Например, выбрать из файла все страны, начинающиеся на I или J с длиной 5 букв, можно так:
Вместо 5 подряд точек можно указать их количество с помощью фигурных скобок <> (или квантификатора):
Аналогично, можно задать вилку количества символов в шаблоне, например от 4 до 6:
Для некоторых квантификаторов существуют короткие замены. Так, эквивалентно ?, — *, — +, поэтому следующие две команды идентичны:
Использование ^ вместе с […] дает отрицание. Выбрать все страны, не начинающиеся на I или J:
Вывести содержимое файла без пустых и начинающихся с «#» строк (применимо к файлам конфигурации) можно с помощью следующих команд:
Источник
подскажите как grep по двум условиям В СТРОКУ?
так конечно работает
здесь лучше два грепа, а не один
не, так тоже пробовал, строки разные в файле
два грепа не подходят — строки в разных частях файла, ищет почему то в одной строке
почему-то, интересно почему, может быть открыть исходный код?
вот и шта, файл из нескольких строк, греп почему то делает построчно поиск
исходный код чего? текста? ну типа так
а тебе нужен файл в котором просто есть два нужных слова?
да, нужно обе строки получить как при грепе по одному условию в строку
Ты что-то путаешь.
Возможны два варианта:
1) Найди все строки, в которых есть бла1 или бла2: egrep «бла1\|бла2»
2) Найди все строки, которые содержат и бла1 и бла2: egrep «бла1.*бла2\|бла2.*бла1» .
Третьего не дано.
Научись технически грамотно задавать вопрос. Мне уже даже неинтересно стало. Задача элементарная
так все находится, но получается для каждого условия отдельная строка
все элементарно и написал
Написал бы технически грамотно, здесь бы не было этих никому не нужных советов с одним грепом
Так? (для одного файла)
точно! но нужно для списка файлов, читаю за paste
вот такая штука почти прокатывает, но лишнее имя файла торчит
точно! но нужно для списка файлов, читаю за paste
P. S. Если файлы только из текущего каталога, find излишен. Но я не знаю деталей твоего кейса.
Писал бы уже целиком на перле
Нет, такой никнейм не прокатит как отговорка
Не советуй дурного.
Я только однострочники умею на пёрле.
А что должен выводить скрипт с паттерном «one\|two» для такого файла?
Даа, лучше бдсмить бинутилсы же. Сколько лет читаю такие треды, все недоумеваю, почему люди не могут просто взять любой элементарный яп, забрать стпоки из файлов в нормальные структуры данных и делать с ними что душе угодно. Даже если у человека сложности с алгоритмированием, все ваши пастогрепоседоавки можно было сделать модулем на яп и никогда не парить себе мозг, но вы уплетаете непотребное стд легаси, созданное для ручного ввода с консоли, когда больше вообще нихрена не было, и кормите им людей. Чем-то похоже на работу верстальщика css – есть куча мелких блоков, которые не делают что нужно, но если вложить 4 штуки и прописать 50 свойств, то получается почти что надо, осталось только px вручную подобрать. Или как целиком на sql-е пишут бизнес-логику, копируя целые трехстраничные запросы по пять раз в третий уровень вложения, потому что нет элементарного препроцессора или разделения на функции.
На яп задача решается так: идешь по файлам тек.папки, идешь по строкам, если /а|б/, то кладешь строку в массив. Потом массив добиваешь до четного и попарно соединяя, добавляешь имя файла, принтишь. Всё, никаких недокостылей, а с хорошей файл-либой будет строк 10 от силы.
s/бинутилсы/кореутилсы/, все время путаю
Сколько лет читаю такие треды, все недоумеваю, почему люди не могут просто взять любой элементарный яп, забрать стпоки из файлов в нормальные структуры данных и делать с ними что душе угодно.
Шелл в *nix это и есть ЯП, а не как в венде какое-то говно.
На яп задача решается так: идешь по файлам тек.папки, идешь по строкам, если /а|б/, то кладешь строку в массив. Потом массив добиваешь до четного и попарно соединяя, добавляешь имя файла, принтишь.
Да, на шелле элементарно можно написать такой однострочник.
Всё, никаких недокостылей, а с хорошей файл-либой будет строк 10 от силы.
Источник
Как грепнуть одновременно по нескольким условиям?
Вот есть лог файл.
Нужно grep-нуть его по нескольким условиям.
Типа встречается строка №1 или (строка №2 и строка №3).
В в случае когда просто строка #1: grep #1
Когда #2 и #3: grep #2 | grep #3
А как попроще организовать «или», т.е. объединить результаты этих 2х выражений ?
Ну вот так чтобы поменьше печатать и без регулярок.
вот было бы идеально: #1|(#2 & #3).
Я привел это как пример, на самом деле условия будут достаточно вложенными.
- Вопрос задан более трёх лет назад
- 7627 просмотров
Ну я спрашиваю не чисто по grep, может есть более «умная» утилита.
А ваш пример:
grep -P ‘foo|bar|baz’
вообще не требует регулярок
grep -e foo -e bar -e baz
И как вы в терминах этой регулярки напишите мне условие:
bar или (baz и foo) ?
Сергей, алло) Флаг -e это тоже регулярное выражение, если что.)
А по поводу а || б&в
И как вы в терминах этой регулярки напишите мне условие:
bar или (baz и foo) ?
> Флаг -e это тоже регулярное выражение, если что.)
да я ж не спорю, если так посудить: grep baz тоже регулярка.
> Это условие нелогично, ибо мы не знаем, что подразумевается под «и». Строка «baz и foo»?
если вам что то не логично, то можно это уточнить.
А именно одновременное присутствие baz и foo в строке. Я кажется привел пример в вопросе,
но вы почему то не удосужились прочитать и понять это.
Если нужен разделитель — можно * на + поменять.
спасибо, но не то. Я именно хочу получить эквивалент
grep baz | grep bar
по вашей регулярке имеет значение местоположение относительно друг-друга.
Ок. Есть строка А, строка Б и В
нужно в логах найти все строки которые удовлетворяют правилу:
в строке лога присутствует строка А
или
одновременно присутствуют строки Б и В.
Я могу придумать миллион вариаций на эту тему.
Ну например:
в строке лога присутствует А
или
одновременно присутсвует Б и не присутсвует В.
Регулярки я и сам составлю. Все примеры которые приведены выше никак не покажут строки которые мне нужны. Ок положим вот так:
Есть файл: 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
bar baz
baz bar foo
но вы видите, это достаточно сложная команда. foo встречается 2 раза. А если я хочу более «заковыристое» условие, так я должен тогда еще больше пайпов писать + еще больше foo добавлять и т.п.
придет момент, когда я обычным grep так вообще не сделаю, я могу ошибится ит.п.
т.о. я спрашиваю как мне упростить все это дело так, чтобы я просто описал некое правило фильтрации (один раз) со всякими скобочками и приортетами операций, и получил на выходе то что мне нужно.
Т.е. в данном случае было бы идеально если бы мне дали сделать фильтр такой:
foo|(bar&baz)
Источник
7 Linux Grep OR, Grep AND, Grep NOT Operator Examples
Question: Can you explain how to use OR, AND and NOT operators in Unix grep command with some examples?
Answer: In grep, we have options equivalent to OR and NOT operators. There is no grep AND opearator. But, you can simulate AND using patterns. The examples mentioned below will help you to understand how to use OR, AND and NOT in Linux grep command.
The following employee.txt file is used in the following examples.
You already knew that grep is extremely powerful based on these grep command examples.
Grep OR Operator
Use any one of the following 4 methods for grep OR. I prefer method number 3 mentioned below for grep OR operator.
1. Grep OR Using \|
If you use the grep command without any option, you need to use \| to separate multiple patterns for the or condition.
For example, grep either Tech or Sales from the employee.txt file. Without the back slash in front of the pipe, the following will not work.
2. Grep OR Using -E
grep -E option is for extended regexp. If you use the grep command with -E option, you just need to use | to separate multiple patterns for the or condition.
For example, grep either Tech or Sales from the employee.txt file. Just use the | to separate multiple OR patterns.
3. Grep OR Using egrep
egrep is exactly same as ‘grep -E’. So, use egrep (without any option) and separate multiple patterns for the or condition.
For example, grep either Tech or Sales from the employee.txt file. Just use the | to separate multiple OR patterns.
4. Grep OR Using grep -e
Using grep -e option you can pass only one parameter. Use multiple -e option in a single command to use multiple patterns for the or condition.
For example, grep either Tech or Sales from the employee.txt file. Use multiple -e option with grep for the multiple OR patterns.
Grep AND
5. Grep AND using -E ‘pattern1.*pattern2’
There is no AND operator in grep. But, you can simulate AND using grep -E option.
The following example will grep all the lines that contain both “Dev” and “Tech” in it (in the same order).
The following example will grep all the lines that contain both “Manager” and “Sales” in it (in any order).
Note: Using regular expressions in grep is very powerful if you know how to use it effectively.
6. Grep AND using Multiple grep command
You can also use multiple grep command separated by pipe to simulate AND scenario.
The following example will grep all the lines that contain both “Manager” and “Sales” in the same line.
Grep NOT
7. Grep NOT using grep -v
Using grep -v you can simulate the NOT conditions. -v option is for invert match. i.e It matches all the lines except the given pattern.
For example, display all the lines except those that contains the keyword “Sales”.
You can also combine NOT with other operator to get some powerful combinations.
For example, the following will display either Manager or Developer (bot ignore Sales).
Источник