Вот есть лог файл.
Нужно 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'
> Флаг -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 в любой последовательности.
Да я все это знаю, и проблема в том что не дает это столь большой гибкости.
То что вы привели в примере, совершенно не работает как: #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
bar baz
baz bar foo
но вы видите, это достаточно сложная команда. foo встречается 2 раза. А если я хочу более "заковыристое" условие, так я должен тогда еще больше пайпов писать + еще больше foo добавлять и т.п.
придет момент, когда я обычным grep так вообще не сделаю, я могу ошибится ит.п.
т.о. я спрашиваю как мне упростить все это дело так, чтобы я просто описал некое правило фильтрации (один раз) со всякими скобочками и приортетами операций, и получил на выходе то что мне нужно.
Т.е. в данном случае было бы идеально если бы мне дали сделать фильтр такой:
foo|(bar&baz)
Когда надо грепнуть по принципу верни строки где есть "матч1 и матч2", то мы юзаем grep -E '(match1.*match2)'
когда нужно условие ИЛИ то grep -E '(match1|match2)'
помните что пробелы имеют значение : grep -E '(match1|match2)'и grep -E '(match1 | match2)' - это разные запросы и результаты