Grep linux два условия

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 с несколькими шаблонами AND?

Я хотел бы получить совпадение нескольких шаблонов с неявным AND между шаблонами, т.е. эквивалентно запуску нескольких greps в последовательности:

Так как же преобразовать его в нечто подобное?

Я хотел бы использовать один grep, потому что я строю аргументы динамически, поэтому все должно помещаться в одну строку. Использование фильтра — это системная функция, а не grep, поэтому это не аргумент.

Не путайте этот вопрос с:

Это ИЛИ совпадение с несколькими образцами.

agrep может сделать это с помощью следующего синтаксиса:

Используя GNU grep , при поддержке PCRE вы можете:

(добавление .* s as & соответствует строкам, которые совпадают и точно , a&b и никогда не совпадет , так как нет такой строки, которая может быть одновременно a и b одновременно).

Если шаблоны не перекрываются, вы также можете сделать:

Лучший портативный способ, вероятно, с, awk как уже упоминалось:

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

Вы не указали версию grep, это важно. Некоторые механизмы регулярных выражений допускают множественное сопоставление, объединенное оператором AND с использованием ‘&’, но это нестандартная и непереносимая функция. Но, по крайней мере, GNU grep не поддерживает это.

OTOH вы можете просто заменить grep на sed, awk, perl и т. Д. (Перечислены в порядке увеличения веса). С awk команда будет выглядеть так:

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

Если в patterns каждой строке содержится один шаблон, вы можете сделать что-то вроде этого:

Или это соответствует подстроки вместо регулярных выражений:

Чтобы напечатать все вместо строк ввода в patterns пустом случае, замените их NR==FNR на FILENAME==ARGV[1] или ARGIND==1 на gawk .

Эти функции печатают строки STDIN, которые содержат каждую строку, указанную в качестве аргумента в качестве подстроки. ga выступает за grep all и gai игнорирует регистр.

Источник

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).

Источник

Поиск текста в файлах Linux

Иногда может понадобится найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. В Linux всё это делается с помощью одной очень простой, но в то же время мощной утилиты grep. С её помощью можно искать не только строки в файлах, но и фильтровать вывод команд, и много чего ещё.

В этой инструкции мы рассмотрим, как выполняется поиск текста в файлах Linux, подробно разберём возможные опции grep, а также приведём несколько примеров работы с этой утилитой.

Что такое grep?

Команда grep (расшифровывается как global regular expression print) — одна из самых востребованных команд в терминале Linux, которая входит в состав проекта GNU. Секрет популярности — её мощь, она даёт возможность пользователям сортировать и фильтровать текст на основе сложных правил.

Утилита grep решает множество задач, в основном она используется для поиска строк, соответствующих строке в тексте или содержимому файлов. Также она может находить по шаблону или регулярным выражениям. Команда в считанные секунды найдёт файл с нужной строчкой, текст в файле или отфильтрует из вывода только пару нужных строк. А теперь давайте рассмотрим, как ей пользоваться.

Синтаксис grep

Синтаксис команды выглядит следующим образом:

$ grep [опции] шаблон [имя файла. ]

$ команда | grep [опции] шаблон

  • Опции — это дополнительные параметры, с помощью которых указываются различные настройки поиска и вывода, например количество строк или режим инверсии.
  • Шаблон — это любая строка или регулярное выражение, по которому будет вестись поиск
  • Файл и команда — это то место, где будет вестись поиск. Как вы увидите дальше, grep позволяет искать в нескольких файлах и даже в каталоге, используя рекурсивный режим.

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

Опции

Давайте рассмотрим самые основные опции утилиты, которые помогут более эффективно выполнять поиск текста в файлах grep:

  • -b — показывать номер блока перед строкой;
  • -c — подсчитать количество вхождений шаблона;
  • -h — не выводить имя файла в результатах поиска внутри файлов Linux;
  • -i — не учитывать регистр;
  • — l — отобразить только имена файлов, в которых найден шаблон;
  • -n — показывать номер строки в файле;
  • -s — не показывать сообщения об ошибках;
  • -v — инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон;
  • -w — искать шаблон как слово, окружённое пробелами;
  • -e — использовать регулярные выражения при поиске;
  • -An — показать вхождение и n строк до него;
  • -Bn — показать вхождение и n строк после него;
  • -Cn — показать n строк до и после вхождения;

Все самые основные опции рассмотрели и даже больше, теперь перейдём к примерам работы команды grep Linux.

Примеры использования

С теорией покончено, теперь перейдём к практике. Рассмотрим несколько основных примеров поиска внутри файлов Linux с помощью grep, которые могут вам понадобиться в повседневной жизни.

Поиск текста в файлах

В первом примере мы будем искать пользователя User в файле паролей Linux. Чтобы выполнить поиск текста grep в файле /etc/passwd введите следующую команду:

grep User /etc/passwd

В результате вы получите что-то вроде этого, если, конечно, существует такой пользователь:

А теперь не будем учитывать регистр во время поиска. Тогда комбинации ABC, abc и Abc с точки зрения программы будут одинаковы:

grep -i «user» /etc/passwd

Вывести несколько строк

Например, мы хотим выбрать все ошибки из лог-файла, но знаем, что в следующей строчке после ошибки может содержаться полезная информация, тогда с помощью grep отобразим несколько строк. Ошибки будем искать в Xorg.log по шаблону «EE»:

grep -A4 «EE» /var/log/xorg.0.log

Выведет строку с вхождением и 4 строчки после неё:

grep -B4 «EE» /var/log/xorg.0.log

Выведет целевую строку и 4 строчки до неё:

grep -C2 «EE» /var/log/xorg.0.log

Выведет по две строки с верху и снизу от вхождения.

Регулярные выражения в grep

Регулярные выражения grep — очень мощный инструмент в разы расширяющий возможности поиска текста в файлах. Для активации этого режима используйте опцию -e. Рассмотрим несколько примеров:

Поиск вхождения в начале строки с помощью спецсимвола «^», например, выведем все сообщения за ноябрь:

grep «^Nov 10» messages.1

Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10

Поиск в конце строки — спецсимвол «$»:

grep «terminating.$» messages

Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

Найдём все строки, которые содержат цифры:

grep «1» /var/log/Xorg.0.log

Вообще, регулярные выражения grep — это очень обширная тема, в этой статье я лишь показал несколько примеров. Как вы увидели, поиск текста в файлах grep становиться ещё эффективнее. Но на полное объяснение этой темы нужна целая статья, поэтому пока пропустим её и пойдем дальше.

Рекурсивное использование grep

Если вам нужно провести поиск текста в нескольких файлах, размещённых в одном каталоге или подкаталогах, например в файлах конфигурации Apache — /etc/apache2/, используйте рекурсивный поиск. Для включения рекурсивного поиска в grep есть опция -r. Следующая команда займётся поиском текста в файлах Linux во всех подкаталогах /etc/apache2 на предмет вхождения строки mydomain.com:

grep -r «mydomain.com» /etc/apache2/

В выводе вы получите:

grep -r «zendsite» /etc/apache2/
/etc/apache2/vhosts.d/zendsite_vhost.conf: ServerName zendsite.localhost
/etc/apache2/vhosts.d/zendsite_vhost.conf: DocumentRoot /var/www/localhost/htdocs/zendsite
/etc/apache2/vhosts.d/zendsite_vhost.conf:

Здесь перед найденной строкой указано имя файла, в котором она была найдена. Вывод имени файла легко отключить с помощью опции -h:

grep -h -r «zendsite» /etc/apache2/

ServerName zendsite.localhost
DocumentRoot /var/www/localhost/htdocs/zendsite

Поиск слов в grep

Когда вы ищете строку abc, grep будет выводить также kbabc, abc123, aafrabc32 и тому подобные комбинации. Вы можете заставить утилиту искать по содержимому файлов в Linux только те строки, которые выключают искомые слова с помощью опции -w:

grep -w «abc» имя_файла

Поиск двух слов

Можно искать по содержимому файла не одно слово, а два сразу:

egrep -w ‘word1|word2’ /path/to/file

Количество вхождений строки

Утилита grep может сообщить, сколько раз определённая строка была найдена в каждом файле. Для этого используется опция -c (счетчик):

grep -c ‘word’ /path/to/file

C помощью опции -n можно выводить номер строки, в которой найдено вхождение, например:

grep -n ‘root’ /etc/passwd

Инвертированный поиск в grep

Команда grep Linux может быть использована для поиска строк в файле, которые не содержат указанное слово. Например, вывести только те строки, которые не содержат слово пар:

grep -v пар /path/to/file

Вывод имени файла

Вы можете указать grep выводить только имя файла, в котором было найдено заданное слово с помощью опции -l. Например, следующая команда выведет все имена файлов, при поиске по содержимому которых было обнаружено вхождение primary:

grep -l ‘primary’ *.c

Цветной вывод в grep

Также вы можете заставить программу выделять другим цветом вхождения в выводе:

grep —color root /etc/passwd

Выводы

Вот и всё. Мы рассмотрели использование команды grep для поиска и фильтрации вывода команд в операционной системе Linux. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

Источник

Читайте также:  Copy windows to new ssd
Оцените статью