Примеры нескольких условий Grep linux
Обновлено: 21.11.2024
Как выполнить поиск нескольких строк в одной строке? Можно ли собрать несколько строк с помощью одной команды из файла? Как сопоставить два или более шаблонов в одном файле?
Может быть несколько сценариев, в которых вам может потребоваться найти несколько строк в файле. Я постараюсь охватить сценарии, которые я могу придумать, и основанные на запросах пользователей в Интернете. Если у вас есть дополнительные вопросы, не стесняйтесь оставлять свои вопросы в поле для комментариев к этому руководству.
Мы будем использовать следующие инструменты, чтобы ответить на все эти вопросы:
собрать несколько строк — синтаксис
По умолчанию с grep с аргументом -e, который используется для grep определенного ШАБЛОНА. Теперь этот шаблон может быть строкой, регулярным выражением или чем-то еще. Мы можем добавить "-e" несколько раз с помощью grep, чтобы у нас уже был способ захвата нескольких строк с помощью grep.
Используйте -e с grep
Используйте вертикальную черту с escape-символом
Используйте вертикальную черту без escape-символа, используя расширенный grep ( -E )
Здесь egrep — это расширенный grep. Прямой вызов как egrep или fgrep устарел, но предоставляется, чтобы позволить историческим приложениям, которые полагаются на них, работать без изменений.
Как вы, возможно, заметили в синтаксисе, мы можем комбинировать grep со многими другими встроенными " аргументами " для улучшения функциональности поиска. Теперь мы будем использовать этот синтаксис в других примерах с большим количеством сценариев
Выполнять grep без учета регистра для нескольких шаблонов
Чтобы выполнить поиск без учета регистра, мы должны использовать "-i или --ignore-case" из справочной страницы grep:
В этом разделе мы выполним поиск всех строк, содержащих ошибки, предупреждения и фатальные ошибки, из /var/log/messages, исходя из синтаксиса, который вы можете использовать:
Теперь, поскольку мы объединяем наш синтаксис для grep нескольких строк с -i , grep будет выполнять поиск без учета регистра в файле /var/log/messages
grep несколько строк без учета регистра
Печать имени файла вместе с выводом grep
Теперь возможно, что вы можете попытаться найти несколько строк в каком-то пути для группы файлов. В таком случае вы можете получить совпадающий шаблон со строками, но по умолчанию вы НЕ получите имя файла отдельного совпадающего ШАБЛОНА
Чтобы также напечатать имя файла с помощью grep, используйте аргумент -H или --with-filename. На справочной странице grep
Итак, мы снова будем использовать наш синтаксис grep в сочетании с аргументом -H, чтобы также напечатать имя файла вместе с совпавшими строками в соответствующих строках:
Здесь, если вы заметили, я добавил -H ко всем нашим существующим командам grep для поиска всех файлов в каталоге /var/log/*, содержащих error , warn или fatal . При назначении этих аргументов с помощью grep нет особой последовательности.
может быть также записано как
и мы получим одинаковый результат от всех команд. Итак, как вы видите, мы можем записать набор аргументов в другом порядке, в сочетании или отдельно с grep, поэтому последовательность не имеет значения, если вы используете правильные аргументы.
grep несколько строк во всех файлах по пути
Как видите, мы получаем некоторый вывод, такой как " grep: /var/log/anaconda: Is a directory ", потому что по умолчанию grep будет искать только в файлах в указанном каталоге, но не в подкаталогах, следовательно выдает эту ошибку. Для выполнения рекурсивного поиска во всех каталогах и подкаталогах используйте -r или -R с grep
Grep для нескольких точных совпадений с шаблоном в файле или пути
По умолчанию, когда мы ищем шаблон или строку с помощью grep , он печатает строки, содержащие соответствующий шаблон во всех формах.
Например, если вы выполняете grep для «warn», то grep также будет соответствовать «warn», «ignore-warning» и т. д. Поскольку все эти слова содержат нашу строку, т. е. warn. Но если ваше требование состояло в том, чтобы напечатать только точное совпадение слова, то есть «предупреждать», тогда мы должны использовать -w или --word-regexp вместе с grep. На справочной странице grep:
Для поиска нескольких строк с точным соответствием слов в /var/log/messages мы будем использовать
Ниже приведен фрагмент с моего сервера
Сопоставить точное слово с grep
собрать несколько строк с условием AND
В предыдущих примерах мы использовали условие ИЛИ для сопоставления нескольких строк. Теперь, если у вас есть требование поиска нескольких строк с условием AND, т.е.все предоставленные шаблоны должны совпадать в одной строке
Например, у меня есть этот файл:
Я хотел бы найти строки, имеющие как "успешно", так и "активировано". Самый простой способ добиться этого — сначала выполнить поиск первого совпадения, а затем выполнить поиск следующей строки
Теперь у нас есть строки, содержащие обе строки, но недостатком этого метода является то, что если у вас есть несколько строк, вы в конечном итоге будете использовать grep несколько раз, что не будет выглядеть аккуратно
В качестве альтернативы мы также можем использовать grep в этом формате.
Поскольку мы не знаем порядок появления обеих строк, мы ищем оба шаблона в обоих возможных порядках. Это делает работу, но опять же может быть грязной для поиска по нескольким строкам.
Исключить несколько шаблонов с помощью grep
Мы можем использовать grep с параметром -v или --invert-match, чтобы инвертировать выбор, т. е. исключить предоставленный шаблон из совпадения. Мы можем предоставить несколько строк в список исключений. В этом примере мы хотим, чтобы в /tmp/somefile
были все строки, кроме тех, в которых есть «sshd» или «activated».Поиск нескольких строк с синтаксисом awk
В большинстве случаев прямого использования вы можете просто использовать grep для сопоставления нескольких строк или шаблонов, но для сложных случаев использования мы можем рассмотреть awk в качестве альтернативы. Основной синтаксис для сопоставления одного ШАБЛОНА с awk будет следующим:
Чтобы сопоставить несколько шаблонов:
Сопоставление нескольких шаблонов с условием ИЛИ
Чтобы выполнить поиск строки или шаблона без учета регистра, мы можем использовать следующий синтаксис:
Например, для поиска всех строк, содержащих "Ошибка" или "Предупреждение" в /var/log/messages, мы можем использовать:
Но чтобы не учитывать регистр, в этом примере мы будем использовать IGNORECASE:
Ниже приведен фрагмент с моего сервера:
Поиск нескольких шаблонов с помощью awk
Поиск нескольких шаблонов с условием И
В приведенном выше примере мы ищем шаблон с условием ИЛИ, т. е. если одна из нескольких предоставленных строк найдена, напечатайте соответствующую строку. Но чтобы напечатать строки, когда все предоставленные ШАБЛОН совпадают, мы должны использовать оператор И. Синтаксис будет таким:
Теперь мы будем использовать этот синтаксис для поиска строк, содержащих "Успех" и "активировано" в нашем /tmp/somefile
Для выполнения поиска без учета регистра мы будем использовать следующий синтаксис:
Теперь мы используем этот синтаксис в нашем примере:
Исключение нескольких шаблонов с помощью awk
Мы также можем исключить из поиска определенные предварительно определенные шаблоны. Общий синтаксис будет таким:
В этом синтаксисе мы хотим исключить из поиска все три ШАБЛОНА. Вы можете добавить или удалить дополнительные шаблоны в синтаксисе в зависимости от ваших требований.
Например, чтобы напечатать все строки, кроме тех, которые содержат "активировано"
Сопоставление и печать нескольких строк с помощью синтаксиса sed
В идеале мы используем sed в основном для поиска по шаблону, а затем выполняем действие над шаблоном или строкой поиска, например удаляем, заменяем и т. д. Но мы также можем использовать sed в некоторых конкретных сценариях, чтобы сопоставить один или несколько шаблонов и просто напечатать совпадающий контент из файла.
Синтаксис для сопоставления и печати одного шаблона будет следующим:
Здесь мы используем -n (или вы можете использовать --quiet или --silent ) в сочетании с " p " для печати пространства шаблона, т. е. не печатать, пока не будет найдено соответствие шаблону
Аналогично синтаксис для сопоставления нескольких строк с условием ИЛИ будет следующим:
В качестве альтернативы мы также можем использовать sed с параметром -e для добавления нескольких скриптов (т. е. условий) для соответствия шаблону в нашем случае.
Вы можете добавить или удалить ШАБЛОН, используя предоставленный синтаксис, n раз в зависимости от ваших требований
Например, чтобы сопоставить "активировано" и "перезагружено" в нашем файле
Сопоставление нескольких строк без учета регистра
В sed нет единого аргумента, похожего на awk или grep, для выполнения совпадения без учета регистра для одного или нескольких шаблонов. Поэтому мы должны указать символы верхнего и нижнего регистра возможного символа, для которого, как мы предполагаем, могут быть варианты.
Например, в моем случае есть вероятность, что файл может содержать "успех" или "Успех" с прописной буквой "S", поэтому я поставлю это в наш пример:
Теперь sed будет искать совпадение для " Success " как с прописной, так и с строчной буквой " S ". Поэтому, если вы считаете, что могут быть варианты для большего количества символов, вы должны использовать один и тот же метод для всех таких возможных вариантов
Исключить несколько строк
Мы также можем исключить несколько строк, используя оператор NOT( ! ) в приведенном выше синтаксисе.
Например, чтобы напечатать все строки, кроме тех, в которых есть " sshd " и " reload "
Заключение
В этом руководстве мы узнали о различных инструментах Linux, которые можно использовать для поиска нескольких строк из файла или пути.Самым надежным инструментом в большинстве простых случаев будет grep, но в более сложных сценариях мы можем использовать sed , awk , gawk и т. д. У вас есть гибкость для выполнения сопоставления с использованием регистронезависимых, рекурсивных, исключающих и многих других сценариев с использованием этих инструментов. .
Наконец, я надеюсь, что шаги из статьи по поиску нескольких строк в Linux были полезны. Итак, дайте мне знать ваши предложения и отзывы, используя раздел комментариев.
Похожие записи
Не нашли то, что искали? Выполните быстрый поиск в GoLinuxCloud
Если мои статьи о GoLinuxCloud помогли вам, пожалуйста, купите мне кофе в знак признательности.
Для любых других отзывов или вопросов вы можете использовать раздел комментариев или форму обратной связи.
Global Regular Expression Print или Grep — мощная утилита, используемая в операционной системе Linux. С помощью grep вы можете выполнять поиск в файлах с различными шаблонами или строками, применяя ограничения. Функция Grep использует один или несколько входных файлов для поиска в каталогах или подкаталогах. Для поиска многочисленных паттернов мы используем оператор ИЛИ. Этот оператор используется для разделения шаблонов, записанных в команде. Оператор изменения «|» используется с обратной косой чертой. Синтаксис поиска различных регулярных выражений следующий:
Синтаксис
Регулярное выражение всегда пишется в одинарных кавычках. Два имени разделены обратной косой чертой и оператором изменения. Команда заканчивается именем файла. При выполнении grep recursive вместо одного имени файла используется каталог или полный путь.
Необходимое условие
В этой статье мы изучим функциональность grep при поиске по множеству шаблонов и строк. Для этого на вашем виртуальном ящике должна быть запущена операционная система Linux. Вам необходимо установить его в своей системе. После настройки вам будет доступно использование всех приложений. После входа в систему с вводом пароля перейдите в командную строку оболочки терминала, чтобы продолжить.
Поиск по нескольким шаблонам в файле с помощью Grep
Если мы хотим найти несколько шаблонов или строк в определенном файле, используйте функцию grep для сортировки в файле с помощью более чем одного входного слова в команде. Мы используем операторы ‘\|’ для разделения двух шаблонов в команде.
Эта команда показывает, как работает grep. Оба упомянутых файла будут найдены в файле filea.txt. Искомые слова выделяются во всем тексте вывода.
Для поиска более двух слов мы продолжим добавлять их одним и тем же методом.
Поиск нескольких строк без учета регистра
Чтобы понять концепцию учета регистра в функции grep в Linux, рассмотрим следующий пример. Две команды работают с grep. Один с «-i», а другой без. Этот пример демонстрирует различия между командами. Первый показывает, что в заданном файле будут искать два слова. Однако, как указано в команде «Aqsa», он начинается с заглавной буквы А. Таким образом, он не будет выделен, поскольку в конкретном файле этот текст находится в нижнем регистре.
Будет рассмотрено только слово "сестра", которое будет видно в выводе.
Во втором примере мы проигнорировали чувствительность к регистру, используя флаг «–I». Эта функция будет искать оба слова, и вывод будет выделен. Независимо от того, написано ли слово «Aqsa» заглавными буквами или нет, grep будет искать одно и то же совпадение в тексте внутри файла. Таким образом, обе команды полезны по-своему.
Подсчет нескольких совпадений в файле
Функция подсчета помогает подсчитывать появление слова или слов в определенном файле. Например, если вы хотите узнать об ошибках, возникающих в системе. Детали записываются в файл журналов. Чтобы сохранить эту информацию в определенной папке, вы напишете путь к папкам. В этом примере показано, что в файлах журналов произошла 71 ошибка.
Поиск точных совпадений в файле
Если вы хотите найти точное совпадение в файлах вашей системы, вам нужно использовать флаг «–w» для точной сортировки. Мы привели простой и исчерпывающий пример.В приведенном ниже примере рассмотрите возможность поиска без «–w», эта команда выведет оба слова в соответствии с заданным вводом. Но при использовании флага «–w» поиск будет ограничен, так как входные слова соответствуют только первой строке. Второе слово не выделено, потому что «–w» позволяет точно сопоставить с образцом.
Здесь –I также используется для удаления учета регистра при поиске текста.
Как видно на фото, результаты не совпадают. Первая команда выводит все связанные данные с целыми строками, а вторая команда показывает, насколько точные данные совпадают с помощью grep при поиске нескольких строк.
Grep для более чем одного шаблона в определенном типе расширения файла
Поиск выполняется во всех файлах. Это зависит от вас, если вы будете искать, указав имя файла. Он будет искать только в определенных файлах. Но при указании расширения файла данные будут искаться во всех файлах с таким же расширением. Есть два разных примера для изображения связанного результата. В первом примере файлы ошибок будут учитываться во всех файлах с расширением .log. «–c» используется для подсчета.
Эта команда подразумевает, что файлы будут искать во всех файлах с расширением .log. В выводе будет показано количество совпадений, чтобы лучше продемонстрировать grep с определенным расширением файла.
Во втором примере мы использовали два слова в наших файлах в Linux с расширением текста. Все данные будут отображаться в виде чисел. 0 указывает на отсутствие совпадающих данных, тогда как значение, отличное от 0, указывает на наличие совпадения.
Рекурсивный поиск нескольких шаблонов в файле
По умолчанию используется текущий каталог, если каталог не указан в команде. Если вы хотите искать в каталоге по вашему выбору, вы должны упомянуть об этом. Оператор «-r» используется для grep рекурсивно. /home/aqsayasin/ показывает путь к файлам, тогда как *.txt показывает расширение. Текстовые файлы будут целью grep для рекурсивного поиска.
Желаемый вывод выделяется в результатах, показывающих наличие этих слов.
Заключение
В упомянутой выше статье мы привели различные примеры, чтобы пользователю было проще понять, как работают команды для поиска по множеству шаблонов в Linux. Это руководство поможет вам повысить уровень имеющихся знаний.
Об авторе
Акса Ясин
Я целеустремленный профессионал в области информационных технологий и обожаю писать. Я технический писатель и люблю писать для всех разновидностей Linux и Windows.
Вопрос: можете ли вы объяснить, как использовать операторы ИЛИ, И и НЕ в команде Unix grep, на некоторых примерах?
Ответ: В grep есть опции, эквивалентные операторам ИЛИ и НЕ. Нет оператора grep AND. Но вы можете имитировать И, используя шаблоны. Приведенные ниже примеры помогут вам понять, как использовать ИЛИ, И и НЕ в команде Linux grep.
В следующих примерах используется следующий файл employee.txt.
Из этих примеров команды grep вы уже знаете, что grep чрезвычайно мощен.
Оператор Grep ИЛИ
Используйте любой из следующих 4 методов для grep ИЛИ. Я предпочитаю метод номер 3, упомянутый ниже, для оператора grep OR.
1. Grep ИЛИ Использование \|
Если вы используете команду grep без каких-либо параметров, вам нужно использовать \| чтобы разделить несколько шаблонов для условия или.
Например, grep либо Tech, либо Sales из файла employee.txt. Без обратной косой черты перед вертикальной чертой следующее не будет работать.
2. Grep ИЛИ Использование -E
Опция grep -E предназначена для расширенного регулярного выражения. Если вы используете команду grep с параметром -E, вам просто нужно использовать | чтобы разделить несколько шаблонов для условия или.
Например, grep либо Tech, либо Sales из файла employee.txt. Просто используйте | для разделения нескольких шаблонов ИЛИ.
3. Grep ИЛИ Использование egrep
egrep точно такой же, как ‘grep -E’. Итак, используйте egrep (без каких-либо опций) и разделите несколько шаблонов для условия или.
Например, grep либо Tech, либо Sales из файла employee.txt. Просто используйте | для разделения нескольких шаблонов ИЛИ.
4. Grep ИЛИ Использование grep -e
Используя параметр grep -e, вы можете передать только один параметр. Используйте несколько параметров -e в одной команде, чтобы использовать несколько шаблонов для условия или.
Например, grep либо Tech, либо Sales из файла employee.txt. Используйте несколько параметров -e с grep для нескольких шаблонов ИЛИ.
Grep И
5. Grep AND, используя -E ‘pattern1.*pattern2’
В grep нет оператора AND. Но вы можете имитировать И, используя параметр grep -E.
В следующем примере будут найдены все строки, содержащие слова «Dev» и «Tech» (в том же порядке).
В следующем примере будут найдены все строки, содержащие слова «Менеджер» и «Продажи» (в любом порядке).
Примечание. Использование регулярных выражений в grep очень эффективно, если вы знаете, как их использовать эффективно.
6. Grep AND с использованием команды Multiple grep
Вы также можете использовать несколько команд grep, разделенных вертикальной чертой, для имитации сценария AND.
В следующем примере будут найдены все строки, содержащие слова «Менеджер» и «Продажи» в одной строке.
Грэп НЕ
7. Grep НЕ использует grep -v
Используя grep -v, вы можете имитировать условия NOT. Опция -v предназначена для инвертированного совпадения. т. е. соответствует всем строкам, кроме заданного шаблона.
Например, отобразите все строки, кроме тех, которые содержат ключевое слово «Продажи».
Вы также можете комбинировать НЕ с другим оператором, чтобы получить мощные комбинации.
Например, ниже будет отображаться либо менеджер, либо разработчик (бот игнорирует продажи).
Как добавить в grep условное ИЛИ? Что-то вроде поиска типа файла для (JPEG ИЛИ JPG), а затем отправки только этих файлов в папку с фотографиями. Например. Я знаю, как отправить файл туда, куда я хочу, и получить тип файла, мне просто нужна помощь с частью grep.
Я использую OS X, в которой IMO, похоже, изменила/настроила утилиты *nix, чем то, к чему я привык в среде *nix. Так что, надеюсь, ответы могут быть как можно более общими/переносимыми.
Можно возразить, что в OSX больше двоичных файлов *nix, поскольку в основном она основана на BSD. Я подозреваю, что вы гораздо больше использовали инструменты gnu.
@Zoredache Э-э... конечно! Что ты сказал! Я лучше всего знаком с Debian, хотя пробовал работать со Slackware, CentOS, Gentoo, Ubuntu и некоторыми другими. Debian — мой фаворит, я почти не выношу Gentoo и Ubuntu, а Slackware мне кажется слишком недружелюбным. Я склонен ломать вещи. Тем не менее, это отличный способ учиться.
Вам не нужны регулярные выражения, если вы просто хотите найти разные фиксированные шаблоны. Просто используйте параметр -e для каждого шаблона, который вы хотите сопоставить, или один -F, если вы хотите предоставить их в виде списка, разделенного новой строкой, или -f, если вы хотите прочитать их из файла (см. man grep ). р>
5 ответов 5
Если вы хотите ввести ИЛИ в grep, вводить его с помощью REGEXP — неправильный путь. Вместо этого попробуйте использовать параметр -e для grep:
сопоставит строки с ШАБЛОНОМ1 или ШАБЛОНОМ2.
Я также новичок в регулярных выражениях, но поскольку никто не ответил, я попробую. Оператор трубы "|" используется для оператора ИЛИ.
Следующее регулярное выражение должно вас куда-то направить.
(Найдите что-либо один или несколько раз, после чего в конце укажите "JPG" или "JPEG")
Расширенный ответ (отредактированный после того, как немного узнал о (e)grep): если у вас есть папка со следующими файлами:
(Не тот креатив с именами. )
Сначала мы начнем с определения того, что мы знаем о нашем шаблоне: мы знаем, что ищем конец имени. Следовательно, мы используем операнд «$», чтобы указать, что каждая строка должна заканчиваться определенным шаблоном. Мы знаем, что шаблон должен быть в формате JPEG или JPG. Для этого мы используем конвейер «|» как операнд или. Теперь наш шаблон:
(Совпадение с любой строкой, оканчивающейся на "JPEG" или "JPG")
Однако мы видим, что в этом примере единственным отличием является необязательная буква "Е". Для этого мы можем использовать "?" операнд (что означает необязательный). Пишем:
(Обработайте любой файл, оканчивающийся шаблоном, например: "J", за которым следует "P", за которым следует (необязательно) "E" и за ним "G").
Однако мы также можем сопоставлять файлы со строчными буквами в имени файла. Для этого мы вводим класс символов "[. ]". значение соответствует любому из следующих. Пишем:
(Совпадение с любым файлом, оканчивающимся на at, например: "j" или "J", за которым следует "p" или "P", за которым следует необязательное "e" или "E", за которым следует "g" или " G") (это также можно было бы сделать с помощью параметра "-i" в grep, но я воспринял это как упражнение в REGEX)
Наконец, поскольку мы (надеемся) начинаем видеть шаблон, мы можем опустить ненужные круглые скобки. Поскольку есть только одна необязательная буква («E»), мы можем опустить ее. Кроме того, поскольку файл имеет только этот шаблон для завершения, мы можем опустить начальную и конечную круглые скобки. Таким образом, мы просто получаем:
Наконец; давайте предположим, что вы также хотите найти файлы с типом файла ".jpg", мы можем добавить это как второй параметр:
(Здесь я снова добавил дополнительные скобки для удобочитаемости/группировки. Не стесняйтесь удалять их, если они кажутся запутанными.)
Наконец, я использовал ls и конвейер для отправки всех имен файлов в (e)grep:
Второе редактирование: используя параметр -i и опуская круглые скобки, мы можем сократить его до одного:
Читайте также: