Шрифт:
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.
Пример 12-12. Сценарий-эмулятор "grep"
#!/bin/bash
# grp.sh: Очень "грубая" реализация 'grep'.
E_BADARGS=65
if [ -z "$1" ] # Проверка наличия аргументов.
then
echo "Порядок использования: `basename $0` pattern"
exit $E_BADARGS
fi
echo
for file in * # Обход всех файлов в $PWD.
do
output=$(sed -n /"$1"/p $file) # Подстановка команд.
if [ !
– z "$output" ] # Что произойдет, если кавычки вокруг "$output" убрать?
then
echo -n "$file: "
echo $output
fi # эквивалент: sed -ne "/$1/s|^|${file}: |p"
echo
done
echo
exit 0
# Упражнения:
# ---------
# 1) Добавьте вывод символов перевода строки, если найдено более одного совпадения в любом из файлов.
# 2) Добавьте обработку различных ключей.
fgrep– - то же самое, что и grep -F. Эта команда выполняет поиск строк символов (не регулярных выражений), что несколько увеличивает скорость поиска.
Утилита agrep имеет более широкие возможности поиска приблизительных совпадений. Образец поиска может отличаться от найденной строки на указанное число символов.
Для поиска по bzip-файлам используйте bzgrep.
look
Команда look очень похожа на grep, и предназначена для поиска по "словарям" -- отсортированным файлам. По-умолчанию, поиск выполняется в файле /usr/dict/words, но может быть указан и другой словарь.
Пример 12-13. Поиск слов в словаре
#!/bin/bash
# lookup: Выполняется поиск каждого слова из файла в словаре.
file=words.data # Файл с искомыми словами.
echo
while [ "$word" != end ] # Последнее слово в файле.
do
read word # Из файла, потому, что выполнено перенаправление в конце цикла.
look $word > /dev/null # Подавление вывода строк из словаря.
lookup=$? # Код возврата команды 'look'.