
- •Источники справочной информации
- •Страницы интерактивного руководства man
- •Определения
- •Команды
- •Комментарии
- •Синтаксис команды
- •Синтаксис
- •Описание
- •Синтаксис команды
- •Использование
- •Ключи
- •Список ключей
- •Примеры
- •Поиск в текущей директории
- •Поиск в определенном каталоге
- •Поиск по нескольким именам файлов
- •Поиск файлов определенного типа
- •Вывод расширенной информации о файле
- •Выполнение команды
- •Поиск в зависимости от времени создания
- •Поиск файлов принадлежащих определенному пользователю
- •Игнорирование ошибок
- •Синтаксис
- •1. Структура awk-программы
- •2. Вызов awk
- •3. awk-переменные и выражения
- •4. Примеры awk-программ
- •5. Селекторы
- •7. Действия
- •Операторы управления
- •Структурные операторы
- •8. Ввод и вывод данных
- •9. Встроенные функции
- •Использование
- •Параметры запуска
- •Использование
- •Параметры команды
- •Синтаксис
- •Назначение и синтаксис
- •В UNIX
- •В UNIX
- •Использование
- •Примеры
- •Использование
- •Использование
- •Параметры запуска
- •Использование
- •Алгоритм
- •Использование
- •Параметры запуска
- •Использование
- •Параметры запуска
- •Примеры
- •Пример работы
- •Синтаксис
- •Описание
- •Параметры
- •Синтаксис
- •Выводимая информация
- •Параметры STAT
- •Примеры использования
- •Примечания
- •crontab
- •Графический интерфейс
- •Синтаксис
- •Описание
- •Синтаксис
- •Параметры
- •Список ключей
- •Использование
- •Размонтирование командой umount
- •-o Атрибуты доступа
- •mount --bind
- •Файл конфигурации
- •Пример
- •Ключи
- •Синтаксис
- •Описание
Операторы управления
Простейшие операторы
exit |
завершить выполнение программы; |
next |
перейти к следующей строке, управление на начало awk-программы; |
break |
выход из цикла; |
continue |
переход к следующей итерации; |
Структурные операторы
if (условие) {операторы} [else {операторы}] while (условие) {операторы}
for (выражение; условие; выражение) {операторы} for (индекс in имя_массива) {операторы}
Структурные операторы в значительной степени аналогичны соответствующим операторам Си. В последнем случае для каждого индекса выполняется блок. Текстовые индексы рассматриваются в лексикографическом порядке.
Примеры
1) awk ' $4~/40/ {if($3<=1980) {print("Фамилия: " $1 ) M["40"]++}}
$4~/50/ {M["50"]++} END {for(i in M)
{print(" i =" i " M[" i "]=" M[i])}} ' f-awk
Результат:
Фамилия: Петров Фамилия: Сидоров i =40 M[40]=2
i =50 M[50]=1
2) awk ' BEGIN {ORS = " "}
{ for(k=NF; k>0; --k) {print $k} {print RS}
} ' f-awk | sed 's/^ //'
Результат:
50 1980 И.И. Иванов
40 1979 А.В. Петров
40 1979 С.К. Сидоров
60 1970 И.Х. Хведоров
Здесь, кроме изменения очередности полей в строке на противоположное (что делает цикл "for"), предварительно устанавливается выходной разделитель - пробел и весь результат предварительно выдается в одну строку, поэтому после обработки каждой строки выдается команда "print RS" для перевода выходной строки. Редактор "sed" подключен через конвейер, чтобы убрать возможные пробелы в начале строки. Существенная деталь. Если запустить лишь базовую структуру
awk '{ for(k=NF; k>0; --k) {print $k}}' f-awk
то все поля исходной таблицы с изменениями порядка внутри прежних строк получим вытянутыми в один столбец переводом строки:
50
1980
И.И.
Иванов
40
1979
А.В.
Петров
40
1979
С.К.
Сидоров
60
1970
И.Х.
Хведоров
Однако, если поставим ";" сразу после условия, т.е. сделаем пустое тело цикла, за пределы которого вынесен "print $k"
awk '{ for(k=NF; k>0; --k); {print $k}}' f-awk
то получим исходную таблицу
Иванов И.И. 1980 50 Петров А.В. 1979 40 Сидоров С.К. 1979 40 Хведоров И.Х. 1970 60
поскольку "$k" после выхода из цикла будет иметь значение "0", а "$0" - соответсвует всей строке в качестве значения(!), то "print $k" будет после каждого цикла печатать полные строки.
8. Ввод и вывод данных
В общем случае в команде awk может быть указано несколько файлов. Напомним форматы вызова команды:
awk [-Fc] 'prog.awk' [file ...] awk [-Fc] -f prog.awk [file ...]
^
Файлы обрабатываются последовательно в указанном порядке. Это можно использовать для "настройки" awk команды при обработке последующих файлов.
Пусть файл "f0" имеет вид:
60 Сидоров
А файл awk-программы "prim.awk" имеет вид:
FILENAME == "f0" { # если просматривается файл "f0" w1 = $2 # присваиваются значения переменным
w2 = $1 # w1 - Сидоров, w2 - 60
}
$1 == w1 { print ("фамилия: "$1)} # означенные переменные $4 == w2 { print ("годы: " $4)} # используются в
# селекторах
Тогда при вызове команды
awk -f prim.awk f0 f-awk
Результат:
фамилия: Сидоров годы: 60
То есть второе поле файла "f0" дает значение переменной "w1", а первое - "w2". Эти переменные используются в селекторах при обработке файла "f-awk".
Изменим программу в файле "f-awk":
FILENAME == "f0" { w1 = $2
w2 = $1 next
}
{ print ("фамилия: "$1); next} $4 == w2 { print ("годы: " $4)}
Результат:
фамилия: Иванов фамилия: Петров фамилия: Сидоров фамилия: Хведоров
Если исключить первый оператор "next", то в выходном файле появится дополнительно первая строка:
фамилия: 60
поскольку выбирается снова первое поле в певом файле ("f0"). Если исключить и второй "next", то в выходном файле появится дополнительно последняя строка:
годы: 60
которая ранее не выводилась, так как в предшествующий оператор " { print ("фамилия: "$1)}" заканчивал работу на ПОСЛЕДНЕЙ строке файла "f-awk", поэтому "next" пропускал последующую командную строку
$4 == w2 { print ("годы: " $4)}
И еще одна модификация в связи с вводом данных с терминала. Вызов команды будет:
awk -f prim.awk f0 f-awk
А файл "prim.awk" примет вид:
BEGIN { print ("Введите годы и фамилию: ")} FILENAME == "-" {
w1 = $2
w2 = $1 next
}
$1 == w1 { print ("фамилия: "$1); next} $4 == w2 { print ("годы: " $4)}
9. Встроенные функции
Встроенные функции:
sin (expr) cos (expr) exp (expr) log (expr) sqrt (expr) int (expr) length (s)
printf (fmt, ...)
substr (s, m, n)
getline () 0
index (s1, s2)
split (s, M, c)
Примеры.
синус expr косинус expr
возведение в степень expr натуральный логорифм expr извлечение корня expr целая часть числа
длина строки s
форматирование (аналогично Си) по спецификации fmt.
подстрока в n символов строки s, начинающаяся с m.
чтение следующей строки. конец файла, иначе 1.
номер позиции, с которой s1 совпадает с s2, иначе 0.
строка s разбивается элементы массива M по разделителю c (по умолчанию FS=" "); функция возвращает число полей.
1) awk ' BEGIN {FS = "."; a=0}
length ($1) > 8 {print (length ($1), $0);
a++
}
END {print ("Найдено строк: " a) }' f-awk
Результат:
9 Сидоров С.К. 1979 40
10 Хведоров И.Х. 1970 60 Найдено строк: 2
Здесь поля разделяются по ".", выбираются строки у которых длина первого поля больше 8- ми, и их длина "length ($1)" печатается перед строкой "$0".
2) awk '{i=split($0, Name, "."); for (j=1; j<=i; j++)
print ("Name[" j "]=" Name[j]) }' f-awk
Результат:
Name[1]=Иванов И Name[2]=И Name[3]= 1980 50 Name[1]=Петров А Name[2]=В Name[3]= 1979 40 Name[1]=Сидоров С Name[2]=К Name[3]= 1979 40 Name[1]=Хведоров И Name[2]=Х Name[3]= 1970 60
3) awk '{print (length)}' f-awk
Результат:
22
22
22
22
Поскольку все строки были выровнены пробелами, а в длине строки учитываются все символы до конца строки.
4) awk '{printf "%7.2f %s\n", NR, $0}' f-awk echo
awk '{printf "\t%s %s \n", NR, $0}' f-awk
Результат:
1.00 Иванов И.И. 1980 50
2.00 Петров А.В. 1979 40
3.00 Сидоров С.К. 1979 40
4.00 Хведоров И.Х. 1970 60
1 Иванов И.И. 1980 50
2 Петров А.В. 1979 40
3 Сидоров С.К. 1979 40
4 Хведоров И.Х. 1970 60
Краткая информация о редакторе sed
Редактор sed относится к текстовым редакторам потокового типа и не является интерактивным.
Редактор sed распознает следующие метасимволы регулярных выражений: ^ $ . * [ ] [^] \( \) \< \> \{n\} \{n,\} \{,m\} \{n,m\} &
Метасимвол & в команде s используется в строке замены для подстановки значения, которое соответствует регулярному выражению шаблона поиска.
Общий синтаксис вызова команд редактора sed следующий: sed [-n] [-e script]... [-f script_filename]... [filename...]
где
script - программа на языке sed;
script_filename - файл с программой на языке sed; filename - имя файла, в котором осуществляется поиск. Примеры использования команды:
sed -n '/regexp/p' filename (sed 's/regexp/repstr/' filename) или
cat filename | sed -n '/regexp/p' или
echo $varname | sed 's/regexp/repstr/' где
regexp - регулярное выражение (шаблон поиска); repstr - строка, замещаемая найденное выражение;
/ - символ-разделитель между командами редактора sed, regexp и repstr; filename - имя файла, в котором осуществляется поиск;
varname - имя переменной, в значении которой осуществляется поиск.
Символ-разделитель / можно заменить на любой другой символ, поставив перед ним обратную наклонную черту - \, например:
sed -n '\cREcp' filename
Полный синтаксис и подробное описание редактора sed можно получить выполнив команду man sed.
Краткая информация о метасимволах регулярных выражений редактора sed ^ якорный символ привязки регулярного выражения к началу строки $ якорный символ привязки регулярного выражения к концу строки
. соответствует одному любому символу * соответствует нулевому и более количеству повторений символа
[] соответствует одному из перечисленных в скобках символу [^] соответствует одному из НЕ перечисленных в скобках символу
\< якорный символ привязки регулярного выражения к началу слова \> якорный символ привязки регулярного выражения к концу слова \(\) запоминающие скобки & запоминает всю найденную строку
x\{m,n\} интервал повторения символа (m - минимум, n - максимум)
Полный синтаксис и подробное описание применения регулярных выражений можно получить выполнив команду man regexp и man regex.
Краткая информация о командах редактора sed