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