Міністерство освіти і науки України
Національний університет Львівська політехніка
Звіт
до лабораторної роботи № 3
на тему: “ Потоковий редактор sed,
утилiта обробки даних awk ”
Мета роботи
познайомитися з призначенням та командами потокового текстового редактора sed;
познайомитися з призначенням утилiти awk та мовою обробки шаблонiв утилiти awk;
навчитися редагувати текстовi файли з допомогою потокового редактора sed та використовувати утилiту sed як фiльтр редагування файлiв;
навчитися записувати шаблони утилiти awk та використовувати утилiту awk як фiльтр обробки даних.
1. Потоковий редактор SED.
Sed працює таким чином: він читає зі стандартного вводу один рядок за один раз. Для кожної лінії, він виконує ряд команд редагування, після чого цей рядок записується в STDOUT. Приклад, що показує, як це працює ми використовуємо з командою sommand. S означає "замінити словами" або пошуку та заміни. Формат:
s/regular-expression/replacement text/{flags}
Ми не будемо обговорювати всі прапорці, але в даному випадку ми використовуємо прапорець G, що означає "замінити всі слова що співпали"
>cat file
I have three dogs and two cats
>sed -e 's/dog/cat/g' -e 's/cat/elephant/g' file
I have three elephants and two elephants
>
s/dog/cat/g
I have three cats and two cats
а потім друга команда провела зміни відредагованого рядка і в результаті:
I have three elephants and two elephants
По-перше, звичайний спосіб використання SED полягає в наступному:
>sed -e 'command1' -e 'command2' -e 'command3' file
>{shell command}|sed -e 'command1' -e 'command2'
>sed -f sedscript.sed file
>{shell command}|sed -f sedscript.sed
так що SED може читати з файлу або STDIN, і команди можуть бути вказані у файлі або в командному рядку. Зверніть увагу на наступне: якщо команди будуть зчитані з файлу, то пробіли можуть бути фатальними, зокрема, це призведе до провалу без всякої видимої причини. Я рекомендую редагування SED скріптів іншими редакторами, наприклад, Vim, які можуть показати кінець рядка символів, що дозволяє "бачити" кінцеві пробіли в кінці рядка.
Команда заміни
Формат для команди заміни виглядає наступним чином:
[address1[ ,address2]]s/pattern/replacement/[flags]
Прапорці можуть бути будь-які з наступних:
n заміна і-ого примірника шаблона «заміною»
g замінити всі примірники шаблона «заміною»
p записати інформацію в простір STDOUT, якщо успішне заміщення відбувається
w file cтворити файл з простору, якщо файл успішного заміщення відбувається
Якщо не вказані прапорці, перші співпадіння в рядку будуть замінені. Відзначимо, що ми майже завжди використовують команді з G прапорцем або без прапорців взагалі.
Якщо адреса вказана, то заміна застосовується для рядка, що містить цю адресу. Адреса може бути регулярним виразом охопленим слешами ( / <регулярний вираз> / ) або номер рядка. $ Символ може бути використаний замість номера рядка для позначення останнього рядка.
Якщо дві адреси дані через кому, то заміна поширюється на всі рядки між двома даними рядками, які відповідають шаблону.
Це вимагає певних роз'яснень у випадку, коли обидві адреси будуть моделі, так як є деяка невизначеність тут. Точніше, заміна поширюється на всіх рядків з першого співпадіння address1 в першому співпадінні address2 і всі рядки з першого співпадіння address1 після першого співпадіння address2 на наступний співпадіння address1.
Команда видалення
Команда видалення дуже проста у синтаксисі, вона виглядає наступним чином:
[address1[ , address2 ] ]d
Ця команда видаляє зміст простору. Усі наступні команди будуть пропущені (зрештою, дуже мало можна зробити за допомогою порожнього простору.
Example 1
>cat file
http://www.foo.com/mypage.html
>sed -e 's@http://www.foo.com@http://www.bar.net@' file
http://www.bar.net/mypage.html
Зауважте, що ми використовували інший роздільник @ для команди заміни. Sed дозволяє декілька роздільників для команди, включаючи % , ; : . Альтернативні роздільники добре підходять для заміни, які включають рядки, такі як імена, як це робить ваш СЕД код більш читабельним.
Example 2
>cat file
the black cat was chased by the brown dog
>sed -e 's/black/white/g' file
the white cat was chased by the brown dog
Example 3
>cat file
the black cat was chased by the brown dog.
the black cat was not chased by the brown dog
>sed -e '/not/s/black/white/g' file
the black cat was chased by the brown dog.
the white cat was not chased by the brown dog.
Example 4
>cat file
hello
this text is wiped out
Wiped out
hello (also wiped out)
WiPed out TOO!
goodbye
(1) This text is not deleted
(2) neither is this ... ( goodbye )
(3) neither is this
hello
but this is
and so is this
and unless we find another g**dbye
every line to the end of the file gets deleted
>sed -e '/hello/,/goodbye/d' file
(1) This text is not deleted
(2) neither is this ... ( goodbye )
(3) neither is this
Це показує, як працює при вирішенні дві адреси, що зазначені в моделі. СЕД вважає перший матч вираз "привіт", видалення кожного рядка зчитуються в просторі картини, поки не добереться до першої рядку після слова "до побачення". Вона не застосовується видалити команду більше адрес, поки не натикається на слова "привіт" ще раз. Оскільки вираз "до побачення", не на будь-який з наступних лінії, команду видалення застосовується щодо всіх інших лініях.
Команда виходу
Q команда дуже проста. Вона просто завершує роботу. Немає більше рядків, що зчитаються в структурі простору і програма завершується.
2. Команда AWK
AWK команда поєднує в собі функції Grep і SED, що робить ЇЇ однією з найпотужніших команд Unix. Використання AWK, ви можете замінити словами з ліній введення файлу слів в шаблоні або виконати розрахунки на номери в межах файлу. (У разі, якщо вам цікаво, як AWK отримали такі незвичайні назви, це походить від прізвищ трьох програмістів, які винайшли алгоритм роботи AWK.)
Щоб використовувати AWK, потрібно написати мініатюрну програму на C-подібній мові, яка буде перетворювати кожен рядок вхідного файлу. Ми зупинимося тільки на функції друку AWK, оскільки це найкорисніша та найменш заплутана функція AWK. Загальна форма команди AWK.
awk <pattern> '{print <stuff>}' <file>
У цьому випадку матеріал буде певне поєднати два тексти, спеціальні змінні, які представляють кожне слово в рядку введення і, можливо, математичне або оператора 2. Як AWK процесів кожного рядка вхідного файлу, кожне слово на лінії, призначені змінним з іменем "$ 1 (перше слово), $ 2 (друге слово), і так далі. (Змінна $ 0 містить весь рядок.)
Давайте почнемо з файлу, words.data, який містить наступні рядки:
nail hammer wood
pedal foot car
clown pie circus
Тепер ми будемо використовувати функцію друку в AWK для підключення слова з кожного рядка в шаблон, наприклад:
awk '{print "Hit the",$1,"with your",$2}' words.data
Hit the nail with your hammer
Hit the pedal with your foot
Hit the clown with your pie
Що деякі з даних у файл вводу числових, як і в grades.data файл показано тут:
Rogers 87 100 95
Lambchop 66 89 76
Barney 12 36 27
You can perform calculations like this:
awk '{print "Avg for",$1,"is",($2+$3+$4)/3}' grades.data
Avg for Rogers is 94
Avg for Lambchop is 77
Avg for Barney is 25
До цих пір ми не вказана жодна цінність для шаблону у цих прикладах, але якщо ви хочете, щоб виключити рядки обробляються, ви можете ввести щось на зразок цього:
awk /^clown/'{print "See the",$1,"at the",$3}' words.data
See the clown at the circus
Тут ми розповіли AWK розглядати тільки вхідні лінії, які починаються з клоуном. Відзначимо також, що немає простору між характером і друку специфікатором. Якщо ви розмістите там простір, AWK будуть думати, що вхідний файл "(друку і працювати не буде. Але все це тільки верхівка айсберга AWK - цілі книги були написані на цю команду. Якщо ви програміст, спробуйте команду AWK.
Висновок: в даній лабораторній роботі я ознайомився з командами для редагування потокового тексту AWK та SED. Також вивчив основні команди та методи використання цих команд для редагування, пошуку та заміни тексту в текстових файлах.