Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
|
so:pipes_filters [2024/04/02 20:50] jkonczak [more, less] |
so:pipes_filters [2026/04/27 23:37] (aktualna) jkonczak |
||
|---|---|---|---|
| Linia 36: | Linia 36: | ||
| ~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów? | ~~Zadanie.#~~ Jakim złożeniem skrótów przesuwa się kursor o 5 słów? | ||
| - | ~~Zadanie.#~~ Jakim skrótów wstawia się ostatnie słowo z poprzedniego polecenia w historii? | + | ~~Zadanie.#~~ Jakim skrótem wstawia się ostatnie słowo z poprzedniego polecenia w historii? |
| ~~Zadanie.#~~ Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii? | ~~Zadanie.#~~ Jakim złożeniem skrótów wstawia się trzecie od końca słowo z poprzedniego polecenia w historii? | ||
| Linia 57: | Linia 57: | ||
| <small> | <small> | ||
| - | ''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html|POSIX]]. | + | ''vi'' jest wpisane w standard [[https://pubs.opengroup.org/onlinepubs/9799919799/utilities/vi.html|POSIX]]. |
| \\ | \\ | ||
| Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox. | Jest też częścią minimalistycznych zestawów narzędzi takich jak busybox i toybox. | ||
| Linia 85: | Linia 85: | ||
| === Inne === | === Inne === | ||
| - | * [[https://joe-editor.sourceforge.io/joe]] | + | * [[https://joe-editor.sourceforge.io/|joe]] |
| * mcedit – edytor zintegrowany z [[https://en.wikipedia.org/wiki/Midnight_Commander|mc]] | * mcedit – edytor zintegrowany z [[https://en.wikipedia.org/wiki/Midnight_Commander|mc]] | ||
| * [[https://micro-editor.github.io/|micro]] | * [[https://micro-editor.github.io/|micro]] | ||
| Linia 104: | Linia 104: | ||
| że każdy program ma [[https://en.wikipedia.org/wiki/Unix_philosophy|solidnie wykonywać jedno dobrze określone zadanie]]. | że każdy program ma [[https://en.wikipedia.org/wiki/Unix_philosophy|solidnie wykonywać jedno dobrze określone zadanie]]. | ||
| \\ | \\ | ||
| - | Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze rozwiązywalne | + | Żeby zrobić skomplikowane zadania, należy podzielić je na mniejsze, rozwiązywalne |
| przez takie proste programy. | przez takie proste programy. | ||
| <small> | <small> | ||
| Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu. | Dla przykładu: powiedzmy że chcesz dowiedzieć się ile procesów ma każdy z użytkowników systemu. | ||
| + | <html><div style="margin-top:-1.2em"></div></html> | ||
| - Wiesz że ''ps -ef'' wypisuje procesy, więc zapisujesz do pliku ich listę: ''ps -ef > ps_output''. | - Wiesz że ''ps -ef'' wypisuje procesy, więc zapisujesz do pliku ich listę: ''ps -ef > ps_output''. | ||
| - Potrzebujesz tylko pierwszej kolumny – nazwy użytkownia, \\ Żeby wyciąć tylko pierwszą (oddzielaną spacją) kolumnę, używasz komendy ''cut --delimiter ' ' --field 1 < ps_output > cut_output''. | - Potrzebujesz tylko pierwszej kolumny – nazwy użytkownia, \\ Żeby wyciąć tylko pierwszą (oddzielaną spacją) kolumnę, używasz komendy ''cut --delimiter ' ' --field 1 < ps_output > cut_output''. | ||
| - Żeby skorzystać z programu który liczy powtarzające się linie, musisz mieć je obok siebie. \\ Więc komendą ''sort < cut_output > sort_output'' sortujesz plik. | - Żeby skorzystać z programu który liczy powtarzające się linie, musisz mieć je obok siebie. \\ Więc komendą ''sort < cut_output > sort_output'' sortujesz plik. | ||
| - Na końcu korzystasz z komendy ''uniq --count < sort_output'' która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła. | - Na końcu korzystasz z komendy ''uniq --count < sort_output'' która pomija powtarzające się linie i przed każdą linię wpisuje ile razy się powtórzyła. | ||
| + | <html><div style="margin-top:-1.2em"></div></html> | ||
| Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ''ps_output'', ''cut_output'' i ''sort_output''. | Ale: żeby wykonać takie zadanie powstały (niepotrzebne) pliki ''ps_output'', ''cut_output'' i ''sort_output''. | ||
| </small> | </small> | ||
| Linia 159: | Linia 161: | ||
| Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do ''cat -n''. | Dodaj na koniec poprzedniej komendy przekazanie jej wyniku do ''cat -n''. | ||
| - | ~~Zadanie.#~~ Połącz w potok komendy ''ps -eF'' i ''fold'' | + | ~~Zadanie.#~~ Połącz w potok komendy ''ps -ef'' i ''fold'' |
| ~~Zadanie.#~~ Stwórz nazwany potok //p//. Przekieruj wejście programu ''fold'' | ~~Zadanie.#~~ Stwórz nazwany potok //p//. Przekieruj wejście programu ''fold'' | ||
| Linia 214: | Linia 216: | ||
| <small> | <small> | ||
| ''grep'' pozwala na wybór jednej z kilku gramatyk wyrażeń regularnych. | ''grep'' pozwala na wybór jednej z kilku gramatyk wyrażeń regularnych. | ||
| - | POSIX [[https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html|określa]] | + | POSIX [[https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap09.html|określa]] |
| dwie: //basic// (domyślną) i //extended// (używaną przez ''egrep'' i ''grep -E''). | dwie: //basic// (domyślną) i //extended// (używaną przez ''egrep'' i ''grep -E''). | ||
| - | Szczegółów szukaj w dokumentacja twojej implementacji komendy ''grep''. | + | \\ |
| + | Podsumowanie tych gramatyk znajdziesz też w Linuksie pod | ||
| + | ''[[https://man7.org/linux/man-pages/man7/regex.7.html|man 7 regex]]'' oraz na | ||
| + | [[https://en.wikipedia.org/wiki/Regular_expression#IEEE_POSIX_Standard|wikipedii]]. | ||
| + | \\ | ||
| + | Informację o innych gramatykach wspieranych przez twoją implementację komendy | ||
| + | ''grep'' znajdziesz w dokumentacji konkretnej implementacji. | ||
| Domyślnie wyrażenia rozróżniają wielkość liter. Aby to zmienić, dodaj opcję ''-i''. | Domyślnie wyrażenia rozróżniają wielkość liter. Aby to zmienić, dodaj opcję ''-i''. | ||
| Linia 275: | Linia 283: | ||
| ~~Zadanie.#~~ Usuń z wyniku komendy | ~~Zadanie.#~~ Usuń z wyniku komendy | ||
| ''egrep '^[Ee]{2}' /usr/share/myspell/en_US.dic'' ukośnik i wszystko za nim. | ''egrep '^[Ee]{2}' /usr/share/myspell/en_US.dic'' ukośnik i wszystko za nim. | ||
| + | \\ <small> (Użyj pliku ''/usr/share/hunspell/en_US.dic'' jeżeli nie masz | ||
| + | podanego wyżej pliku.)</small> | ||
| ==== sort ==== | ==== sort ==== | ||
| Linia 287: | Linia 297: | ||
| * ''sort -k4,6'' używa pól 4, 5 i 6 | * ''sort -k4,6'' używa pól 4, 5 i 6 | ||
| * <del>''sort -k5,4''</del> jest nieprawidłowe | * <del>''sort -k5,4''</del> jest nieprawidłowe | ||
| - | * ''sort -k5,5 -k4,4'' używa pól 5 and 4 | + | * ''sort -k5,5 -k4,4'' używa pól 5 i 4 |
| Klucze sortowania mogą mieć opcje, np. **''-n''** sortuje numerycznie a | Klucze sortowania mogą mieć opcje, np. **''-n''** sortuje numerycznie a | ||
| **''-r''** odwraca kierunek. | **''-r''** odwraca kierunek. | ||
| Linia 361: | Linia 371: | ||
| ~~Zadanie.#~~ Przefiltruj ''man wc'' przez ''cat''. Potem przefiltruj ''man wc'' przez ''wc''. Ile słów jest w ''man wc''? | ~~Zadanie.#~~ Przefiltruj ''man wc'' przez ''cat''. Potem przefiltruj ''man wc'' przez ''wc''. Ile słów jest w ''man wc''? | ||
| - | ~~Zadanie.#~~ Sprawdź wynik ''wc /etc/motd /etc/SUSE-brand''. | + | ~~Zadanie.#~~ Sprawdź wynik ''wc /etc/profile /etc/os-release''. |
| ~~Zadanie.#~~ Polecenie ''perl -e 'printf "%d\n", (int rand(6)+1)+(int rand(6)+1) for(1..100)'<nowiki></nowiki>'' rzuca 100 razy 2d6. | ~~Zadanie.#~~ Polecenie ''perl -e 'printf "%d\n", (int rand(6)+1)+(int rand(6)+1) for(1..100)'<nowiki></nowiki>'' rzuca 100 razy 2d6. | ||
| Linia 398: | Linia 408: | ||
| Np. ''tr -s 123 npn <<< 123_132_13n_ppp'' wypisze ''npn_np_n_p''. | Np. ''tr -s 123 npn <<< 123_132_13n_ppp'' wypisze ''npn_np_n_p''. | ||
| - | Przełącznik ''-c'' powoduje zamianę znaków których nie ma w liście. | + | Przełącznik ''-c'' powoduje zamianę/usunięcie znaków których nie ma w liście. |
| + | Np. ''tr -c a-z _'' zamieni wszystko co nie jest małą literą na podkreślnik. | ||
| - | Listy mogą zawierać zakresy znaków (np. ''[0-9]'', ''[a-f]'') i [[https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html#tag_07_03_01|klasy znaków]] (np. ''[:alnum:]'', ''[:space:]''). | + | Listy mogą zawierać zakresy znaków (np. ''[0-9]'', ''[a-f]'') i [[https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap07.html#tag_07_03_01|klasy znaków]] (np. ''[:alnum:]'', ''[:space:]''). |
| Uwaga: ''tr'' nie przyjmuje nazw plików w liście argumentów - potrafi czytać tylko | Uwaga: ''tr'' nie przyjmuje nazw plików w liście argumentów - potrafi czytać tylko | ||
| Linia 419: | Linia 430: | ||
| i domyślnie wypisuje ją po jego wykonaniu. | i domyślnie wypisuje ją po jego wykonaniu. | ||
| Najprostsza komenda wykonująca znajdź/zastąp to ''sed 's/regexp/replacement/'<nowiki></nowiki>''. | Najprostsza komenda wykonująca znajdź/zastąp to ''sed 's/regexp/replacement/'<nowiki></nowiki>''. | ||
| - | ''sed'' jest kompletne w sensie Turinga. Jeśli starczy czasu w semestrze, ''sed'' będzie omawiany później. | + | ''sed'' jest kompletne w sensie Turinga. |
| ==== awk ==== | ==== awk ==== | ||
| Linia 426: | Linia 437: | ||
| tekstu, również przetwarzającym tekst linia po linii na podstawie podanego skryptu. | tekstu, również przetwarzającym tekst linia po linii na podstawie podanego skryptu. | ||
| W ''awk'' skrypt składa się z reguł – par ''warunek {instrukcje}'', gdzie warunek | W ''awk'' skrypt składa się z reguł – par ''warunek {instrukcje}'', gdzie warunek | ||
| - | określa dopasowanie do linii (bądź początku/końca przetwarzania/pliku). \\ | + | określa dopasowanie do linii (bądź początku/końca przetwarzania/pliku). |
| - | ''awk'' nie jest omawiany na zajęciach z SOp; jest omawiany w ramach obieralnego | + | |
| - | przedmiotu Języki formalne i kompilatory. | + | |
| </small> | </small> | ||
| Linia 472: | Linia 481: | ||
| Po uruchomieniu ''less'' można wyświetlić pomoc naciskając ''h''. Wybór przydatnych skrótów: | Po uruchomieniu ''less'' można wyświetlić pomoc naciskając ''h''. Wybór przydatnych skrótów: | ||
| * //spacja// lub //PgDown// / //PgUp// – idź do następnej / poprzedniej strony | * //spacja// lub //PgDown// / //PgUp// – idź do następnej / poprzedniej strony | ||
| - | * liczba – skacze do linii o tym numerze | + | * liczba – przesuwa o podaną ilość linii |
| * liczba zakończona //%// – skacze do tej części dokumentu | * liczba zakończona //%// – skacze do tej części dokumentu | ||
| - | * //g// / //G// – skacze na początek / koniec dokumentu | + | * //g// / //G// – skacze na początek / koniec dokumentu \\ <small>liczba zakończona //g// / //G// – skacze do podanej linii dokumentu</small> |
| * // /wzorzec // / //?wzorzec// — wyszukuje //wzorca// do przodu / do tyłu \\ //n// / //N// – powtarza wyszukiwane w tym samym / odwrotnym kierunku | * // /wzorzec // / //?wzorzec// — wyszukuje //wzorca// do przodu / do tyłu \\ //n// / //N// – powtarza wyszukiwane w tym samym / odwrotnym kierunku | ||
| * //s// – zapisuje dane do pliku (przydatne jeśli less czyta z potoku) | * //s// – zapisuje dane do pliku (przydatne jeśli less czyta z potoku) | ||