Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:unix:lab_sed_awk [2013/09/16 16:37] kkluza [Definiowanie wyrażeń regularnych] |
pl:dydaktyka:unix:lab_sed_awk [2018/11/20 14:43] kkutt [Do przygotowania] |
====== SED i AWK ====== | ====== SED i AWK ====== |
| |
| {{:pl:dydaktyka:unix:evolution_of_language.gif?400|}} |
===== Do przygotowania ===== | ===== Do przygotowania ===== |
* Przypomnieć sobie pracę z jednym z wybranych edytorów (np. vi, emacs, itp). | * Przypomnieć sobie pracę z jednym z wybranych edytorów (np. vi, emacs, itp). |
* Przypomnieć sobie funkcję manipulujące łańcuchami znaków w języku C. | * Przypomnieć sobie funkcję manipulujące łańcuchami znaków w języku C. |
* Przeczytać następujące artykuły: | * Przeczytać następujące artykuły: |
* Artykuł o //sed//: [[http://www.gentoo.org/doc/pl/articles/l-sed1.xml|część 1]], [[http://www.gentoo.org/doc/pl/articles/l-sed2.xml|część 2]], [[http://www.gentoo.org/doc/pl/articles/l-sed3.xml|część 3]] | * Artykuł o //sed//: [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-sed1.xml|część 1]], [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-sed2.xml|część 2]], [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-sed3.xml|część 3]] (mirror: {{:pl:dydaktyka:unix:sed1.pdf|}}, {{:pl:dydaktyka:unix:sed2.pdf|}}, {{:pl:dydaktyka:unix:sed3.pdf|}}) |
* Artykuł o //awk//: [[http://www.gentoo.org/doc/pl/articles/l-awk1.xml|część 1]], [[http://www.gentoo.org/doc/pl/articles/l-awk2.xml|część 2]], [[http://www.gentoo.org/doc/pl/articles/l-awk3.xml|część 3]] | * Artykuł o //awk//: [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-awk1.xml|część 1]], [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-awk2.xml|część 2]], [[http://gentoo-handbook.lugons.org/doc/pl/articles/l-awk3.xml|część 3]] (mirror: {{:pl:dydaktyka:unix:awk1.pdf|}}, {{:pl:dydaktyka:unix:awk2.pdf|}}, {{:pl:dydaktyka:unix:awk3.pdf|}}) |
* Wersja angielska: | * Wersja angielska: |
* Artykuł o //sed//: [[http://www.ibm.com/developerworks/linux/library/l-sed1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-sed2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-sed3.html|część 3]]. | * Artykuł o //sed//: [[https://www.ibm.com/developerworks/linux/library/l-sed1/index.html|część 1]], [[https://www.ibm.com/developerworks/linux/library/l-sed2/index.html|część 2]], [[https://www.ibm.com/developerworks/linux/library/l-sed3/index.html|część 3]]. |
* Artykuł o //awk//: [[http://www.ibm.com/developerworks/linux/library/l-awk1.html|część 1]], [[http://www.ibm.com/developerworks/linux/library/l-awk2.html|część 2]], [[http://www.ibm.com/developerworks/linux/library/l-awk3.html|część 3]]. | * Artykuł o //awk//: [[https://www.ibm.com/developerworks/linux/library/l-awk1/index.html|część 1]], [[https://www.ibm.com/developerworks/linux/library/l-awk2/index.html|część 2]], [[https://www.ibm.com/developerworks/linux/library/l-awk3/index.html|część 3]]. |
| |
| * Ciekawym miejscem do ćwiczenia znajomości wyrażeń regularnych jest [[https://regexcrossword.com/|Regex Crossword]] :-) |
===== Wprowadzenie ===== | ===== Wprowadzenie ===== |
* sed i awk są narzędziami strumieniowego przetwarzania tekstu. | * sed i awk są narzędziami strumieniowego przetwarzania tekstu. |
===== Definiowanie wyrażeń regularnych ===== | ===== Definiowanie wyrażeń regularnych ===== |
* Wyrażenia regularne składają się dwóch podstawowych zestawów znaków: | * Wyrażenia regularne składają się dwóch podstawowych zestawów znaków: |
* Znaki kontrolne: . ? * + ^ | $ () [] {} \ | * Znaki kontrolne: ''. ? * + ^ | $ () [] {} \'' |
* Zwykłe znaki: pozostałe | * Zwykłe znaki: pozostałe |
* Kolejność znaków w wyrażeniu jest **istotna**. | * Kolejność znaków w wyrażeniu jest **istotna**. |
* {,6} - co najwyżej 6 razy. | * {,6} - co najwyżej 6 razy. |
* Pionowa kreska (ang. pipeline) | to operator OR np. jeśli napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c. | * Pionowa kreska (ang. pipeline) | to operator OR np. jeśli napiszemy a|b|c oznacza to, że w danym wyrażeniu może wystąpić a lub b lub c. |
* Jeżeli chcemy użyć jednego ze znaków kontrolnych jako zwykłego to poprzedzamy go backslash-em **\** np: **^\$** definiuje wszystkie łańcuchy znaków rozpoczynające się od znaku dolara $. | * Jeżeli chcemy użyć jednego ze znaków kontrolnych jako zwykłego to poprzedzamy go backslash-em **\** np: **^\$** definiuje wszystkie łańcuchy znaków rozpoczynające się od znaku dolara ''$''. |
| |
| |
==== Przykłady ==== | ==== Przykłady ==== |
=== Kod pocztowy === | === Kod pocztowy === |
===== Ćwiczenia ===== | ===== Ćwiczenia ===== |
==== SED ==== | ==== SED ==== |
- Przeczytać manual do programu. Zwrócić uwagę na polecenia, ich składnię oraz sposób adresacji poleceń. | |
| Przeczytać manual do programu. Zwrócić uwagę na polecenia, ich składnię oraz sposób adresacji poleceń. |
- Wyświetlić plik **/etc/passwd** przy pomocy //sed//. | - Wyświetlić plik **/etc/passwd** przy pomocy //sed//. |
- Zamienić separator - dwukropek - w pliku ''/etc/passwd'' na spację. | - Zamienić separator - dwukropek - w pliku ''/etc/passwd'' na spację. |
- Wyświetlić **tylko** nazwy użytkowników zapisanych w pliku ''/etc/passwd'' | - Wyświetlić **tylko** loginy użytkowników zapisanych w pliku ''/etc/passwd'' |
- Wyświetlić 4, 7, 10 i 13 linię pliku ''/etc/passwd'' | - Wyświetlić 4, 7, 10 i 13 linię pliku ''/etc/passwd'' |
- Wyświetlić określone przedziałem (np. od 3. do 5. włącznie) linie pliku ''/etc/passwd''. | - Wyświetlić określone przedziałem (np. od 3. do 5. włącznie) linie pliku ''/etc/passwd''. |
- Wyświetlić linie pliku ''/etc/passwd'' opisujące osoby mające login zaczynający się na 'z'. | - Wyświetlić linie pliku ''/etc/passwd'' opisujące osoby mające login zaczynający się na 'z'. |
- Wyświetlić linie pliku ''/etc/passwd'' opisujące osoby mające login zaczynający się na 'q' lub 'z'. | - Wyświetlić linie pliku ''/etc/passwd'' opisujące osoby mające login zaczynający się na 'w' lub 'z'. |
- Jak przy pomocy sed zaimitować polecenie ''grep -v''? np. dla frazy 'lo' (''grep -v lo /etc/networks'') | - Jak przy pomocy sed zaimitować polecenie ''grep -v''? np. dla frazy 'lo' (''grep -v lo /etc/networks'') |
- Jak zamienić w pliku wszystkie słowa ''root'' na twój login (przetestuj na pliku ''/etc/aliases'')? | - Jak zamienić w pliku wszystkie słowa ''root'' na twój login (przetestuj na pliku ''/etc/aliases'')? |
- Jak zamienić przy pomocy sed wszystkie litery 'r' na 'k'? | - Jak zamienić przy pomocy sed wszystkie litery 'r' na 'k'? |
- W jaki sposób zakodować szyfrem ROT13 plik przy pomocy sed (szyfr zamienia litery na występujące 13 liter dalej, np. a<->n, b<->o, itd.)? | - W jaki sposób zakodować szyfrem ROT13 plik przy pomocy sed (szyfr zamienia litery na występujące 13 liter dalej, np. a<->n, b<->o, itd.)? |
- Przy pomocy polecenia sed zakomentuj linijkę default w pliku ''/etc/networks''. | - Przy pomocy polecenia sed zakomentuj linijkę link-local w pliku ''/etc/networks''. |
- 8-o W jaki sposób przy użyciu sed wstawić kolumnę X po pierwszym znaku wiersza (dodatkowy znak X w każdym wierszu)? A jak po piątym? | - 8-o W jaki sposób przy użyciu sed wstawić kolumnę X po pierwszym znaku wiersza (dodatkowy znak X w każdym wierszu)? A jak po piątym? |
- Jak przy pomocy sed powtórzyć 3 razy pierwsze dwie litery każdego wiersza w pliku? | - Jak przy pomocy sed powtórzyć 3 razy pierwsze dwie litery każdego wiersza w pliku? |
Operuje ono na danych zawartych w plikach o rozszerzeniu "bib" | Operuje ono na danych zawartych w plikach o rozszerzeniu "bib" |
zawierających dane bibliograficzne. | zawierających dane bibliograficzne. |
Przykład pliku: {{:dydaktyka:unix:publikacje.bib.txt|}}. | Przykład pliku: {{:pl:dydaktyka:unix:publikacje.bib.txt|}}. |
| |
Poszczególne wpisy bibliograficzne mają następującą postać: | Poszczególne wpisy bibliograficzne mają następującą postać: |
| |
\\ | \\ |
** 8-) 8-) 8-) 8-) 8-) 8-) Zadanie 3** \\ | ** 8-) 8-) 8-) Zadanie 3** \\ |
\\ | \\ |
Napisz skrypt programu awk który policzy i wyświetli średnią ocen dla każdego studenta. | Napisz skrypt programu awk który policzy i wyświetli średnią ocen dla każdego studenta. |
- ''X'' - wartość średniej oceny z dokładnością do dwóch miejsc po przecinku. | - ''X'' - wartość średniej oceny z dokładnością do dwóch miejsc po przecinku. |
Napisany skrypt nie może używać żadnych poleceń zewnętrznych.\\ | Napisany skrypt nie może używać żadnych poleceń zewnętrznych.\\ |
Przykłady plików: {{:dydaktyka:unix:input.txt|wejściowego}} oraz {{:dydaktyka:unix:output.txt|wyjściowego}}. | Przykłady plików: {{:pl:dydaktyka:unix:input.txt|wejściowego}} oraz {{:pl:dydaktyka:unix:output.txt|wyjściowego}}. |
| |
===== Dla zainteresowanych ===== | ===== Dla zainteresowanych ===== |