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) Добавьте обработку различных ключей.
egrep -- то же самое, что и grep -E. Эта команда использует несколько отличающийся, расширенный набор регулярных выражений, что позволяет выполнять поиск более гибко.
fgrep -- то же самое, что и grep -F. Эта команда выполняет поиск строк символов (не регулярных выражений), что несколько увеличивает скорость поиска.
Утилита agrep имеет более широкие возможности поиска приблизительных совпадений. Образец поиска может отличаться от найденной строки на указанное число символов.
Для поиска по сжатым файлам следует использовать утилиты zgrep, zegrep или zfgrep. Они с успехом могут использоваться и для не сжатых файлов, но в этом случае они уступают в скорости обычным grep, egrep и fgrep. Они очень удобны при выполнении поиска по смешенному набору файлов -- когда одни файлы сжаты, а другие нет.
Для поиска по 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'.
if [ "$lookup" -eq 0 ]
then
echo "Слово \"$word\" найдено."
else
echo "Слово \"$word\" не найдено."
fi
done <"$file" # Перенаправление ввода из файла $file, так что "чтение" производится оттуда.
echo
exit 0
# ----------------------------------------------------------------
# Строки, расположенные ниже не будут исполнены, поскольку выше стоит команда "exit".
# Stephane Chazelas предложил более короткий вариант:
while read word && [[ $word != end ]]
do if look "$word" > /dev/null
then echo "Слово \"$word\" найдено."
else echo "Слово \"$word\" не найдено."
fi
done <"$file"
exit 0
sed, awk
Скриптовые языки, специально разработанные для анализа текстовых данных.
sed