Показать статистику
0 голосов
от (1.7тыс. баллов)
Здравствуйте. Хочу разобраться с командой  grep, в учебнике как-то все сложно расписано,  и не ясно в чем отличие grep, egrep, fgrep, pgrep, zgrep ? Прошу дать простое объяснение использования команд.
1.9тыс. просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)
редактировать от

Grep -  важная команда в Linux. 

Рассмотрим, почему эту команду важно освоить, и как ее можно использовать в повседневных задачах в командной строке.

Давайте углубимся в некоторые объяснения и примеры.

Почему мы используем grep?

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

Давайте посмотрим на некоторые действительно распространенные примеры. Скажем, вам нужно проверить содержимое каталога, чтобы увидеть, существует ли там определенный файл. Это то, для чего вы бы использовали команду «ls».

Но чтобы ускорить весь процесс проверки содержимого каталога, вы можете направить вывод команды ls в команду grep. Давайте посмотрим в нашем домашнем каталоге папку с названием Documents.

$ ls

Desktop        Drafts                   Ваше_имя        'My files'      Samples

Documents      examples.desktop         Linux            Pictures       Templates

Downloads      Favorites                Music            Public         Videos

А теперь давайте попробуем проверить каталог снова, но на этот раз, используя grep, специально для проверки папки «Документы».

$ ls | grep Documents

Documents

Как вы можете видеть на скриншоте выше, использование команды grep сэкономило нам время, быстро изолировав искомое слово от остальной части ненужного вывода, созданного командой ls.

Если папка Documents не существует, grep не вернет ничего. Поэтому, если ничего не возвращает grep, это означает, что он не может найти слово, которое вы ищете.

Найти строку

Если вам нужно искать строку текста, а не просто одно слово, вам нужно заключить строку в кавычки. Например, что, если нам нужно было искать каталог «Мои документы» вместо простого каталога «Документы»?

$ ls | grep 'My Documents'

Grep будет принимать как одинарные, так и двойные кавычки, поэтому оберните текстовую строку любой из них.

Хотя grep часто используется для поиска выходных данных из других инструментов командной строки, вы также можете использовать его для прямого поиска документов. Вот пример, где мы ищем текстовый документ для строки.

$ grep 'Class 1' Students.txt

$ grep 'Todd' Students.txt

Найти несколько строк

Вы также можете использовать grep, чтобы найти несколько слов или строк. Вы можете указать несколько шаблонов, используя ключ -e. Давайте попробуем поискать в текстовом документе две разные строки:

$ grep -e 'Class 1' -e Todd Students.txt

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

Разница между grep, egrep, fgrep, pgrep, zgrep

Различные переключатели grep исторически были включены в различные двоичные файлы. В современных системах Linux вы найдете эти переключатели доступными в команде base grep, но часто дистрибутивы поддерживают и другие команды.

Со страницы руководства для grep:

egrep является эквивалентом grep -E

Этот переключатель будет интерпретировать шаблон как расширенное регулярное выражение . Есть множество разных вещей, которые вы можете сделать с этим, но вот пример того, как выглядит использование регулярного выражения с grep.

Давайте найдем в текстовом документе строки, которые содержат две последовательные буквы «р»:

$ egrep p\{2} fruits.txt

или

$ grep -E p\{2} fruits.txt

fgrep является эквивалентом grep -F

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

$ fgrep $ License.txt
There is a $100 free for commercial use.

pgrep - это команда для поиска имени запущенного процесса в вашей системе и возврата соответствующих идентификаторов процесса. Например, вы можете использовать его, чтобы найти идентификатор процесса демона SSH:

$ pgrep sshd

По функциям это похоже на простую передачу вывода команды 'ps' в grep.

Вы можете использовать эту информацию, чтобы убить работающий процесс или устранить проблемы со службами, работающими в вашей системе.

zgrep используется для поиска сжатых файлов по шаблону. Это позволяет вам искать файлы внутри сжатого архива без необходимости сначала распаковывать этот архив, в основном экономя вам дополнительный шаг или два.

$ zgrep apple fruits.txt.gz

zgrep также работает с tar-файлами, но кажется, что он говорит только о том, удалось ли найти совпадение.

$ zgrep apple fruits.tar.gz

Мы упоминаем об этом, потому что файлы, сжатые с помощью gzip, обычно являются архивами tar.

Разница между find и grep

Для тех, кто только начинает работать с командной строкой Linux, важно помнить, что find и grep - это две команды с двумя совершенно разными функциями, хотя обе они используются для «поиска» чего-то, что указывает пользователь.

Удобно использовать grep для поиска файла, когда вы используете его для поиска в выводе команды ls, как показано в первых примерах.

Однако, если вам нужен рекурсивный поиск имени файла - или части имени файла, можно использовать «find».

$ find /path/to/search -name name-of-file

Поиск рекурсивно

Вы можете использовать ключ -r с grep для рекурсивного поиска по всем файлам в каталоге и его подкаталогах по указанному шаблону.

$ grep -r pattern /directory/to/search

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

Найти вкладку

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

Поставьте пробел или несколько пробелов внутри кавычек, чтобы grep искал этот символ.

$ grep " " sample.txt

Существует несколько различных способов поиска вкладки с помощью grep, но большинство методов являются экспериментальными или могут быть несовместимыми в разных дистрибутивах.

Самый простой способ - просто найти сам символ табуляции, который вы можете создать, нажав Ctrl + V на клавиатуре, после чего нажмите Tab.

Обычно нажатие клавиши tab в окне терминала говорит терминалу, что вы хотите автоматически завершить команду, но предварительное нажатие комбинации ctrl + v приведет к тому, что символ табуляции будет записан так, как вы обычно ожидаете в текстовом редакторе. ,

$ grep "    " sample.txt

Знание этого небольшого трюка особенно полезно при поиске файлов конфигурации в Linux, поскольку вкладки часто используются для отделения команд от их значений.

от (26.4тыс. баллов)
редактировать от
0

Использование регулярных выражений

Функциональность Grep дополнительно расширена за счет использования регулярных выражений, что позволяет повысить гибкость поиска. Существуют некоторые из них, и мы рассмотрим некоторые из наиболее распространенных в примерах ниже:

[ ] скобки используются для соответствия любому набору символов.

$ grep "Class [123]" Students.txt

Эта команда вернет все строки, которые говорят «Class 1», «Class2» или «Class 3».

[-] скобки с дефисом можно использовать для указания диапазона символов, как числовых, так и алфавитных.

$ grep "Class [1-3]" Students.txt

image

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

Символ Caret ^ используется для поиска шаблона, который встречается только в начале строки.

$ grep "^Class" Students.txt

image

[^] скобки с кареткой используются для исключения символов из шаблона поиска.

$ grep "Class [^1-2]" Students.txt

image

Знак доллара $ используется для поиска шаблона, который встречается только в конце строки.

$ grep "1$" Students.txt

image

. точка используется для соответствия любому одному символу, поэтому это подстановочный знак, но только для одного символа.

$ grep "A….a" Students.txt

image

Grep gz файлы без разархивирования

Как мы показали ранее, команда zgrep может использоваться для поиска сжатых файлов без необходимости сначала их разархивировать.

$ zgrep word-to-search /path/to/file.gz

Вы также можете использовать команду zcat, чтобы отобразить содержимое файла gz, а затем передать эти выходные данные в grep, чтобы изолировать строки, содержащие строку поиска.

$ zcat file.gz | grep word-to-search

image

Grep адреса электронной почты из ZIP-файла

Мы можем использовать необычное регулярное выражение для извлечения всех адресов электронной почты из zip-файла.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

Флаг -o будет извлекать только адрес электронной почты , а не показывать всю строку, содержащую адрес электронной почты. 

image

Как и в большинстве вещей в Linux, для этого есть несколько способов. Вы также можете использовать egrep и другой набор выражений. Но приведенный выше пример прекрасно работает и является довольно простым способом извлечения адресов электронной почты и игнорирования всего остального.

Grep IP-адреса

Greping для IP-адресов может быть немного сложным, потому что мы не можем просто сказать, что grep ищет 4 числа, разделенных точками - ну, мы могли бы, но эта команда также может вернуть недопустимые IP-адреса.

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

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log

Мы использовали это на нашем сервере Ubuntu только для того, чтобы увидеть, откуда были сделаны последние попытки SSH.

image

Чтобы избежать повторной информации и захламления вашего экрана, вы можете направить ваши команды grep в «uniq» и «more», как мы делали на скриншоте выше.

   --------------------------------------------------------------------------

Существует несколько различных способов использования условия или с помощью grep, но мы покажем вам тот, который требует наименьшего количества нажатий клавиш и который легче всего запомнить:

$ grep -E 'string1|string2' filename

или, технически используя egrep еще меньше нажатий клавиш:

$ egrep 'string1|string2' filename

Игнорировать чувствительность к регистру

По умолчанию, grep чувствителен к регистру, что означает, что вы должны быть точными в использовании заглавных букв в строке поиска. Вы можете избежать этого, сказав grep игнорировать регистр с ключом -i.

$ grep -i string filename

Поиск с учетом регистра

Что если мы хотим найти строку, где первая может быть прописной или строчной, а остальная часть должна быть строчной? Игнорирование регистра с ключом -i в этом случае не сработает, поэтому простой способ сделать это - заключить в скобки.

$ grep [Ss]tring filename

Эта команда говорит, что grep чувствителен к регистру, кроме первой буквы.

Grep точное совпадение

В наших примерах выше, когда мы ищем в нашем документе строку «apple», grep также возвращает «pineapple» как часть вывода. Чтобы избежать этого и искать строго «apple», вы можете использовать эту команду:

$ grep "\<apple\>" fruits.txt

Вы также можете использовать ключ -w, который сообщит grep, что строка должна соответствовать всей строке. Очевидно, это будет работать только в ситуациях, когда вы не ожидаете, что в остальной части строки будет вообще какой-либо текст.

Исключить шаблон

Чтобы увидеть содержимое файла, но исключить шаблоны из вывода, вы можете использовать ключ -v.

$ grep -v string-to-exclude filename

Как вы можете видеть на скриншоте, исключенная строка больше не отображается, когда мы запускаем ту же команду с ключом -v.

Grep и замена

Команда grep, переданная в sed, может использоваться для замены всех экземпляров строки в файле. Эта команда заменит «string1» на «string2» во всех файлах относительно текущего рабочего каталога:

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

Grep с номером строки

Чтобы показать номер строки, в которой находится ваша строка поиска, используйте ключ -n.

$ grep -n string filename

Показать строки до и после

Если вам нужно немного больше контекста для вывода grep, вы можете показать одну строку до и после указанной строки поиска с помощью ключа -c:

$ grep -c 1 string filename

Укажите количество строк, которые вы хотите показать - в этом примере мы сделали только 1 строку.

Сортировать результат

Передайте вывод grep в команду sort, чтобы отсортировать результаты в некотором порядке. По умолчанию используется алфавитный порядок.

$ grep string filename | sort

Надеюсь, информация была полезной.

...