Искусство программирования на языке сценариев командной оболочки
Шрифт:
# ----------------------------------------------------------------
# Строки, расположенные ниже не будут исполнены, поскольку выше стоит команда "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
Неинтерактивный "потоковый редактор". Широко используется в сценариях на языке командной оболочки.
awk
Утилита контекстного поиска и преобразования текста, замечательный инструмент для извлечения и/или обработки полей (колонок) в структурированных текстовых файлах. Синтаксис awk напоминает язык C.
wc
wc– - "word count", счетчик слов в файле или в потоке:
bash $ wc /usr/doc/sed-3.02/README
20 127 838 /usr/doc/sed-3.02/README
[20 строк 127 слов 838 символов]
wc -w подсчитывает только слова.
wc -l подсчитывает только строки.
wc -c подсчитывает только символы.
wc -L возвращает длину наибольшей строки.
Подсчет количества .txt– файлов в текущем каталоге с помощью wc:
$ ls *.txt | wc -l
# Эта команда будет работать, если ни в одном из имен файлов "*.txt" нет символа перевода строки.
# Альтернативный вариант:
# find .
– maxdepth 1 -name \*.txt -print0 | grep -cz .
# (shopt -s nullglob; set -- *.txt; echo $#)
# Спасибо S.C.
Подсчет общего размера файлов, чьи имена начинаются с символов, в диапазоне d - h
bash$ wc [d-h]* | grep total | awk '{print $3}'
71832
От переводчика: в случае, если у вас локаль отлична от "C", то вышеприведенная команда может не дать результата, поскольку wc вернет не слово "total", в конце вывода, а "итого". Тогда можно попробовать несколько измененный вариант:
bash$ wc [d-h]* | grep итого | awk '{print $3}'
71832
Использование wc для подсчета количества вхождений слова "Linux" в основной исходный файл с текстом этого руководства.
bash$ grep Linux abs-book.sgml | wc -l
50
См. также Пример 12-30 и Пример 16-7.
Отдельные команды располагают функциональностью wc в виде
своих ключей.... | grep foo | wc -l
# Часто встречающаяся конструкция, которая может быть сокращена.
... | grep -c foo
# Ключ "-c" ("--count") команды grep.
# Спасибо S.C.
tr
Замена одних символов на другие.
Команда tr "A-Z" "*" <filename или tr A-Z \* <filename заменяет все символы верхнего регистра в filename на звездочки (вывод производится на stdout). В некоторых системах этот вариант может оказаться неработоспособным, тогда попробуйте tr A-Z '[**]'.
Ключ – d удаляет символы из заданного диапазона.
echo "abcdef" # abcdef
echo "abcdef" | tr -d b-d # aef
tr -d 0-9 <filename
# Удалит все цифровые символы из файла "filename".
Ключ – -squeeze-repeats (– s) удалит все повторяющиеся последовательности символов. Может использоваться для удаления лишних пробельных символов.
bash$ echo "XXXXX" | tr --squeeze-repeats 'X'
X
Ключ – c "complement" заменит символы в соответствии с шаблоном. Этот ключ воздействует только на те символы, которые НЕ соответствуют заданному шаблону.
bash$ echo "acfdeb123" | tr -c b-d +
+c+d+b++++
Обратите внимание: команда tr корректно распознает символьные классы POSIX [ 29 ] .
29
Это верно только для GNU-версии команды tr, поведение этой команды, в коммерческих UNIX-системах, может несколько отличаться.
bash$ echo "abcd2ef1" | tr '[:alpha:]' -
– ---2--1
Пример 12-14. toupper: Преобразование символов в верхний регистр.
#!/bin/bash
# Преобразование символов в верхний регистр.
E_BADARGS=65
if [ -z "$1" ] # Стандартная проверка командной строки.