Книга: Искусство программирования на языке сценариев командной оболочки

Пример 12-11. Мониторинг системного журнала с помощью tail

Пример 12-11. Мониторинг системного журнала с помощью tail

#!/bin/bash

filename=sys.log

cat /dev/null > $filename; echo "Создание / очистка временного файла."

# Если файл отсутствует, то он создается,

#+ и очищается, если существует.

# : > filename и > filename дают тот же эффект.

tail /var/log/messages > $filename

# Файл /var/log/messages должен быть доступен для чтения.

echo "В файл $filename записаны последние строки из /var/log/messages."

exit 0

См. также Пример 12-4, Пример 12-30 и Пример 29-6.

grep

Многоцелевая поисковая утилита, использующая регулярные выражения. Изначально это была команда в древнем строчном редакторе ed, g/re/p, что означает -- global - regular expression - print.

grep pattern [file...]

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

bash$ grep '[rst]ystem.$' osinfo.txt

The GPL governs the distribution of the Linux operating system.

Если файл(ы) для поиска не задан, то команда grep работает как фильтр для устройства stdout, например в конвейере.

bash$ ps ax | grep clock

765 tty1 S 0:00 xclock

901 pts/1 S 0:00 grep clock

-i -- выполняется поиск без учета регистра символов.

-w -- поиск совпадений целого слова.

-l -- вывод только имен файлов, в которых найдены участки, совпадающие с заданным образцом/шаблоном, без вывода совпадающих строк.

-r -- (рекурсивный поиск) поиск выполняется в текущем каталоге и всех вложенных подкаталогах.

The -n option lists the matching lines, together with line numbers.

bash$ grep -n Linux osinfo.txt

2:This is a file containing information about Linux.

6:The GPL governs the distribution of the Linux operating system.

-v (или --invert-match) -- выводит только строки, не содержащие совпадений.

grep pattern1 *.txt | grep -v pattern2

# Выводятся строки из "*.txt", совпадающие с "pattern1",

# но ***не*** совпадающие с "pattern2".

-c (--count) -- выводит количество совпадений без вывода самих совпадений.

grep -c txt *.sgml # (количество совпадений с "txt" в "*.sgml" файлах)

# grep -cz .

# ^ точка

# означает подсчет (-c) непустых ("." -- содержащих хотя бы один символ) элементов,

# разделенных нулевыми байтами (-z)

#

printf 'a bnc dnnnnn00n00e0000nf' | grep -cz . # 4

printf 'a bnc dnnnnn00n00e0000nf' | grep -cz '$' # 5

printf 'a bnc dnnnnn00n00e0000nf' | grep -cz '^' # 5

#

printf 'a bnc dnnnnn00n00e0000nf' | grep -c '$' # 9

# По-умолчанию, в качестве разделителя, принимается символ перевода строки (n).

# Обратите внимание: ключ -z характерен для GNU-версии "grep".

# Спасибо S.C.

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

bash$ grep Linux osinfo.txt misc.txt

osinfo.txt:This is a file containing information about Linux.

osinfo.txt:The GPL governs the distribution of the Linux operating system.

misc.txt:The Linux operating system is steadily gaining in popularity.


Для того, чтобы заставить grep выводить имя файла, когда поиск производится по одному-единственному файлу, достаточно указать устройство /dev/null в качестве второго файла.

bash$ grep Linux osinfo.txt /dev/null

osinfo.txt:This is a file containing information about Linux.

osinfo.txt:The GPL governs the distribution of the Linux operating system.

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

SUCCESS=0 # если найдено совпадение

word=Linux

filename=data.file

grep -q "$word" "$filename" # "-q" -- подавляет вывод на stdout.

if [ $? -eq $SUCCESS ]

then

echo "Образец $word найден в $filename"

else

echo "Образец $word в файле $filename не найден"

fi

Пример 29-6 -- пример поиска заданного образца в системном журнале, с помощью grep.

Оглавление книги


Генерация: 1.202. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз