Politechnika Białostocka Wydział Elektryczny Katedra Elektrotechniki Teoretycznej i Metrologii Materiały pomocnicze do zajęć z przedmiotu SYSTEMY OPERACYJNE Kod przedmiotu: F***** Ćwiczenie pt. OPERACJE NA PLIKACH TEKSTOWYCH W SYSTEMIE LINUX: AWK, GREP Pracownia numer 8 Autor: Jarosław Forenc (2004) Aktualizacja: Jarosław Forenc (2006) Białystok 2006 1
1. PROGRAM AWK awk jest programem przetwarzającym wzorce tekstów i tworzącym raporty. Posiada on własny język pozwalający na przetwarzanie plików ASCII, wyszukiwanie występujących w nich pól i fragmentów tekstów, ich modyfikację, przeprowadzanie na nich obliczeń i formatowanie wyprowadzonych wyników. awk jest językiem programowania, w którym wiele konstrukcji zostało zaczerpniętych z języka C. Język awk zawiera zmienne, tablice, pętle, itp. Wywołanie awk ma jedną z dwóch postaci: awk [ Fseparator] program_awk plik... awk [-Fseparator] f skrypt_awk plik... awk przetwarza plik wejściowy lub jeśli nie podano pliku standardowe wejście, a wynik działania wyprowadza na standardowe wyjście. Polecenia przetwarzania podawane są w postaci programu napisanego w języku awk. Program ten moŝe być umieszczony bezpośrednio w linii polecenia (program_awk) lub umieszczony w pliku i wywołany poprzez -f skrypt_awk. W pierwszej postaci treść programu umieszcza się w apostrofach. Drugi format zalecany jest w przypadku bardziej złoŝonych programów awk, gdyŝ umoŝliwia on wielokrotne uŝywanie i łatwiejszą modyfikację programu. Opcja -F pozwala określić znak separatora pól uŝywany do dzielenia wiersza pliku wejściowego na pola. Pominięcie tej opcji oznacza przyjęcie spacji i tabulacji jako znaku rozdzielającego. Program w języku awk (program_awk, skrypt_awk) składa się z opcjonalnej części inicjalizującej, właściwego przetwarzania i opcjonalnego zakończenia. Struktura pliku z częściami opcjonalnymi wygląda w następujący sposób: BEGIN { akcje_początkowe } [ kryterium_1 ] [ { akcja_1 } ] [ kryterium_2 ] [ { akcja_2 } ]... END { akcje_końcowe } - opcjonalna część inicjalizująca - opcjonalna część zakończenia Akcje_początkowe wykonywane są przed przetworzeniem pierwszej linii pliku wejściowego. Akcje_końcowe wykonywane są po przetworzeniu wszystkich danych wejściowych, zostaną one wykonane takŝe w przypadku, gdy program zostanie wcześniej zakończony poprzez instrukcję exit. Ogólna postać instrukcji wygląda następująco (nawiasy klamrowe są częścią składni i muszą występować): [ kryterium ] [ { akcja } ] 2
Wykonywanie programu odbywa się w ten sposób, Ŝe awk czyta linię wejściową i sprawdza czy spełnione jest kryterium_1, tzn. czy wzorzec będący kryterium_1 odpowiada bieŝącemu wierszowi. Jeśli tak, to wykonywana jest akcja_1 (sekwencja akcji oddzielonych od siebie średnikiem lub znakiem nowej linii). Następnie sprawdzane jest kryterium_2, itd. Po przejściu przez wszystkie kryteria i akcje wczytywana jest następna linia wejścia i cały proces powtarza się. Jeśli w instrukcji brakuje kryterium, to wszystkie akcje tej instrukcji wykonywane są dla wszystkich linii wejścia. Jeśli w instrukcji brakuje akcji, to niezmieniona linia jest wypisywana na wyjściu standardowym. Jeśli natomiast wykonywana jest akcja, to wiersze nie są automatycznie przesyłane na standardowe wyjście (trzeba wykorzystać do tego celu polecenie print). Po wczytaniu linii wejścia jest ona dzielone na pola, którym kolejno przypisywane są zmienne $1, $2, itd. Zmienna $0 zawiera całą linię. Podział linii na pola odbywa się na podstawie separatorów pól zapisanych w zmiennej FS (określonych za pomocą opcji -F). Separatorem domyślnym jest spacja lub tabulacja. Po podzieleniu wiersza na pola, kaŝde pole moŝe być przetwarzane niezaleŝnie, np. $ awk { print $3 } plik1 - wyświetla trzecie pole wszystkich linii z pliku plik1. Jako kryterium moŝe występować: wyraŝenie regularne w postaci /wzór/ w takim przypadku kryterium jest tekstem lub wzorem tekstu w postaci /wzór/, np. $ awk /napis/ plik1 - wyświetla wszystkie linie z pliku plik1 zawierające tekst napis, w przykładzie tym nie ma zdefiniowanej akcji (wykonywana jest domyślna akcja), zakres wierszy /wzór_1/,/wzór_2/ zakres ten oznacza wszystkie linie od tej, w której po raz pierwszy wystąpił wzór_1, aŝ do tej, w której wystąpił wzór_2 (łącznie z tą linią), np. $ awk /napis1/,/napis2/ plik1 - wyszukuje w pliku plik1 linię zawierającą napis1, wyświetla wszystkie linie począwszy od tej, aŝ do linii zawierającej napis2 włącznie, następnie ponownie poszukuje linii zawierającej tekst napis1, itd., wyraŝenie relacyjne w takim przypadku rozkazy zawarte w części operacyjnej zostaną wykonane tylko wtedy, gdy relacja jest spełniona lub wyraŝenie zwraca wartość 3
prawda, wyraŝenia relacyjne mogą być tworzone w następujący sposób: wzorzec && wzorzec (and), wzorzec wzorzec (or),!wzorzec (not), np. $ awk $1 == tekst plik1 - sprawdza czy pierwsze pole zawiera napis tekst, jeśli warunek jest prawdziwy to wiersz jest wyświetlany, połączenie powyŝszych moŝliwości np. $ awk /^t1/ && /t2$/ plik1 - wyświetlenie tych linii pliku plik1, które rozpoczynają się napisem t1 i kończą napisem t2, We wzorach mogą występować metaznaki (znaki globalne): Metaznak Funkcja. dowolny znak (oprócz nowej linii).* dowolny łańcuch (równieŝ pusty) * dowolne powtórzenie [...] kaŝdy znak z... [^...] Ŝaden znak z... ^ na początku linii $ na końcu linii \(...\) zgrupowanie \ maskowanie metaznaku? powtórzenie 1 raz (lub 0 razy) + jednokrotne lub wielokrotne powtórzenia ^wzór na początku linii wzór$ na końcu linii a b a lub b W polu akcja umieszczane jest jedno lub wiele poleceń, które określają działanie dla bieŝącego wiersza. KaŜde polecenie w akcji oddzielone jest średnikiem, znakiem nowej linii lub znakiem prawego nawiasu klamrowego. Wszystkie polecenia muszą się znaleźć między nawiasami klamrowymi. W programach w języku awk moŝna wykorzystywać: stałe stałe numeryczne są liczbami całkowitymi lub zmiennoprzecinkowymi (zapis liczb taki sam jak w języku C), stałe tekstowe ujmowane są w cudzysłów tekst, sam znak cudzysłowu w stałej tekstowej musi być maskowany znakiem \, czyli \, 4
zmienne zmiennych nie deklaruje się, rodzaj zmiennej (numeryczna, znakowa) zaleŝny jest od kontekstu, zmienne nie są poprzedzane znakiem dolara, występują dwa rodzaje zmiennych: proste i indeksowane (tablice), element tablicy oznaczany jest poprzez zmienna[indeks], w awk występuje kilka zmiennych predefiniowanych: $0 - aktualnie przetwarzana linia wejścia $i - i-te pole aktualnie przetwarzanej linii wejścia FILENAME - nazwa bieŝącego pliku wejściowego FS - separator pól wejściowych (wartością standardową są białe znaki - spacja, tabulacja), predefiniowanie separatora pól na inny znak: FS=znak, powrót do ustawień standardowych: FS= NF - liczba pól bieŝącej linii wejściowej po podziale przy uŝyciu separatora FS NR - numer bieŝącej linii wejściowej OFMT - format wyjścia dla liczb, standardowo %.g OFT - separator pól wyjściowych, standardowo jest to spacja ORS - separator linii wyjściowych, wartością standardową jest znak końca wiersza RS - separator linii wejściowych, wartością standardową jest znak końca wiersza wyraŝenia w wyraŝeniach mogą występować: - operatory arytmetyczne: +, -, /, *, % (dzielenie modulo), - operatory porównania: <, <=, ==,!=, >=, >, - operatory logiczne: &&,, ~ (jest zawarte w),!~ (nie jest zawarte w), - operatory języka C: ++, --, +=, -=, *=, /=, %=. WyraŜenie traktowane jest jako wyraŝenie numeryczne lub operacja na łańcuchach znaków w zaleŝności od jego elementów. Aby wyraŝenie było traktowane jako wyraŝenie numeryczne moŝna dodać do niego zero +0. Aby wyraŝenie było interpretowane jako wyraŝenie tekstowe, to moŝna osiągnąć to poprzez jego konkatenację z pustym łańcuchem. instrukcje uŝycie instrukcji jest takie samo jak w języku C, instrukcje mogą występować w wyraŝeniach, do podstawowych instrukcji naleŝą: 5
if ( warunek ) { instrukcje_1 } [ else { instrukcje_2 } ] - jeśli warunek jest spełniony wykonywane są instrukcje_1, w przeciwnym wypadku - instrukcje_2, while ( warunek ) { instrukcje } - instrukcje są wykonywane dopóki warunek jest prawdziwy, for ( wyraŝenie; warunek; wyraŝenie ) { instrukcje } - działa tak samo jak pętla for w języku C, break - przerwij wykonywanie pętli, w której umieszczone jest polecenie break i wznów działanie od polecenia występującego za końcem pętli, continue - rozpocznij wykonywanie następnej iteracji pętli, { [ instrukcja ]... } - wykonaj instrukcję, print [ lista_wyraŝeń ] [ przeadresowanie ] - drukuj wyraŝenia na standardowym wyjściu, wyraŝenia (zmienne) muszą być rozdzielone przecinkami, printf format [, lista_wyraŝeń ] [ przeadresowanie ] - drukowanie wzorowane na funkcji printf języka C, zmienna = wyraŝenie - przypisz zmiennej wartość wyraŝenia, next - pomiń sprawdzanie następnych wzorców dla tego wiersza, exit wyraŝenie - pomiń resztę wierszy pliku wejściowego i przejdź do END jeśli istnieje # komentarz - wstawienie tekstu komentarza, Przeadresowanie moŝe mieć następującą postać: > plik (przeadresowanie), >> plik (dopisanie), program (przekazanie przez potok). funkcje numeryczne exp(x) - wartość funkcji exp(x) int(x) - część całkowita wartości numerycznej log(x) - wartość funkcji ln(x) sqrt(x) - pierwiastek kwadratowy length(x) - liczba znaków (w bajtach) ciągu x length - długość aktualnej linii $0 atan2(x) - wartość funkcji arctan(x) cos(x) - wartość funkcji cos(x) 6
rand(x) - liczba losowa z zakresu <0,1> srand(x) - inicjalizacja generatora liczb losowych dla rand(x) $ awk { if (length < 10) print $0 } plik1 - wypisanie wszystkich linii pliku plik1 o długości mniejszej od 10 (brak kryterium), $ awk BEGIN { N = 0 } - wypisanie ilości linii zawierających napis tekst, /tekst/ { N = N + 1 } END { print N } plik1 ZałóŜmy, Ŝe plik osoby zawiera następujące dane: Jan Kowalski 25 68 173 Adam Nowak 24 80 168 Piotr Kruk 20 72 180 Jacek Niski 23 80 173 Marcin Mrozek 25 75 165 Przy czym poszczególne kolumny oznaczają: imię, nazwisko, wiek, wagę i wzrost. Po wczytaniu jednego wiersza jest on dzielony na pola, którym przypisywane są zmienne $1, $2, itd. Zmiennej $0 przypisywana jest cała linia. W powyŝszym przykładzie dla pierwszego wiersza otrzymamy: $0 Jan Kowalski 25 68 173 $1 Jan $2 Kowalski $3 25 $4 68 $5 173 pozostałe predefiniowane zmienne będą miały wartości: FILENAME NF 5 NR 1 osoby Cały plik moŝemy wyświetlić poleceniem: $ awk { print } osoby Przy wyświetlaniu pliku moŝemy dodać numerację linii: $ awk { print NR, $0 } osoby 1 Jan Kowalski 25 68 173 2 Adam Nowak 24 80 168 3 Piotr Kruk 20 72 180 4 Jacek Niski 23 80 173 5 Marcin Mrozek 25 75 165 7
W prosty sposób moŝna zmienić kolejność kolumn: $ awk { print $2, $1, $3, $4, $5 } osoby Kowalski Jan 25 68 173 Nowak Adam 24 80 168 Kruk Piotr 20 72 180 Niski Jacek 23 80 173 Mrozek Marcin 25 75 165 MoŜemy teŝ wybrać linie, których pola spełniają określone warunki, np. waga powyŝej 75 kg i wzrost powyŝej 170 cm. $ awk $4 > 75 && $5 > 170 { print } osoby Jacek Niski 23 80 173 Do sprawdzenia średniego wzrostu osób znajdujących się na liście napiszemy skrypt: BEGIN { I = 0; SUMA = 0 } { I++; SUMA = SUMA + $5 } END { print SUMA / I } Uruchamiamy skrypt: $ awk -f skrypt osoby 171,8 2. POLECENIE GREP Polecenie grep wyszukuje podany wzorzec tekstu w pliku. Składnia polecenia jest następująca: grep [opcje] wzorzec [plik...] grep [opcje] [-e wzorzec -f plik] [plik...] Polecenie grep przeszukuje wskazane pliki wejściowe (lub standardowe wejście, jeśli nie podano Ŝadnych plików lub jako nazwę pliku podano znak minusa), szukając linii zawierających podany wzorzec. Domyślnie polecenie grep wypisuje nazwy plików i pasujące w nich linie. Polecenie grep moŝe takŝe pracować jako filtr wyszukujący wzory tekstów w strumieniu wejścia standardowego. Dodatkowo dostępne są dwa programy wariantowe: egrep (jest tym samym co grep z opcją -E) i fgrep (jest tym samym co grep z opcją -F). Jako opcje program przyjmuje m.in.: -a - przetwarza plik binarny tak, jakby był on tekstowy, -b - wypisuje przed kaŝdą linią wyjścia jej offset bajtowy w pliku wejściowym, -c - dla kaŝdego pliku wejściowego wypisuje tylko liczbę pasujących linii, 8
-e wzorzec - opcja ta stosowana jest gdy wyraŝenie rozpoczyna się znakiem minusa (-). WyraŜenie moŝe być napisane bezpośrednio po -e lub z poprzedzającą spacją, -F - interpretuje wzorzec jako listę łańcuchów o stałej długości, oddzielonych znakami nowej linii, które naleŝy dopasować kaŝdy z osobna, -f plik - pobiera wzorce z pliku, po jednym z kaŝdej linii, -H - dla kaŝdego dopasowania wypisuje nazwę pliku, -h - wyłącza poprzedzanie wyników nazwami plików podczas przeszukiwania wielu plików, -i - ignoruje rozróŝnianie wielkich liter we wzorcu oraz w plikach wejściowych, -L - wypisuje tylko nazwę kaŝdego pliku, z którego normalnie nie wypisano by Ŝadnego wyjścia, -l - wypisuje tylko nazwę kaŝdego pliku, z którego normalnie wypisano by wyjście, -n - przed kaŝdą linią, w której znaleziono tekst wyświetla numer linii z odpowiadającego pliku wejściowego, -r - czyta wszystkie pliki pod kaŝdym katalogiem rekurencyjnie, -v - odwraca sens dopasowania, wyprowadza tylko linie nie zawierające wzorca tekstu, -w - wybiera tylko te linie, w których dopasowania wzorca tworzą całe słowa, -x - wybiera tylko te dopasowania, które dokładnie pasują do całej linii. W przypadku stosowania we wzorcu metaznaków:?, +, {,, (, ) naleŝy poprzedzać je znakiem ukośnika: \?, \+, \{, \, \(, \). $ grep -c tekst plik1 - wypisuje liczbę linii pliku plik1, w którym występuje wzorzec tekst, $ grep -n student /etc/passwd - wyświetla numery linii i linie z pliku passwd zawierające ciąg student, $ ps -e grep gnome - wypisuje wszystkie procesy zawierające w nazwie słowo gnome. 9
3. OPIS DODATKOWYCH POLECEŃ DOTYCZĄCYCH PLIKÓW TEKSTOWYCH cmp porównuje dwa pliki lub zestawy bajtów Składnia: cmp [-c][-i ile][-l][-s] plik1 plik2 Opis: Polecenie to porównuje dwa pliki dowolnego typu i wypisuje wynik na standardowym wyjściu. Domyślnie cmp nic nie wypisuje, gdy oba pliki są takie same. Jeśli pliki róŝnią się to wyświetlany jest numer bajtu i numer linii, gdzie wystąpiła pierwsza róŝnica. Bajty i linie numerowane są od wartości jeden. Opcje: -c - wypisuje róŝniące się znaki, znaki sterujące wyświetlane są w postaci ^ plus litera, -i ile - ignoruje wszelkie róŝnice w ile początkowych bajtach kaŝdego z plików. Traktuje pliki zawierające mniej niŝ ile bajtów jakby były puste, -l - dla kaŝdej róŝnicy wypisuje numer bajtu (dziesiętnie) i wartości róŝniących się bajtów (ósemkowo), -s - nic nie wypisuje zwracając kod zakończenia wskazujący czy pliki róŝnią się. $ cmp plik1 plik2 - porównuje pliki o nazwach plik1 i plik2 plik1 plik2 differ: byte 8, line 1 wyświetlając numer bajtu i numer linii, w której wystąpiła pierwsza róŝnica. diff wyszukuje i zaznacza róŝnice pomiędzy dwoma plikami Składnia: diff [opcje] plik1 plik2 Opis: Polecenie to porównuje oba podane pliki i wyświetla na wyjściu standardowym informację, które linie muszą zostać zmienione aby z plik1 otrzymać plik2. Wyjście ma następujący format: n1 a n3, n4 - dla linii, które naleŝy dołączyć, n1, n2 d n3 - dla linii, które naleŝy usunąć, n1, n2 c n3, n4 - dla linii, które naleŝy wymienić. 10
Jeśli jako nazwę pliku podamy minus (-), to tekst odczytywany jest ze standardowego wejścia. Jeśli plik1 jest katalogiem, a plik2 nie, to diff porównuje plik z katalogu plik1, którego nazwa jest taka sama jak plik2, i odwrotnie. Jeśli plik1 i plik2 są katalogami, to diff porównuje odpowiednie pliki w obu katalogach, w kolejności alfabetycznej. Opcje: -i - ignorowanie zmian w wielkości liter - duŝe i małe litery uznawane są za równowaŝne, -w - ignorowanie wszystkich odstępów przy porównywaniu plików, -b - ignorowanie zmian w ilości odstępów, -B - ignorowanie zmian, które dodają lub usuwają puste linie, -q - poinformowanie jedynie czy pliki się róŝnią bez podawania szczegółów na temat róŝnic, -e - stworzenie wyjścia, które jest poprawnym skryptem programu ed, -r - rekurencyjne porównywanie wszystkich podkatalogów, jeśli porównywane są katalogi, -s - poinformowanie jeśli oba pliki są identyczne. $ diff -q plik1 plik2 - porównuje pliki o nazwach plik1 i plik2 Files plik1 and plik2 differ wyświetlając informację, czy pliki róŝnią się. find wyszukuje pliki o podanych atrybutach Składnia: find [katalog...][wyraŝenie] Opis: Polecenie to przeszukuje rekurencyjnie podane katalogi szukając plików spełniających kryteria podane przez wyraŝenie. Jeśli nie podano katalogów uŝywany jest katalog bieŝący. Jeśli nie podano wyraŝenia, uŝywane jest wyraŝenie -print. Opcje: -name nazwa_pliku - poszukuje wyspecyfikowanych plików, w nazwie pliku moŝna stosować znaki globalne, -print - podaje ścieŝkę dostępu do znalezionych plików, -perm prawa - poszukuje plików z podanymi (w formacie liczby ósemkowej) prawami dostępu do pliku, 11
-type x - plik ma być typu x: c - pliki specjalne znakowe, b - pliki specjalne blokowe, d - katalogi, f - zwykłe pliki, p - bufor typu FIFO, -links n - do pliku istnieje n dowiązań, -user name - plik naleŝy do właściciela name (moŝna podać takŝe UID), -group name - plik naleŝy do grupy name (moŝna podać takŝe GID), -size n - plik ma być o wielkości n bloków (po 512 bajtów w bloku), -atime n - plik był uŝywany w ciągu ostatnich n dni, -ctime n - plik był załoŝony w ciągu ostatnich n dni, -mtime n - plik był modyfikowany w ciągu ostatnich n dni, -newer plik1 - plik był później modyfikowany niŝ plik1, -exec polecenie - podane polecenie będzie zastosowane do plików, spełniających warunek poszukiwania. W poleceniu klamry {} są zastępowane aktualną ścieŝką dostępu, -ok polecenie - działa jak -exec, ale wyprowadza na standardowe wyjście pełną nazwę polecenia, które ma być wykonane i wykonuje je dopiero po potwierdzeniu literą y. Jeśli w warunkach poszukiwań podawana jest liczba n, to oznacza ona: n - liczba całkowita n, +n - liczba większa od n, -n - liczba mniejsza od n. $ find /home/student -ctime -2 - wyszukuje w podanym katalogu pliki, które zostały utworzone w ciągu ostatnich dwóch dni, $ find /home/student -perm 777 - wyszukuje w podanym katalogu pliki, które mają nadane wszystkie prawa dostępu, $ find /home/student -ctime 0 -type d - wyszukuje w podanym katalogu katalogi utworzone w ciągu ostatniego dnia. head wyświetla kilka pierwszych linii pliku Składnia: head opcje plik... Opis: Polecenie to wyświetla dla kolejnych podanych plików ich nazwy i pierwsze (domyślnie 10) linie ich treści. Jeśli nie podane zostały nazwy plików, to head czyta ze standardowego wejścia. Polecenie head akceptuje dwa formaty opcji: nowy, w którym liczby są argumentami opcji literowych (np. -n 1) i stary, w którym liczby poprzedzają jakiekolwiek opcje literowe (np. -1b). 12
Opcje: -c N - wypisuje pierwsze N bajtów pliku. N jest liczbą naturalną, po której opcjonalnie moŝe wystąpić inny znak określający inną jednostkę: b - bloki 512-bajtowe, k - bloki kilobajtowe, m - bloki megabajtowe, -l, -n N - wypisuje pierwsze N linii, -l jest rozpoznawane tylko z uŝyciem starego formatu opcji, -Nopcje - opcja taka rozpoznawalna jest tylko jeśli jest podana jako pierwsza. N jest liczbą dziesiętną, po której opcjonalnie występuje litera rozmiaru (b, k, m) lub litera l oznaczająca zliczanie linii. Bez podania opcji takŝe zliczane są linie. $ head -5 plik1 - wyświetla 5 początkowych linii pliku plik1, $ head -5l plik1 - wyświetla 5 początkowych linii pliku plik1 (stary format), $ head -n 5 plik1 - wyświetla 5 początkowych linii pliku plik1 (nowy format). more umoŝliwia przeglądanie plików stronami Składnia: more opcje [-n] [+n] [+/wzór] [plik...] Opis: More jest filtrem słuŝącym do przeglądania tekstu strona po stronie. Wyprowadza pliki na ekran w stronach o odpowiedniej dla niego długości. Długość strony moŝe być zmieniona. Po wyprowadzeniu pierwszej strony tekstu naciśnięcie Enter spowoduje wyprowadzenie kolejnej linii, a naciśnięcie Spacji - kolejnej strony. Opcje linii komend: -n - zmiana długości wyprowadzanej strony na n-wierszy, +n - rozpoczęcie wyprowadzania od linii o numerze n, +/wzór - określa łańcuch znaków (wzór), który naleŝy odszukać i rozpocząć wyprowadzanie o dwie linie wcześniej niŝ linia, w której występuje wzór, -c - zapobiega przesuwaniu w górę pierwszej strony przy wyprowadzaniu kolejnych, co ułatwia czytanie, -f - obcina zamiast łamać długie linie, -l - ignoruje przy wyświetlaniu znak nowej strony, -s - scala wiele następujących po sobie spacji (lub pustych linii) i wyprowadza jako jedną. 13
Po wyprowadzeniu strony przez more uŝytkownik moŝe wpływać na wyświetlanie dalszej części pliku za pomocą komend: h lub? - help, opis działania polecenia more, Spacja - wyprowadzenie następnej strony tekstu, Enter - wyprowadzenie następnej linii tekstu, q lub Q - opuszczenie more, n Spacja - wyprowadzenie następnych n linii tekstu, d lub Ctrl+d - wyprowadzenie następnych 11 linii tekstu, nz - wyprowadzenie nowej strony z nową długością strony równą od tego momentu n, ns - przeskocz n linii tekstu w przód (domyślnie jedną), nf - przeskocz n ekranów tekstu w przód (domyślnie jeden), nb - przeskocz n linii tekstu w tył (domyślnie jeden). $ more +/tekst plik1 - wyświetla zawartość pliku plik1 rozpoczynając wyświetlanie dwie linie wcześniej niŝ linia zawierająca słowo tekst, $ ls -l more - wyświetla listę plików z bieŝącego katalogu z podziałem na strony (zastosowanie more jako filtr). sort sortuje i łączy pliki tekstowe Składnia: sort opcje [+poz1 [-poz2]] [-k poz1[,poz2]][-o plik_wyj] plik Opis: Polecenie to sortuje linie wyspecyfikowanych plików i zapisuje wynik na wyjściu standardowym. Wywołane bez nazw plików, lub gdy zamiast nazw plików zostanie podany znak minus (-), będzie czytało ze standardowego wejścia, tzn. pracować jako filtr. Bez dodatkowych opcji sortowanie odbywa się w porządku leksykograficznym. Polecenie sort ma trzy tryby działania: - sortowanie (domyślny), - zlepianie (wymaga wywołania z opcją -m), sort zlepia podane pliki sortując je jako grupę. KaŜdy plik wejściowy powinien juŝ być posortowany, - sprawdzanie posortowania (wymaga wywołania z opcją -c), sort sprawdza, czy podane pliki są juŝ posortowane, jeśli nie wszystkie są posortowane, to wypisuje komunikat o błędzie i kończy pracę z kodem równym 1. 14
Para linii porównywana jest w następujący sposób: jeśli podano jakieś pola kluczowe, to sort porównuje kaŝdą parę pól w porządku podanym w linii komend, według skojarzonych opcji porządkowania, aŝ znaleziona zostanie róŝnica albo przeszukane zostaną wszystkie pola. Jeśli uŝyto którejś z opcji globalnych, ale nie podano słów kluczowych, sort porównuje całe linie według opcji globalnych. Opcje do zmiany porządku sortowania: -b - ignoruje początkowe znaki spacji i tabulacji, -d - porównuje tylko litery, cyfry i znaki puste, -f - nie uwzględnia wielkości liter (podstawia znaki małych liter za odpowiednie znaki duŝych liter), -g - sortuje numerycznie przekształcając przedrostek kaŝdej linii na liczbę zmiennoprzecinkową podwójnej precyzji, -i - ignoruje znaki niedrukowalne podczas sortowania (spoza zakresu ASCII 040 8-176 8 ), -n - sortowanie numeryczne wartości występujących na początku linii, -r - zmienia porządek sortowania na malejący. Inne opcje: -o plik_wyj - wypisuje wynik do plik_wyj, a nie na standardowe wyjście, +poz1 [-poz2] - określa pole w kaŝdej linii, którego naleŝy uŝyć jako klucza sortowania, pole to składa się z części linii zaczynającej się na poz1 aŝ do poz2 (bez poz2) lub do końca linii jeśli nie podano poz2. Pola i pozycje znaków numerowane są od 0, -k poz1[,poz2] - j.w. w nowej wersji, pole jest częścią linii pomiędzy poz1 i poz2 włącznie. Pola i pozycje znaków numerowane są od 1. $ sort -c plik1 - sprawdza czy podany plik jest sort: plik1: 2: disorder: tekst w pliku posortowany, jeśli nie jest, to wyświetla informację o pierwszej linii, która jest nieposortowana. $ ls sort -r - wyświetla listę plików z bieŝącego katalogu sortując w odwrotnej kolejności (zastosowanie sort jako filtr). 15
tail wyświetla kilka ostatnich linii pliku Składnia: tail opcje plik... Opis: Polecenie to wyświetla dla kolejnych podanych plików ich nazwy i ostatnie (domyślnie 10) linie ich treści. Jeśli nie podane zostały nazwy plików, to tail czyta ze standardowego wejścia. Polecenie tail akceptuje dwa formaty opcji: nowy, w którym liczby są argumentami opcji literowych (np. -n 1) i stary, w którym +, -, i opcjonalnie liczby poprzedzają jakiekolwiek opcje literowe (np. -1 lub +1). Jeśli liczba N rozpoczyna się od znaku +, to tail zaczyna wypisywanie od N-tego elementu od początku kaŝdego pliku, a nie od końca. Opcje: -c N - wypisuje końcowe N bajtów. N to liczba naturalna, po której opcjonalnie następuje znak określający inną jednostkę: b - bloki 512-bajtowe, k - bloki kilobajtowe, m - bloki megabajtowe, -l, -n N - wypisuje ostatnie N linii, -l jest rozpoznawane tylko z uŝyciem starego formatu opcji, -Nopcje, +Nopcje - opcja taka rozpoznawalna jest tylko jeśli jest podana jako pierwsza. N jest liczbą dziesiętną, po której opcjonalnie występuje litera rozmiaru (b, k, m) lub litera l oznaczająca zliczanie linii. Bez podania opcji takŝe zliczane są linie. $ tail -5 plik1 - wyświetla 5 ostatnich linii pliku plik1, $ tail +5 plik1 - wyświetla zawartość pliku plik1 począwszy od 5 linii. wc wyświetla liczbę linii, słów i bajtów w pliku Składnia: wc opcje plik... Opis: Polecenie to podaje liczbę linii, słów i bajtów w pliku podanym jako argument (lub w tekście podanym z wejścia standardowego). Słowa oddzielone są od siebie białymi znakami. Liczba linii jest to liczba znaków końca wiersza. W przypadku braku opcji dla kaŝdego pliku wypisywana jest jedna linia zawierająca: liczbę linii, liczbę słów, liczbę bajtów i nazwę pliku. Jeśli podano 16
więcej niŝ jedną nazwę pliku to polecenie wc wypisuje linię końcową zawierającą łączne liczby z nazwą pliku total (lub razem). Opcje: -c - wypisuje tylko liczbę bajtów, -w - wypisuje tylko liczbę słów, -l - wypisuje tylko liczbę linii, -L - wypisuje tylko długość najdłuŝszej linii. wc plik1 plik2 2 7 26 plik1 3 7 30 plik2 5 14 56 razem LITERATURA: [1] Taylor D.: 101 skryptów w shellu, Mikom, Warszawa, 2004. [2] Lal K., Rak T.: Linux. Komendy i polecenia. Praktyczne przykłady, Helion, Gliwice, 2005. [3] Robbins A., Beebe N.H.F.: Programowanie skryptów powłoki, Helion, Gliwice, 2005. [4] Newham C., Rosenblatt B.: bash. Wprowadzenie, Helion, Gliwice, 2006. [5] Robak S.: XENIX. Wielodostępny, wieloprogramowy system operacyjny (Unix System V), Zielona Góra, 1991. [6] Ray D.S., Ray E.J.: Po prostu Unix, Helion, Gliwice 2000. [7] Marczyński J.: UNIX: uŝytkowanie i administrowanie, Helion, Gliwice 2000. [8] Armstrong J., Taylor D.: Unix dla kaŝdego, Helion, Gliwice 2000. [9] Ball B., Pitts D.: Red Hat Linux 6. Księga Eksperta, Helion, Gliwice 2000. [10] Medinets D.: Unix: narzędzia programowania powłok, Wydawnictwo PLJ, Warszawa 2000. [11] Goodheart B., Cox J.: Sekrety magicznego ogrodu: Unix System V wersja 4 od środka: podręcznik, WNT, Warszawa 2001. [12] Arthur L.J., Burns T.: Unix. Programowanie w shellu, Mikom, Warszawa 1998. [13] Nemeth E., Snyder G., Seebass S., Hein T.R.: Przewodnik administratora systemu Unix, WNT, Warszawa 1998. 17
Wymagania BHP Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z instrukcją BHP i instrukcją przeciw poŝarową oraz przestrzeganie zasad w nich zawartych. Wybrane urządzenia dostępne na stanowisku laboratoryjnym mogą posiadać instrukcje stanowiskowe. Przed rozpoczęciem pracy naleŝy zapoznać się z instrukcjami stanowiskowymi wskazanymi przez prowadzącego. W trakcie zajęć laboratoryjnych naleŝy przestrzegać następujących zasad: Sprawdzić, czy urządzenia dostępne na stanowisku laboratoryjnym są w stanie kompletnym, nie wskazującym na fizyczne uszkodzenie. Sprawdzić prawidłowość połączeń urządzeń peryferyjnych. JeŜeli istnieje taka moŝliwość, naleŝy dostosować warunki stanowiska do własnych potrzeb, ze względu na ergonomię. Monitor komputera ustawić w sposób zapewniający stałą i wygodną obserwację dla wszystkich członków zespołu. Załączenie komputera moŝe się odbywać po wyraŝeniu zgody przez prowadzącego. Zabronione jest dokonywanie jakichkolwiek przełączeń w urządzeniach oraz wymiana elementów składowych pod napięciem. Konfiguracja sprzętu (np. konfiguracja systemu operacyjnego, ustawienie parametrów monitora) moŝe się odbywać wyłącznie w porozumieniu z prowadzącym zajęcia. W trakcie pracy z komputerem zabronione jest spoŝywanie posiłków i picie napojów. W przypadku zaniku napięcia zasilającego naleŝy niezwłocznie wyłączyć komputer i monitor z sieci elektrycznej. Stwierdzone wszelkie braki w wyposaŝeniu stanowiska oraz nieprawidłowości w funkcjonowaniu sprzętu naleŝy przekazywać prowadzącemu zajęcia. W przypadku zakończenia pracy naleŝy zakończyć sesję przez wydanie polecenia wylogowania. Zamknięcie systemu operacyjnego moŝe się odbywać tylko na wyraźne polecenie prowadzącego. 18