Чтение онлайн

ЖАНРЫ

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

Купер Мендель

Шрифт:

WORDFILE=/usr/share/dict/linux.words # Файл словаря.

# Можно указать иной

#+ файл словаря

#+ в формате -- "одно слово на строке".

wlist=`strings "$1" | tr A-Z a-z | tr '[:space:]' Z | \

tr -cs '[:alpha:]' Z | tr -s '\173-\377' Z | tr Z ' '`

# Трансляция вывода от 'strings' с помощью нескольких 'tr'.

# "tr A-Z a-z" --

перевод в нижний регистр.

# "tr '[:space:]'" -- конвертирует пробелы в символы Z.

# "tr -cs '[:alpha:]' Z" -- конвертирует неалфавитные символы в символы Z,

#+ и удаляет повторяющиеся символы Z.

# "tr -s '\173-\377' Z" -- Конвертирует все символы, с кодами выше 'z' в Z

#+ и удаляет повторяющиеся символы Z,

#+ эта команда удалит все символы, которые не были распознаны предыдущими

#+ командами трансляции (tr).

# Наконец, "tr Z ' '" -- преобразует все символы Z в пробелы,

#+ которые будут рассматриваться в качестве разделителя слов в цикле, приведенном ниже.

# Обратите внимание на технику многоуровневой обработки с помощью 'tr',

#+ каждый раз эта команда вызывается с различным набором аргументов.

for word in $wlist # Важно:

# переменная $wlist не должна заключаться в кавычки.

# "$wlist" -- не сработает.

# Почему?

do

strlen=${#word} # Дина строки.

if [ "$strlen" -lt "$MINSTRLEN" ] # Не рассматривать короткие строки.

then

continue

fi

grep -Fw $word "$WORDFILE" # Проверка слова по словарю.

done

exit 0

Сравнение

diff, patch

diff: очень гибкая утилита сравнения файлов. Она выполняет построчное сравнение файлов. В отдельных случаях, таких как поиск по словарю, может оказаться полезной фильтрация файлов с помощью sort и uniq перед тем как отдать поток данных через конвейер утилите diff. diff file-1 file-2– - выведет строки, имеющие отличия, указывая -- какому файлу, какая строка принадлежит.

С ключом – -side-by-side, команда diff выведет сравниваемые файлы в две колонки, с указанием несовпадающих строк. Ключи – c и – u так же служат для облегчения интерпретации результатов работы diff.

Существует ряд интерфейсных оболочек для утилиты diff,

среди них можно назвать: spiff, wdiff, xdiff и mgdiff.

Команда diff возвращает код завершения 0, если сравниваемые файлы идентичны и 1, если они отличаются. Это позволяет использовать diff в условных операторах внутри сценариев на языке командной оболочки (см. ниже).

В общем случае, diff используется для генерации файла различий, который используется как аргумент команды patch. Ключ – e отвечает за вывод файла различий в формате, пригодном для использования с ed или ex.

patch: гибкая утилита для "наложения заплат". С помощью файла различий, сгенерированного утилитой diff, утилита patch может использоваться для обновления устаревших версий файлов. Это позволяет распространять относительно небольшие "diff"-файлы вместо целых пакетов. Распространение "заплат" к ядру стало наиболее предпочтительным методом распространения более новых версий ядра Linux.

patch -p1 <patch-file

# Применит все изменения из 'patch-file'

# к файлам, описанным там же.

# Так выполняется обновление пакетов до более высоких версий.

Наложение "заплат" на ядро:

cd /usr/src

gzip -cd patchXX.gz | patch -p0

# Обновление исходных текстов ядра с помощью 'patch'.

# Пример взят из файла "README",

# автор не известен (Alan Cox?).

Кроме того, утилита diff в состоянии выполнять рекурсивный обход каталогов.

bash$ diff -r ~/notes1 ~/notes2

Only in /home/bozo/notes1: file02

Only in /home/bozo/notes1: file03

Only in /home/bozo/notes2: file04

Утилита zdiff сравнивает сжатые, с помощью gzip, файлы.

diff3

Расширенная версия diff, которая сравнивает сразу 3 файла. В случае успеха возвращает 0, но, к сожалению, не дает никакой информации о результатах сравнения.

bash$ diff3 file-1 file-2 file-3

====

1:1c

This is line 1 of "file-1".

2:1c

This is line 1 of "file-2".

Поделиться с друзьями: