Искусство программирования на языке сценариев командной оболочки
Шрифт:
bash$ wc [d-h]* | grep итого | awk '{print $3}'
71832
Использование wc для подсчета количества вхождений слова "Linux" в основной исходный файл с текстом этого руководства.
bash$ grep Linux abs-book.sgml | wc -l
50
См. также Пример 12-30 и Пример 16-7.
Отдельные
... | 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" ] # Стандартная проверка командной строки.
then
echo "Порядок использования: `basename $0` filename"
exit $E_BADARGS
fi
tr a-z A-Z <"$1"
# Тот же эффект можно получить при использовании символьных классов POSIX:
# tr '[:lower:]' '[:upper:]' <"$1"
# Спасибо S.C.
exit 0
Пример 12-15. lowercase: Изменение имен всех файлов в текущем каталоге в нижний регистр.
#! /bin/bash
#
# Изменит все имена файлов в текущем каталоге в нижнй регистр.
#
for filename in * # Обход всех файлов в каталоге.
do
fname=`basename $filename`
n=`echo $fname | tr A-Z a-z` # Перевести символы в нижний регистр.
if [ "$fname" != "$n" ] # Переименовать только те файлы, имена которых изменились.
then
mv $fname $n
fi
done
exit 0
# Сироки приведенные ниже не будут исполняться, поскольку выше стоит команда "exit".
#--------------------------------------------------------#
# Запустите эту часть сценария, удалив строки , стоящие выше.
# Сценарий, приведенный выше, не работает с именами файлов, содержащими пробелы или символы перевода строки.
# В связи с этим, Stephane Chazelas предложил следующий вариант:
for filename in * # Нет необходимости использовать basename,