Linux не работает grep

Обновлено: 04.07.2024

Оригинал:
Автор: Алексей Дмитриев
Дата: 3 января 2009

Введение

Команда grep служит для поиска строк, содержащих заданный пользователем образец.

grep ОБРАЗЕЦ имя_файла

Причем обязательным для ввода является только ОБРАЗЕЦ, можно обойтись даже без имени файла (аргумента).

Команда grep без опций и аргумента.

Если не указано имени файла, то команда обрабатывает стандартный ввод, например строки, набранные на клавиатуре:

Тут мы подошли к очень важному определению строки. Строкой команда grep (как и все остальные команды Юникс) считает все символы, находящиеся между двумя символами новой строки. Эти невидимые на экране символы возникают в тексте каждый раз, когда пользователь нажимает клавишу Enter. В Юниксовидных системах символ новой строки обозначается обратным слэшем с буквой n (n). Таким образом, строка может быть любого размера, начиная с одного символа и до многомегабайтного текста. И команда grep честно выведет эту строку, при условии, что она содержит ОБРАЗЕЦ.

Работа с файлами

Команда grep может обрабатывать любое количество файлов одновременно. Создадим три файла:

И дадим команду:

Команда grep вовсе не ограничена одним выражением в качестве ОБРАЗЦА, можно задавать хоть целые фразы. Только их нужно заключать в кавычки (одинарные или двойные):

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

Создадим директорию /example, в которую поместим файлы наших примеров: 123.txt, ast.txt, alice.txt и дадим команду:

То есть мы приказали просмотреть все файлы директории /example. Таким способом можно обследовать такие огромные директории как /usr, /dev, и любые другие.

Опция -r

Еще больше увеличит зону поисков опция -r, которая заставит команду grep рекурсивно обследовать все дерево указанной директории, то есть субдиректории, субдиректории субдиректорий, и так далее вплоть до файлов. Например:

Опция -i

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

Опция -c

Эта опция не выводит строки, а подсчитывает количество строк, в которых обнаружен ОБРАЗЕЦ. Например:

То есть в восьми строках файла /etc/group встречается сочетание символов root.

Опция -n

При использовании этой опции вывод команды grep будет указывать номера строк, содержащих ОБРАЗЕЦ:

Опция -v

Опция -w

Заставит команду grep искать только строки, содержащие все слово или фразу, составляющую ОБРАЗЕЦ. Например:

находит точное соответствие в файле alice.txt.

Опция -x

Еще более строгая. Она отберет только те строки исследуемого файла или файлов, которые полностью совпадают с ОБРАЗЦОМ.

Внимание: Мне попадались (на собственном компьютере) версии grep (например, GNU 2.5), в которых опция -x работала неадекватно. В то же время, другие версии (GNU 2.5.1) работали прекрасно. Если что-то не ладится с этой опцией, попробуйте другую версию, или обновите свою.

Опция -l

Команда grep с этой опцией не возвращает строки, содержащие ОБРАЗЕЦ, но сообщает лишь имена файлов, в которых данный образец найден:

Замечу, что сканирование каждого из заданных файлов продолжается только до первого совпадения с ОБРАЗЦОМ.

Опция -L

Наоборот, сообщает имена тех файлов, где не встретился ОБРАЗЕЦ:

Если мы хотим искать по другим параметрам файла, а не по его имени, то следует применить команду ls -l, которая выводит файлы со всеми параметрами:

И вот мы получили список всех файлов, модифицированных 30 декабря 2008 года.

Немного хитростей

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

Хитрость первая

То никакого имени файла там не будет. Но стоит добавить в аргументы еще один файл, как все заработает. Обычно, чтобы избежать неожиданностей, указывают файл /dev/null:

Хитрость вторая

Это был файл kot.txt целиком.

А это были слова, оканчивающиеся на -kot.

Эти начинаются на kot-.

Прошу простить за транслитерацию, но с нашими буквами эта хитрость как-то не срабатывает, а с английскими словами не все поймут.

Хитрость третья.

Как быть, если ОБРАЗЕЦ начинается с дефиса, ведь команда примет его за опцию?

Совсем другое дело.

Хитрость четвертая.

Как посмотреть соседние строчки?

Просмотр вверх и вниз на две строки.

Просмотр вниз на одну строку.

Просмотр вверх на одну строку.

Хитрость пятая.

Хитрость шестая.

Как искать строки, содержащие несколько ОБРАЗЦОВ?

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

Хитрость седьмая, и пока последняя.

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

Внимание: Если перед дефисом и после него не будет пробелов, то команда не сработает.

Но настало время вернуться к опциям команды grep.

Пока я занимался хитростями, успел позабыть, какие из опций уже описал, а какие нет. Поэтому я дал команду:

и получил файл option.txt, в котором перечислены все фигурирующие в файле grep-ru.txt опции.

Общее количество опций программы подавляет, поэтому пойдем по алфавиту, пропуская те, что я уже описал.

Опция -f имя_файла

Весьма полезная опция, когда нужно искать несколько ОБРАЗЦОВ, причем не в одной строке, как мы делали в шестой Хитрости, а в разных. Для того чтобы воспользоваться этой опцией, нужно составить файл, в котором поместить искомые ОБРАЗЦЫ по одному на строчке:

А затем дать команду:

Опция -o

Возвращает не всю строку, где найдено соответствие ОБРАЗЦУ, а только совпадающую с ОБРАЗЦОМ часть строки.

А вот с опцией -o:

Опция -q

Опция -s

Предупреждение: традиционные версии последних двух опции (-q и -s) не соответствуют стандарту POSIX.2 и не совпадают с GNU версиями. Поэтому их нельзя применять в скриптах для командной оболочки. Просто перенаправляйте вывод на /dev/null.

С этими тремя опциями мы уже познакомились в четвертой Хитрости, они позволяют посмотреть соседние строки. -A: количество строк после совпадения с ОБРАЗЦОМ, -B: количество строк перед совпадением, и -C: количество строк вокруг совпадения.

Выделяет найденные строки цветом. Значения КОГДА могут быть: never (никогда), always (всегда), или auto. Пример:

Опция -D ДЕЙСТВИЕ

Если исследуемый файл является файлом устройства, FIFO (именованным каналом) или сокетом, то следует применять эту опцию. ДЕЙСТВИЙ всего два: read (прочесть), и skip (пропустить). Если вы указываете ДЕЙСТВИЕ read (используется по умолчанию), то программа попытается прочесть специальный файл, как если бы он был обычным файлом; если указываете ДЕЙСТВИЕ skip, то файлы устройств, FIFO и сокеты будут молча проигнорированы.

Опция -d ДЕЙСТВИЕ

Опция -H

Выдает имя файла для каждого совпадения с ОБРАЗЦОМ. Мы успешно делали это без всяких опций в Хитрости второй.

Опция -h

Подавляет вывод имен файлов, когда задано несколько файлов для исследования.

Опция -I

При рекурсивном исследовании директорий обследовать только файлы, содержащие в своем имени ОБРАЗЕЦ_имени_файла.

При рекурсивном исследовании директорий пропускать файлы, содержащие в своем имени ОБРАЗЕЦ_имени_файла.

Опция -m ЧИСЛО_СТРОК

Прекратить обработку файла после того, как количество совпадений с ОБРАЗЦОМ достигнет ЧИСЛА_СТРОК:

Опция -y

Синоним опции -i (не различать верхний и нижний регистр символов).

Опции -U и -u применяются только под MS-DOS и MS-Windows, тут нечего о них говорить.

Использует системный вызов mmap вместо системного вызова read. Может дать лучшую производительность, а может привести к ошибкам. Это для продвинутых пользователей.

Опция -Z

Опция -z

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

Команда grep и регулярные выражения

Тема регулярных выражений настолько обширна, что требует для своего освещения отдельной статьи; в данной статье мы не будем ее подробно разбирать. Скажу лишь, что существует несколько версий синтаксиса регулярных выражений: Базовый (basic) BRE, Расширенный (extended) ERE и регулярные выражения языка Perl.

Опция -G

Рассматривает ОБРАЗЕЦ как базовое регулярное выражение. Эта опция используется по умолчанию.

Опция -E

Рассматривает ОБРАЗЕЦ как расширенное регулярное выражение.

Опция -P

Рассматривает ОБРАЗЕЦ как регулярное выражение языка Perl.

Опция -F

Кроме того, существуют две альтернативные команды EGREP и FGREP. Обе они соответствуют опциям -E и -F соответственно.

Команда grep и символы кириллицы.

Резюме команды grep

Команда grep настолько полезна, многофункциональна и проста в употреблении, что, однажды познакомившись с ней, невозможно представить себе работу без нее. Особенно полезна эта команда в качестве фильтра в составе программных каналов (pipes).

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

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

Что такое grep?

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

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

Синтаксис grep

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

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

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

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

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

Опции

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

Все самые основные опции рассмотрели и даже больше, теперь перейдём к примерам работы команды 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 "9" /var/log/Xorg.0.log

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

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

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: <Directory /var/www/localhost/htdocs/zendsite>

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

grep -h -r "zendsite" /etc/apache2/

ServerName zendsite.localhost
DocumentRoot /var/www/localhost/htdocs/zendsite
<Directory /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. При правильном применении эта утилита станет мощным инструментом в ваших руках. Если у вас остались вопросы, пишите в комментариях!

Изменить: я не знаю, почему я не понял, что вы можете загрузить монетный двор . Я полагаю, вы используете систему с двойной загрузкой. Я понимаю, что есть некоторые обстоятельства, при которых Windows не будет работать, если вы отключите безопасную загрузку, и если вы захотите снова включить ее, возможно, ваш компьютер должен быть сброшен на заводский (звучит уродливо). Я где-то читал, что то, что работает для двойной загрузки, - отключить CSM и включить защищенную загрузку.

Это говорит о том, что вы, как и раньше, отлично работали, и после обновления вы получаете безопасную загрузку, я думаю, вы также обновили свое ядро ​​(?). Итак, что следует из этого предположения.

Из вашего живого usb (или cd, если он дошел до него), откройте терминал (ctrl-alt-t) и введите

. Конечно, это нижний регистр «L».

Это приведет к отображению ваших устройств, указав корень звездочкой (*). Он должен выглядеть примерно так:

Device Boot Start End Sectors Size Id Type /dev/sda1 * 2048 50857983 50855936 24.3G 83 Linux /dev/sda2 50860030 52426751 1566722 765M 5 Extended /dev/sda5 50860032 52426751 1566720 765M 82 Linux swap / Solaris

sudo mkdir mnt sudo mount /dev/sda1 mnt sudo mount --bind /dev mnt/dev sudo mount --bind /proc mnt/proc sudo mount --bind /sys mnt/sys sudo cp /etc/resolv.conf mnt/etc/resolv.conf sudo chroot mnt

В этот момент он должен изменить ваше приглашение на что-то вроде:

apt-get install linux-image-generic

Возможно, это часть проблема, поэтому, возможно, вам нужно установить linux-signed-image-generic вместо

update-grub exit sudo umount mnt/sys sudo umount mnt/proc sudo umount mnt/dev sudo umount mnt

И для хорошей меры:

Этот последний набор команд «umount» важен. Не забудьте удалить все, что вы вручную установили.

Теперь перезагрузитесь (не забудьте удалить свои живые медиа).

Как и в случае с ядром, вам может понадобиться подписанный grub. Shim - это программа, предназначенная для загрузки загружаемых загрузчиков с загрузкой по цепочке, поэтому, возможно, прокладка - это то, что вам нужно установить / обновить / поцеловать на лбу и проверить ее температуру. Как правило, я видел обновление работы grub без необходимости установки нового изображения. Когда дело доходит до шайбы или подписанной операционной системы, я откровенно немного дальше из глубины.

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

Если вы загружаете командную строку grub, а не команду командной строки grub rescue (последняя буквально говорит «спасение grub» в подсказке), попробуйте ввести exit, чтобы посмотреть, как это происходит. Если он дает вам обычный экран grub, вы сможете загрузить операционную систему. Если вы можете это сделать, откройте терминал и сделайте sudo update-grub. Я не могу обещать, что это ваше решение.

Еще одна вещь, которую вы можете попробовать (разумеется, это может представлять угрозу безопасности) открывает вашу BIOS и отключает « Безопасная загрузка ».

Всё про Команду Grep в Linux + Практические Примеры

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

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

В этом коротком руководстве, мы покажем, как использовать команду grep в Linux (Unix). А также подкрепим теоретический материал полезными примерами из повседневного рабочего процесса.

Как использовать команду Grep?

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

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

Сначала давайте подключимся к VPS с помощью SSH. Вот статья, в которой показано, как это сделать с помощью PuTTY SSH.

Если на вашем компьютере вы используете Linux, просто откройте терминал.

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

  • grep — команда
  • [опции] — модификаторы команды
  • значение — поисковый запрос
  • [ФАЙЛ] — файл, в котором вы выполняете поиск

Вы можете просмотреть документацию и пояснения к различным опциям команды, введя в командной строке:

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

  • -i — поиск не будет чувствителен к регистру. То есть, если вы хотите найти слово «автомобиль», написанные как «АВТОМОБИЛЬ» слова тоже будут найдены.
  • -c — покажет только количество строк, содержащих поисковый запрос
  • -r — включает рекурсивный поиск в текущем каталоге
  • -n — выведет номера строк, содержащих поисковый запрос
  • -v — обратный поиск, выводит только строки, в которых нет указанного поискового запроса

Полезные примеры Grep

Давайте разберём несколько практических примеров команды grep.

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

Чтобы найти слово в текстовом файле, просто введите команду:

  • запрос — слово, которое вы ищете
  • файл — файл, в котором вы ищете слово

В нашем случае мы ищем слово command в файле с именем grep:

В выводе, слова, соответствующие поисковому запросу будут выделены следующим образом:

Найденные с помощью команды Grep слова, віделенніе краснім в терминале Linux

Поиск слово, игнорируя регистр

Для этого необходимо добавить опцию -i.

Количество найденных слов по целевому запросу

Используя эту команду, вы также можете узнать, сколько раз определённое слово используется в текстовом файле. Просто добавьте опцию -c.

Поиск по нескольким ключевым словам

До сих пор мы искали только одно слово. Однако grep позволяет использовать несколько поисковых запросов в одной команде. Вот как это выглядит:

Команда работает очень просто. Сначала мы ищем запрос1, а затем с помощью вертикальной черты и grep продолжаем поиск второго слова — запрос2.

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

Также вы можете искать слово в нескольких файлах одновременно с помощью одной команды:

Файлы, содержащие слово, которое вы искали, будут выведены в терминал.

Итоги

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

В этом посте вы узнали основные функции команды grep в Linux. Однако мы рекомендуем не останавливаться на достигнутом и ознакомиться с официальной документацией. Удачной разработки вам и успешных проектов!

Ольга уже около пяти лет работает менеджером в сфере IT. Написание технических заданий и инструкций — одна из её главных обязанностей. Её хобби — узнавать что-то новое и создавать интересные и полезные статьи о современных технологиях, веб-разработке, языках программирования и многом другом.

Читайте также: