МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
Національний університет
“ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Потоковий редактор sed, утилiта обробки даних awk
ЛАБОРАТОРНА РОБОТА № 3
З ДИСЦИПЛІНИ “МЕРЕЖЕВІ ОПЕРАЦІЙНІ СИСТЕМИ”
Львів 2010
Мета роботи
познайомитися з призначенням та командами потокового текстового редактора sed;
познайомитися з призначенням утилiти awk та мовою обробки шаблонiв утилiти awk;
навчитися редагувати текстовi файли з допомогою потокового редактора sed та використовувати утилiту sed як фiльтр редагування файлiв;
навчитися записувати шаблони утилiти awk та використовувати утилiту awk як фiльтр обробки даних.
Короткі теоретичні відомості
Sed - неiнтерактивний текстовий редактор, призначений для пакетного редагування файлiв. Вiн особливо зручний для виконнання однiєї ж i тiєї функцiї редагування багато раз, а також для редагування файлiв, якщо послiдовнiсть команд редагування надто довга та складна для iнтерактивного редагування.
Основним документом для знайомства з потоковим редактором sed є man sed. Також ряд прикладiв роботи з sed є в статтi Ольги Галiної " Неинтерактивный текстовый редактор SED" [2] та в посiбнику "sed и awk (учебное пособие)" [3].
Утилiта awk - один з найпотужнiших iнструментiв для контекстного пошуку та перетворення текстiв. Завдяки гнучкiй мовi програмування awk можна створювати короткi програми, якi читають вхiднi файли, сортують данi, опрацьовують їх, виконують математичнi дiї, генерують звiти тощо.
Основним документом для знайомства з утилiтою awk є man awk. Крiм того, для знайомства з awk можна використати статтю " Язык обработки данных AWK" [4] О. Галiної та посiбник "sed и awk (учебное пособие)" [3].
Таблица C-1. Основные операции sed
Операция
Название
Описание
[диапазон строк]/p
print
Печать [указанного диапазона строк]
[диапазон строк]/d
delete
Удалить [указанный диапазон строк]
s/pattern1/pattern2/
substitute
Заменить первое встреченное соответствие шаблону pattern1, в строке, на pattern2
[диапазон строк]/s/pattern1/pattern2/
substitute
Заменить первое встреченное соответствие шаблону pattern1, на pattern2, в указанном диапазоне строк
[диапазон строк]/y/pattern1/pattern2/
transform
заменить любые символы из шаблона pattern1 на соответствующие символы из pattern2, в указанном диапазоне строк (эквивалент команды tr)
g
global
Операция выполняется над всеми найдеными соответствиями внутри каждой из заданных строк
Лістинг із командами потокового редактору sed
ubuntu@ubuntu:~$ who
ubuntu tty5 2010-05-10 19:44
ubuntu tty4 2010-05-10 19:44
ubuntu tty3 2010-05-10 19:44
ubuntu tty6 2010-05-10 19:44
ubuntu tty2 2010-05-10 19:44
ubuntu tty1 2010-05-10 16:44
ubuntu :0 2010-05-10 16:44
ubuntu pts/0 2010-05-10 16:45 (:0)
ubuntu@ubuntu:~$ who | sed '3a\
> 'TEXT
ubuntu tty5 2010-05-10 19:44
ubuntu tty4 2010-05-10 19:44
ubuntu tty3 2010-05-10 19:44
TEXT
ubuntu tty6 2010-05-10 19:44
ubuntu tty2 2010-05-10 19:44
ubuntu tty1 2010-05-10 16:44
ubuntu :0 2010-05-10 16:44
ubuntu pts/0 2010-05-10 16:45 (:0)
ubuntu@ubuntu:~$
Лістинг AWK-програм
Awk -- это полноценный язык обработки текстовой информации с синтаксисом, напоминающим синтаксис языка C. Он обладает довольно широким набором возможностей, однако, мы рассмотрим лишь некоторые из них -- наиболее употребимые в сценариях командной оболочки.
Awk "разбивает" каждую строку на отдельные поля. По-умолчанию, поля -- это последовательности символов, отделенные друг от друга пробелами, однако имеется возможность назначения других символов, в качестве разделителя полей. Awk анализирует и обрабатывает каждое поле в отдельности. Это делает его идеальным инструментом для работы со структурированными текстовыми файлами -- осбенно с таблицами.
Внутри сценариев командной оболочки, код awk, заключается в "строгие" (одиночные) кавычки и фигурные скобки.
awk '{print $3}' $filename
# Выводит содержимое 3-го поля из файла $filename на устройство stdout.
awk '{print $1 $5 $6}' $filename
# Выводит содержимое 1-го, 5-го и 6-го полей из файла $filename.
Только что, мы рассмотрели действие команды print. Еще, на чем мы остановимся -- это переменные. Awk работает с переменными подобно сценариям командной оболочки, но более гибко.
{ total += ${column_number} }
Эта команда добавит содержимое переменной column_number к переменной "total". Чтобы, в завершение вывести "total", можно использовать команду END, которая открывает блок кода, отрабатывающий после того, как будут обработаны все входные данные.
END { print total }
Команде END, соответствует команда BEGIN, которая открывает блок кода, отрабатывающий перед началом обработки входных данных.
Следующий пример демонстрирует применение awk для разбора текста в сценариях командной оболочки.
ubuntu@ubuntu:~$ man awk
ubuntu@ubuntu:~$ cd lab3
ubuntu@ubuntu:~/lab3$ awk '{print}' lab3
Ivanon I.I. 1980 50
Petrov A.V. 1979 40
Sidorov C.K. 1980 45
ubuntu@ubuntu:~/lab3$ awk '/ro/ {print}' lab3
Petrov A.V. 1979 40
Sidorov C.K. 1980 45
ubuntu@ubuntu:~/lab3$ cat lab3 | awk '/1980/ {print}'
Ivanon I.I. 1980 50
Sidorov C.K. 1980 45
ubuntu@ubuntu:~/lab3$
ubuntu@ubuntu:~/lab3$ awk '/ov/ {print($4)}' lab3
40
45
ubuntu@ubuntu:~/lab3$ awk '{s = s + $4}
> END {print ("Symarnuj vik:" s)
> print ("Seredniu vik:" s/3)}' lab3
Symarnuj vik:135
Seredniu vik:45
ubuntu@ubuntu:~/lab3$
Висновок
На даній лабораторній роботі, я ознайомився з призначенням та командами потокового текстового редактора sed; з призначенням утилiти awk та мовою обробки шаблонiв утилiти awk; навчився редагувати текстовi файли з допомогою потокового редактора sed та використовувати утилiту sed як фiльтр редагування файлiв; навчився записувати шаблони утилiти awk та використовувати утилiту awk як фiльтр обробки даних.