Администрирование FreeBSD, Linux, ... grep: примеры использования Mon, January 23 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

grep: примеры использования Печать
Добавил(а) microsin   

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

Например, команда

# grep gregor /etc/passwd

выдаёт строку

gregor:*:1001:1001:gregorlgn:/home/gregor:/bin/sh

что говорит о том, что командный интерпретатор для пользователя gregor - sh.

Например, следующая команда выводит список скриптов, в содержимом которых содержится слово test (поиск стартует рекурсивно с корневого каталога):

# find / -name "*.sh" | grep test

% ps -ax | grep inetd
  198  ??  IWs    0:00.00 inetd -wW

temp=`eval ifconfig $outside | grep -E -o --max-count=1 --regexp=$regex`

Здесь в переменную $temp записывается результат фильтрации вывода ifconfig. Опция -E включает использование регулярных выражений в шаблоне (grep -E синоним egrep), -o включает вывод не всей строки, а только то, что совпало с шаблоном, --regexp задает шаблон - регулярное выражение.

Следующая строка ищет все строки, в которых встречается слово cdp (locate cdp), но не встречается слово cdplay (grep -v cdplay):

# locate cdp | grep -v cdplay | more

Идея простая - grep ищет слова 25%, 50%, 75% и 100%, и выдает 52 строки перед совпадением:

# more pinglog.txt | grep -f ping_patterns.txt -B 52 > pinglog_filtered.txt

Теперь комментарии. Входной файл, как вы уже догадались pinglog.txt, выводит на вход grep команда more. Опция -f указывает grep брать паттерны для совпадения из файла ping_patterns.txt. Содержимое ping_patterns.txt (не забываем в конце этого файла указать возврат каретки):

25%
50%
75%
100%

Далее опция -B указывает включить в вывод grep еще 52 строки ПЕРЕД местом, где обнаружено совпадение с паттерном. Таким образом, в файл pinglog_filtered.txt попадет только то, что нам нужно.

tail -f /var/www/httpd-logs/mydomain.ru.access.log | grep -o http://.*.html | uniq

Результат:

http://microsin.net/adminstuff/hardware/s-pen-galaxy-note-inside.html
http://microsin.net/adminstuff/others/russia-post-sending.html
http://microsin.net/programming/AVR/avr077-opto-isolated-emulation-for-the-debugwire.html
http://microsin.net/adminstuff/windows/ux32vd-install-windows7-on-integrated-ssd.html
http://microsin.net/adminstuff/hardware/relay-and-transistor-as-electronic-switches.html
http://microsin.net/adminstuff/hardware/relay-and-transistor-as-electronic-switches.html
http://microsin.net/adminstuff/others/altium-designer-howto.html
http://microsin.net/programming/PC/c-sharp-faq.html
http://microsin.net/programming/AVR/atmega-ct1-pulse-counting.html
http://microsin.net/adminstuff/windows/move-windows-xp-to-new-hardware.html
http://microsin.net/programming/PC/dll-building-and-using.html
http://microsin.net/adminstuff/cisco/qos-setup-example.html

В этом примере опция -o для grep указывает выводить только части совпадения с шаблоном "http://.*.html", а команда uniq оставляет только уникальные (не повторяющиеся друг за другом) строки.

 

Комментарии  

 
0 #4 pl 05.04.2011 00:52
Можно ли возможности grep использовать в скриптах на языке программировани я python? Т. е. как встроить вызов grep в python-программу?

microsin: grep всего лишь придуман для обработки и фильтрации строк. Для этой цели (вместо grep) в Python лучше использовать регулярные выражения (Regular Expressions, RegEx). С помощью регулярных выражений в Python Вы сможете сделать все то же самое, что можно делать с помощью grep. Кстати, grep в своих фильтрах также использует регулярные выражения.
Цитировать
 
 
0 #3 Peter 26.12.2010 02:40
Спасибо за [url='http://ya.ru']материал
Цитировать
 
 
0 #2 alexandra 17.10.2010 19:31
Не работает, потому, что на вход grep'у подается список файлов (+путь), которые нашел find. В именах этих файлов grep пытается найти "test". Чтобы выаолнить grep для каждого файла, который нашел find используйте опцию -exec.
Например вот так:

# find / -name "*.sh" - exec grep test {} /;
Цитировать
 
 
0 #1 Маша 13.10.2010 14:20
Спасибо за материал про этот grep, но эта конструкция у меня почему-то не работает:
# find / -name "*.sh" | grep test
Нужно вывести все файлы, где встречается заданное слово. Подскажите как сделать?
Цитировать
 

Добавить комментарий


Защитный код
Обновить

Top of Page