Міністерство освіти і науки України
Національний університет
«ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Лабораторна робота №3
Потоковий редактор SED. Утиліта обробки даних AWK
Мета роботи: познайомитися з призначенням та командами потокового текстового редактора 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 отримує вхідний потік (переважно файл) порядково, редагує кожен рядок відповідно до правил, які визначені в sed-скрипті з використанням простої мови sed, і потім виводить результат в вихідний потік.
Набір команд sed створений по образу редактора ed, але необхідно пам’ятати про його інвертованість. Наприклад, команда 25d редактора ed означає «йдіть до рядка 25 і видаліть його», в то час як ця ж команда sed означає «якщо це рядок з номером 25, то видаліть (не виводьте) його». Відоме виключення — це команди копіювання і переміщення, які обхоплюють діапазон рядків і таким чином не мають прямих еквівалентів в sed. Замість цього sed вводить додатковий буфер, який називається «простором захвату», і додаткові команди для управління ним.
Утилiта awk - один з найпотужнiших iнструментiв для контекстного пошуку та перетворення текстiв. Завдяки гнучкiй мовi програмування awk можна створювати короткi програми, якi читають вхiднi файли, сортують данi, опрацьовують їх, виконують математичнi дiї, генерують звiти тощо.
Завдання:
Використовуючи login i password, зареєструватися в операцiйнiй системi Linux.
Використовуючи команду man sed, познайомитися з двома форматами виклику sed, опцiями редактора, з адресацiєю рядкiв редагованого тексту, iз правилами запису регулярних виразiв, з командами текстового редактора sed.
Потренуватися у використаннi sed для редагуваннi тексту. Команди редагування записати в окремий файл. Серед команд повиннi бути всi основнi команди редагування та повиннi використовуватися регулярнi вирази.
Потренуватися у використаннi sed як фiльтра
Використовуючи команду man awk, познайомитися з
форматами виклику awk
мовою програмування AWK:
структурою AWK-програми
змiнними поля
AWK-змiнними та виразами
шаблонами
регулярними виразами
дiєю виводу
дiєю присвоювання
вбудованими функцiями
керуючими структурами
Потренуватися у використаннi awk для опрацювання тексту, використовуючи рiзно манiнтнi елементи мови AWK, з якими ознайомилися у попередньому пунктi
Потренуватися у використаннi awk як фiльтра
Результат виконання завдання:
SED(1) User Commands SED(1)
NAME
sed - stream editor for filtering and transforming text
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
DESCRIPTION
Sed is a stream editor. A stream editor is used to perform basic text
transformations on an input stream (a file or input from a pipeline).
While in some ways similar to an editor which permits scripted edits
(such as ed), sed works by making only one pass over the input(s), and
is consequently more efficient. But it is sed's ability to filter text
in a pipeline which particularly distinguishes it from other types of
editors.
-n, --quiet, --silent
suppress automatic printing of pattern space
-e script, --expression=script
add the script to the commands to be executed
-f script-file, --file=script-file
add the contents of script-file to the commands to be executed
--follow-symlinks
follow symlinks when processing in place
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
-l N, --line-length=N
specify the desired line-wrap length for the `l' command
--posix
disable all GNU extensions.
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
-u, --unbuffered
load minimal amounts of data from the input files and flush the
output buffers more often
--help
display this help and exit
--version
output version information and exit
If no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret. All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.
Лiстинг файлу iз командами потокового редактора sed, якi використовувалися для редагування заданого файлу.
1)Команда а:
[olenet@localhost ~]$ who
olenet :0 2010-05-12 20:35
olenet pts/0 2010-05-12 20:38
olenet pts/1 2010-05-12 20:40
[olenet @localhost ~]$ who | sed '2a\
> nova_stroka
> '
olenet :0 2010-05-12 20:35
olenet pts/0 2010-05-12 20:38
nova_stroka
olenet pts/1 2010-05-12 20:40
[olenet@localhost ~]$
2)Команда b
[olenet @localhost ~]$ who
olenet :0 2010-05-12 20:35
olenet pts/0 2010-05-12 20:38
olenet pts/1 2010-05-05 20:40
[olenet @localhost ~]$ who | sed '2a\
> nova_stroka
> b lb
> 2d
> : lb 3d
> '
olenet :0 2010-05-12 20:35
olenet pts/0 2010-05-12 20:38
nova_stroka
3)Команда с:
[olenet@localhost ~]$ who
olenet :0 2010-05-12 20:35
olenet pts/0 2010-05-12 20:38
olenet pts/1 2010-05-12 20:40
[olenet @localhost ~]$ who | sed '/pts/ c\
> Stroka_zaminu
> '
olenet :0 2010-05-12 21:04
Stroka_zaminu
Stroka_zaminu
4)Команда d:
[olenet @localhost ~]$ who
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet @localhost ~]$ who | sed '2,3d'
olenet :0 2010-05-12 21:04
5)Команда і:
[olenet@localhost ~]$ who
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet @localhost ~]$ who | sed '2i\
> nova_stroka
> '
olenet :0 2010-05-12 21:04
nova_stroka
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
6)Команда s:
[olenet@localhost ~]$ who
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[hirurg@localhost ~]$ who | sed 's/e/E/'
olEnet :0 2010-05-12 21:04
olEnet pts/0 2010-05-12 21:05
olEnet pts/1 2010-05-12 21:07
[olenet @localhost ~]$ who | sed 's/e/E/t'
olEnEt :0 2010-05-12 21:04
olEnEt pts/0 2010-05-12 21:05
olEnEt pts/1 2010-05-12 21:07
7)Команда у:
[olenet @localhost ~]$ who
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet @localhost ~]$ who | sed 'y/pts/PTS/'
olenet :0 2010-05-12 21:04
olenet PTS/0 2010-05-12 21:05
olenet PTS/1 2010-05-12 21:07
8)Команда !cmd :
[olenet@localhost ~]$ who
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet@localhost ~]$ who | sed '2!d'
olenet pts/0 2010-05-12 21:05
[olenet@localhost ~]$ who | sed '1,2!d'
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
9)Команда =:
[olenet@localhost ~]$ who | sed =
1
olenet :0 2010-05-12 21:04
2
olenet pts/0 2010-05-12 21:05
3
olenet pts/1 2010-05-12 21:07
10)Команда w:
[olenet@localhost ~]$ who | sed 'w file.txt'
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet@localhost ~]$ cat file.txt
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
11)Команда р:
[olenet @localhost ~]$ who | sed -n 'p'
olenet :0 2010-05-12 21:04
olenet pts/0 2010-05-12 21:05
olenet pts/1 2010-05-12 21:07
[olenet@localhost ~]$ who | sed -n '1p'
olenet :0 2010-05-12 21:04
Лiстинги AWK-програм, якi використовувалися для обробки текстових файлiв пiд час тестування рiзних елементiв мови AWK.
[olenet@localhost ~]$ cat>awk.txt
Іvanov I.I 1980 50
Petrov A.V 1979 40
Sidorov S.K. 1979 40
Hvedorov I.H. 1970 60
[olenet@localhost ~]$ awk '{print}' awk.txt
Іvanov I.I 1980 50
Petrov A.V 1979 40
Sidorov S.K. 1979 40
Hvedorov I.H. 1970 60
[olenet@localhost ~]$ awk '/do/{print}' awk.txt
Sidorov S.K. 1979 40
Hvedorov I.H. 1970 60
[olenet@localhost ~]$ awk '/do/ {print("Привет!")}' awk.txt
Привет!
Привет!
[olenet@localhost ~]$ awk '/do/ {print($2)}' awk.txt
S.K.
I.H
[olenet@localhost ~]$ awk '{print($2)}' awk.txt
I.I
A.V
S.K.
I.H
[olenet@localhost ~]$ awk '{a = $3 $4; print a}' awk.txt
198050
197940
197940
197060
[olenet@localhost ~]$ awk '{a = $3+$4; print a}' awk.txt
2030
2019
2019
2030
[olenet@localhost ~]$ awk '/e/ {print ($1, 2000 - $3)}' awk.txt
Petrov 21
Hvedorov 30
[olenet@localhost ~]$ awk '/rov/ {print}' awk.txt
Petrov A.V 1979 40
Sidorov S.K. 1979 40
Hvedorov I.H 1970 60
[olenet@localhost ~]$ awk '/50/,/60/ {print}' awk.txt
Іvanov I.I 1980 50
Petrov A.V 1979 40
Sidorov S.K. 1979 40
Hvedorov I.H 1970 60
[olenet@localhost ~]$ awk '/50/,/40/ {print}' awk.txt
Іvanov I.I 1980 50
Petrov A.V 1979 40
[olenet@localhost ~]$ awk '/^Iv|ov/ {print} ' awk.txt
Іvanov I.I 1980 50
Petrov A.V 1979 40
Sidorov S.K. 1979 40
Hvedorov I.H 1970 60
Висновки: на даній лабораторній роботі я ознайомилася з не інтерактивним текстовим редактором SED та утилітою обробки даних AWK; ознайомилася з їхніми основними командами, та навчилася застосовувати їх на практиці під час редагування тексту.