Міністерство освіти і науки України
Національний університет Львівська політехніка
Звіт
до лабораторної роботи № 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 fileI have three dogs and two cats>sed -e 's/dog/cat/g' -e 's/cat/elephant/g' fileI 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 filehttp://www.foo.com/mypage.html>sed -e 's@http://www.foo.com@http://www.bar.net@' filehttp://www.bar.net/mypage.html
Зауважте, що ми використовували інший роздільник @ для команди заміни. Sed дозволяє декілька роздільників для команди, включаючи % , ; : . Альтернативні роздільники добре підходять для заміни, які включають рядки, такі як імена, як це робить ваш СЕД код більш читабельним.
Example 2
>cat filethe black cat was chased by the brown dog>sed -e 's/black/white/g' filethe white cat was chased by the brown dog
Example 3
>cat filethe 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' filethe black cat was chased by the brown dog.the white cat was not chased by the brown dog.
Example 4
>cat filehellothis text is wiped outWiped outhello (also wiped out)WiPed out TOO!goodbye(1) This text is not deleted(2) neither is this ... ( goodbye )(3) neither is thishellobut this is and so is thisand unless we find another g**dbyeevery 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 woodpedal foot carclown pie circus
Тепер ми будемо використовувати функцію друку в AWK для підключення слова з кожного рядка в шаблон, наприклад:
awk '{print "Hit the",$1,"with your",$2}' words.dataHit the nail with your hammerHit the pedal with your footHit the clown with your pie
Що деякі з даних у файл вводу числових, як і в grades.data файл показано тут:
Rogers 87 100 95Lambchop 66 89 76Barney 12 36 27
You can perform calculations like this:
awk '{print "Avg for",$1,"is",($2+$3+$4)/3}' grades.dataAvg for Rogers is 94Avg for Lambchop is 77Avg for Barney is 25
До цих пір ми не вказана жодна цінність для шаблону у цих прикладах, але якщо ви хочете, щоб виключити рядки обробляються, ви можете ввести щось на зразок цього:
awk /^clown/'{print "See the",$1,"at the",$3}' words.dataSee the clown at the circus
Тут ми розповіли AWK розглядати тільки вхідні лінії, які починаються з клоуном. Відзначимо також, що немає простору між характером і друку специфікатором. Якщо ви розмістите там простір, AWK будуть думати, що вхідний файл "(друку і працювати не буде. Але все це тільки верхівка айсберга AWK - цілі книги були написані на цю команду. Якщо ви програміст, спробуйте команду AWK.
Висновок: в даній лабораторній роботі я ознайомився з командами для редагування потокового тексту AWK та SED. Також вивчив основні команди та методи використання цих команд для редагування, пошуку та заміни тексту в текстових файлах.