Grep вывести следующую строку

Команда Grep в Linux (поиск текста в файлах)

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

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

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

Командный синтаксис grep

Синтаксис команды grep следующий:

Пункты в квадратных скобках необязательны.

  • OPTIONS — Ноль или более вариантов. Grep включает ряд опций , управляющих его поведением.
  • PATTERN — Шаблон поиска.
  • FILE — Ноль или более имен входных файлов.

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

Искать строку в файлах

Наиболее простое использование команды grep — поиск строки (текста) в файле.

Например, чтобы отобразить все строки, содержащие строку bash из файла /etc/passwd , вы должны выполнить следующую команду:

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

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

Инвертировать соответствие (исключить)

Чтобы отобразить строки, не соответствующие шаблону, используйте параметр -v (или —invert-match ).

Например, чтобы распечатать строки, не содержащие строковый nologin вы должны использовать:

Использование Grep для фильтрации вывода команды

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

Например, чтобы узнать, какие процессы выполняются в вашей системе как пользовательские www-data вы можете использовать следующую команду ps :

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

Рекурсивный поиск

Для рекурсивного поиска шаблона вызовите grep с параметром -r (или —recursive ). Когда используется этот параметр, grep будет искать все файлы в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно.

Чтобы следовать по всем символическим ссылкам , вместо -r используйте параметр -R (или —dereference-recursive ).

Вот пример, показывающий, как искать строку linuxize.com во всех файлах внутри каталога /etc :

Вывод будет включать совпадающие строки с префиксом полного пути к файлу:

Если вы используете опцию -R , grep будет следовать по всем символическим ссылкам:

Обратите внимание на последнюю строку вывода ниже. Эта строка не печатается, когда grep вызывается с -r потому что файлы внутри каталога с sites-enabled Nginx являются символическими ссылками на файлы конфигурации внутри каталога с sites-available .

Показать только имя файла

Чтобы подавить вывод grep по умолчанию и вывести только имена файлов, содержащих совпадающий шаблон, используйте параметр -l (или —files-with-matches ).

Приведенная ниже команда выполняет поиск по всем файлам, заканчивающимся на .conf в текущем рабочем каталоге и выводит только имена файлов, содержащих строку linuxize.com :

Результат будет выглядеть примерно так:

Параметр -l обычно используется в сочетании с рекурсивным параметром -R :

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

По умолчанию grep чувствителен к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

Чтобы игнорировать регистр при поиске, вызовите grep с параметром -i (или —ignore-case ).

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

Но если вы выполните поиск без учета регистра с использованием параметра -i , он будет соответствовать как заглавным, так и строчным буквам:

Указание «Зебра» будет соответствовать «зебре», «ZEbrA» или любой другой комбинации букв верхнего и нижнего регистра для этой строки.

Искать полные слова

При поиске строки grep отобразит все строки, в которых строка встроена в строки большего размера.

Например, если вы ищете «gnu», все строки, в которых «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum», будут найдены:

Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, отличные от слов), используйте параметр -w (или —word-regexp ).

Если вы запустите ту же команду, что и выше, включая параметр -w , команда grep вернет только те строки, где gnu включен как отдельное слово.

Показать номера строк

Параметр -n (или —line-number ) указывает grep показывать номер строки, содержащей строку, соответствующую шаблону. Когда используется эта опция, grep выводит совпадения на стандартный вывод с префиксом номера строки.

Например, чтобы отобразить строки из файла /etc/services содержащие строку bash префиксом совпадающего номера строки, вы можете использовать следующую команду:

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

Подсчет совпадений

Чтобы вывести количество совпадающих строк в стандартный вывод, используйте параметр -c (или —count ).

В приведенном ниже примере мы подсчитываем количество учетных записей, в которых в качестве оболочки используется /usr/bin/zsh .

Бесшумный режим

-q (или —quiet ) указывает grep работать в тихом режиме, чтобы ничего не отображать на стандартном выводе. Если совпадение найдено, команда завершает работу со статусом 0 . Это полезно при использовании grep в сценариях оболочки, где вы хотите проверить, содержит ли файл строку, и выполнить определенное действие в зависимости от результата.

Вот пример использования grep в тихом режиме в качестве тестовой команды в операторе if :

Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

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

Ниже приведен список наиболее часто используемых метасимволов:

Используйте символ ^ (каретка) для сопоставления выражения в начале строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом начале строки.

Используйте символ $ (доллар), чтобы найти выражение в конце строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом конце строки.

Используйте расширение . (точка) символ, соответствующий любому одиночному символу. Например, чтобы сопоставить все, что начинается с kan затем имеет два символа и заканчивается строкой roo , вы можете использовать следующий шаблон:

Используйте [ ] (скобки) для соответствия любому одиночному символу, заключенному в квадратные скобки. Например, найдите строки, содержащие accept или « accent , вы можете использовать следующий шаблон:

Используйте [^ ] для соответствия любому одиночному символу, не заключенному в квадратные скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих co(any_letter_except_l)a , например coca , cobalt и т. Д., Но не будет соответствовать строкам, содержащим cola ,

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

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

Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или —extended-regexp ). Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для создания более сложных и мощных шаблонов поиска. Вот несколько примеров:

Сопоставьте и извлеките все адреса электронной почты из данного файла:

Сопоставьте и извлеките все действительные IP-адреса из данного файла:

Параметр -o используется для печати только соответствующей строки.

Поиск нескольких строк (шаблонов)

Два или более шаблонов поиска можно объединить с помощью оператора ИЛИ | .

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

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

Если вы используете опцию расширенного регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:

Строки печати перед матчем

Чтобы напечатать определенное количество строк перед совпадающими строками, используйте параметр -B (или —before-context ).

Например, чтобы отобразить пять строк ведущего контекста перед совпадающими строками, вы должны использовать следующую команду:

Печатать строки после матча

Чтобы напечатать определенное количество строк после совпадающих строк, используйте параметр -A (или —after-context ).

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

Выводы

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

Подробнее о Grep можно узнать на странице руководства пользователя Grep .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

Следующая после целевой строка

В общем есть текст типа:

Но фигу там, не сработало. То ли переносы какие-то другие, то ли так вообще нельзя. Как поступить? Некоторые NameM могут отсутствовать. В таком случае мне нужно либо значение пустой строки, либо «Name1 : x»

grep -A1? Вопрос не дочитал.

Тебя предупреждали что парсирнг хмла регэкспами это путь в никуда. Да и хоть сколько-нибудь сложное приложение на баше в общем-то тоже.

Попробуй избавиться от всех \s и дальше что-нибудь из этого треда.

Если действовать так, то показывает обе строки. Мне же нужно в одну строку — либо «Name1 : Value1» либо только «Value1».

Во первых grep -A1, а во вторых прочти уже наконец info sed:

Видишь тут волшебную команду «N»? Она нужна потому что sed работает построчно. Считывая одну строку без символа перевода строки на конце. При считывании сразу двух строк в pattern space они уже разделаются символом перевода строки.

И кроме того, может всё таки прислушаешься к совету sdio и воспользуешься библиотеками для работы с html, вместо этих костылей на sed/grep/и т.п.?

Если действовать так, то показывает обе строки. Мне же нужно в одну строку — либо «Name1 : Value1» либо только «Value1».

Б-же, да где вы здесь парсинг xml увидели? Откройте исходник страницы профиля и возьмите с полки пряник, если найдете отличия между записью «Новости» и «Галерея» в таблице.

Откройте исходник страницы профиля

Вижу тут html. Собственно после фразы

уже очевидно, что нужно парсить исходник в формате html подходящими для разбора html средствами, а не скриптами на sed.

В первом td ключ, во втором значение.

Еще раз перечтите ОП пост и посмотрите, какие строки я вынимаю.

Еще раз перечтите ОП пост и посмотрите, какие строки я вынимаю

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

ССЗБ. Зачем вообще ты так пережевал данные?

Впрочем и так можно цикл по строкам организовать вместо возьни с регэкспами кстати. Даже баш должен это уметь.

Смысл в цикле по 4-м значениям, если то же самое делается в 4 строки?

Больная голова инструментам покоя не даёт.

И тут мы снова возвращаемся к парсингу хмла регэкспами на баше.

У меня на яваскрипте кстати тоже 4 получилось не считая инициализации:

Кстати, раз уж ты упорно разбираешь HTML шелл-скриптами, то посмотри хотя бы утилиту html2 — обработка grep/sed/awk станет куда проще.

Блин, да вы хоть раз смотрели в исходники? Откуда такая уверенность, что я разбираю html руками?

посмотри аwk в нём состояния и хэш для хранения пар.

тоже самое perl .

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

Для конкретной задачи из поста sed подходит как микроязык для потоковой обработки текста. На нём вещи и похуже делают. Например info sed ‘wc -c’

речь об этом же sed тьюринг полон однако на нём операционку не пракрично мутить

Откуда такая уверенность, что я разбираю html руками?

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

Даже если предположить что код lor’а меняться не будет, что вряд ли, всегда может измениться твоя дампилка. Вот например

показывает что дамп может выглядеть и по другому

ну во первых, самое простое — склеить все строчки попарно. типа sed ‘N;s/\n/ /’

ЗЫЖ нужно конечно проверить особый случай, когда нет в принципе.

ЗЗЫЖ в «строчке» будут символы \n, но они не мешают. Обычный пробельный символ. Матчится [[:space:]] и \s.

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

для такой тривиальной задачи выбирать анализатор непрактично. Помнится мне нужно было поставить на одном из чужих серверов VCS, для контроля файлов, и меня послали с моим mercurial’ом. Ибо питон, а тамошние одмины не любили питон. Они любили перловку. Дык я за час набросал sed-скрипт, который полностью реализовал нужный мне функционал. Уже третий год этот скрипт работает. Т.ч. смысл в велосипедах иногда таки есть.

ага.
тут мировозренческое
сундук со специализироваными (одна-функция) или «русский»(асиметричный) «топор»[китайская сапёрская лопата(утуб ими полон)] которые комбайны.

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

http://www.ioccc.org/years-spoiler.html#1984_anonymous
вполне полезный для развития понимания языка пример hello_word-программы
зы. современые компиляторы не проверяет семантику идентификатора на соответствие с выполняемыми с_ним|им действиями.
следовательно со временем(в ходе появления более продвинутых версий(sed и тп)) происходит увеличение зазора между семантикой имени и семантикой обьекта с этим именем.

попробуй кстати ssam ( скрипт на основе sam ) по функции в томже отношении к sam как sed к ed

у sam в отличии от ed нет деления всего файла на строки при поиске регулярных выражений ( там конечно есть строковая адрессация,но не так всеобемлюща как в sed) в результате нужный тебе поиск пар стрэйтфорвард вполне.

вполне полезный для развития понимания языка пример hello_word-программы

вы таки про какую именно программу? там много разных сцылок.

в сылке #anonymous в котором (1984) в стиле K&R однострочник hello-world(без цветовой подстветки можно и не заметить конструкии [«] ) — эдакий экскурс по тёмным(до сих пор законым) местам которые в tutoriаl’ах в хеловорды не пихают

дык приведи этот однострок. А то ведь потом скажешь: „я не это имел ввиду!“

«одно»строк hw на a[i] == *(i+a) и «str»[i] == *(«str\0″+i)

жуть какая.. и что это значит?

ну быдлокод как быдлокод. Что ту странного-то? Разве что в виде однострока непонятно. Но если развернуть:

тут всё понятно.
речь о «вечном» идентификаторы «ложные друзья переводчика программиста»

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

компилятор ни коментарии не чекает на соответствие коментируемому , ни идентификаторы на смысловое соответствие .

дык в C/C++ имена переменных и не несут никакой смысловой нагрузки, и могут быть с лёгкость заменены например на v0, v1, v2. Программа от этого работать будет не хуже. В данном быдлокоде это ещё и не всё: быдлокодер обыграл и другие грабли С, а именно отсутствие массивов. Ну нет в С массивов, есть только константные указатели. Ну и операция разименования такого указателя есть, называется a[ptr_diff], и на самом деле значит она всего лишь сложение указателя (не обязательно константного) с величиной типа ptr_diff, которая получается при вычитании указателей. Ну и конечно можно её и из int сделать. А массивов таки и нет, хотя с виду они есть. Потому-то многим кодерам и рвёт шаблон выражение i[«] ★★ ( 04.05.12 13:29:37 )

Источник

Читайте также:  1с вывести предупреждение пользователю не модально
Оцените статью