- Команда Grep в Linux (поиск текста в файлах)
- Командный синтаксис grep
- Искать строку в файлах
- Инвертировать соответствие (исключить)
- Использование Grep для фильтрации вывода команды
- Рекурсивный поиск
- Показать только имя файла
- Поиск без учета регистра
- Искать полные слова
- Показать номера строк
- Подсчет совпадений
- Бесшумный режим
- Основное регулярное выражение
- Расширенные регулярные выражения
- Поиск нескольких строк (шаблонов)
- Строки печати перед матчем
- Печатать строки после матча
- Выводы
- Следующая после целевой строка
- «одно»строк hw на a[i] == *(i+a) и «str»[i] == *(«str
″+i)
Команда 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 )
Источник