Kontakt  |  PRS 170  |  ALK 420  |  PZR 420  |  SIK 420  |  JPR 222  |  SOP 121


Systemy operacyjne - ćwiczenia 4


Temat zajęć: Dowiązania w systemie plików. Edytory vi i sed.


 Dowiązania

Każdy plik na dysku posiada dotyczący go wpis w co najmniej jednym katalogu systemu plików. Dany plik może posiadać wpisy (dowiązania twarde - hard links) wielokrotne, w tym samym bądź w różnych katalogach. Usunięcie pliku za pomocą komendy rm nie musi powodować jego fizycznego usunięcia z nośnika danych - rm usuwa jedynie konkretne dowiązanie do pliku. Fizyczne usunięcie pliku następuje w momencie, gdy usuwane jest ostatnie twarde dowiązanie do tego pliku.
Dowiązania symboliczne (symbolic links) służą do umieszczania w katalogach odwołań do innych wpisów katalogowych. Nie tworzą one kolejnego dowiązania do pliku, a jedynie wskazanie na inną pozycję (nazwę pliku) w tym samym bądź w innym katalogu.
Utworzenie dowiązania twardego:
$ ln istniejące_dowiązanie nowe_dowiązanie
Utworzenie dowiązania symbolicznego:
$ ln -s istniejące_dowiązanie nowe_dowiązanie
Liczba twardych dowiązań podana jest w drugiej kolumnie wyjścia polecenia ls -l.


 Edytor vi

Edytor vi (visual editor) działa w trybie pełnoekranowym na praktycznie każdym dostępnym współcześnie rodzaju terminala. Właśnie fakt, że jego wymagania co do możliwości terminala i prędkości połączenia są tak skromne, jest jego największą zaletą.
Edytor uruchamiamy poleceniem
$ vi [nazwa_pliku]
Podstawowym faktem, o którym zawsze należy pamiętać przy pracy z edytorem vi jest to, że pracuje on zawsze w jednym z dwóch (niektórzy twierdzą, że trzech) trybów:
  • trybie dopisywania, w którym możliwe jest dodawanie nowych znaków do edytowanego dokumentu,
  • trybie poleceń, w którym możliwa jest nawigacja po dokumencie, wykonywanie poleceń edycyjnych za pomocą kombinacji klawiszy oraz wydawanie poleceń w wierszu poleceń.
Przejście z trybu dopisywania do trybu poleceń odbywa się poprzez wciśnięcie klawisza Esc (escape). Przejście z trybu poleceń do trybu dopisywania odbywa się zwykle po wciśnięciu klawisza a (append - dołączanie tekstu za aktualnie wskazywanym znakiem) lub i (insert - wstawianie tekstu przed aktualnie wskazywanym znakiem). Oczywiście w trybie dopisywania klawisz a powoduje wstawienie do tekstu znaku a, a klawisz i - znaku i.
Będąc w trybie poleceń możemy przejść do tzw. wiersza poleceń, który umożliwia wydawanie komend słownych, wykonujących pewne operacje na dokumencie. Wiersz poleceń uaktywnia się przez : (dwukropek), a powrót do trybu poleceń uzyskujemy, podobnie jak w trybie dopisywania, przez wciśnięcie Esc.

UWAGA:

Klawisz Esc w trybie poleceń nie ma przypisanej żadnej funkcji. Jeśli zatem nie jesteśmy pewni, czy pracuemy w trybie dopisywania, czy w trybie poleceń, zawsze można wcisnąć Esc i jest to "bezpieczne" w tym sensie, że w obu przypadkach znajdziemy się w trybie poleceń.

NAWIGACJA W TEKŚCIE:
  • w większości nowoczesnych terminali działają klawisze kursora (strzałki) oraz PageUp, PageDown, Home i End (lub część z nich)
  • h - lewo, j - dół, k - góra, l - prawo
  • 0 - na początek wiersza, $ - na koniec wiersza
  • Ctrl-f - jeden ekran w dół, Ctrl-b - jeden ekran w górę
  • w - na początek następnego słowa, b - na początek poprzedniego słowa
  • + - do pierwszego znaku w następnym wierszu, - - do pierwszego znaku w poprzednim wierszu
  • nG - do wiersza nr n (również poprzez :n[enter])
  • rznak - zastąpienie znaku pod kursorem znakiem znak
KOŃCZENIE PRACY I ZAPISYWANIE TEKSTU:
  • ZZ - wyjście z zapisaniem tekstu
  • :q - wyjście bez zapisania tekstu o ile nie był on zmieniony
  • :q! - wyjście bez zapisania tekstu nawet jeśli został zmieniony (zmiany przepadną)
  • :w - zapis bieżącego dokumentu i kontynuacja pracy z vi
PRZEJŚCIE DO TRYBU WPROWADZANIA:
  • a - dopisywanie za znakiem wskazywanym przez kursor
  • i - dopisywanie przed znakiem wskazywanym przez kursor
  • A - dopisywanie na końcu wiersza (równoważne z $a)
  • I - dopisywanie na początku wiersza (równoważne z 0i)
  • R - dopisywanie w trybie nadpisywania (zastępowania)
  • o - dopisywanie w nowym wierszu poniżej kursora
  • O - dopisywanie w nowym wierszu powyżej kursora
  • Esc - przejście do trybu poleceń
  • :r plik - wstawia zawartość pliku plik poniżej wiersza z kursorem (pozostaje w trybie poleceń)
MANIPULACJA DOKUMENTEM:
  • J - połącz dwa wiersze
  • dd - usuń bieżący wiersz
  • D - usuń tekst od pozycji kursora do końca wiersza (jak d$)
  • d0 - usuń tekst od początku wiersza do pozycji kursora
  • dG - usuń tekst od pozycji kursora do końca dokumentu
  • dw - usuń następne słowo
  • db - usuń poprzednie słowo
  • yy - zaznacz bieżący wiersz do wstawienia (kopiowanie do bufora)
  • p - wstaw bufor poniżej (lub na prawo, zależnie od typu bufora) kursora
  • P - wstaw bufor powyżej (lub na lewo, zależnie od typu bufora) kursora
  • cx - zamiana (usunięcie i przejście do trybu dopisywania - x jest odpowiednikiem drugiego znaku polecenia d)
  • x - usunięcie znaku pod kursorem
  • X - usunięcie znaku na lewo od kursora
  • xp - zamiana miejscami dwóch kolejnych znaków (korekta czeskiego błędu) - kursor powinien być na pierwszym z nich (odpowiednik usunięcia x i wstawienia na prawo od kursora p)
  • u - cofnij ostatnio dokonaną zmianę w tekście (undo)
  • yx - zaznaczenie fragmentu tekstu (kopiowanie do bufora) - x jest odpowiednikiem drugiego znaku polecenia d (np. yw - kopiowanie do bufora następnego słowa, 3yl - kopiowanie trzech kolejnych znaków) (UWAGA: usuwanie tekstu przez d również kopiuje tekst do bufora)
  • "buforpolecenie - wstawia tekst (polecenie to któryś z wariantów y lub d) do bufora o nazwie bufor (nazwa powinna być jednym znakiem)
  • "buforp lub "buforP - wstawia zawartość bufora bufor za lub przed kursorem (ew. poniżej lub powyżej kursora)
  • . - ponów ostatnią czynność zmieniającą tekst (działa w bieżącym położeniu kursora)
  • x,yw plik - zapisz wiersze od x do y do pliku plik (x,y mogą być numerami wierszy, znakiem . oznaczającym bieżący wiersz lub kombinacją .+n oznaczającą bieżący i n kolejnych wierszy, np. .,.+2w plik zapisuje trzy kolejne wiersze, począwszy od bieżącego, do pliku plik)
  • ~ - zmiana wielkości liter (z małych na wielkie i odwrotnie) - działa na znak pod kursorem
  • fznak - przesuwa kursor w bieżącym wierszu do pierwszego wystąpienia znaku znak
UWAGA: większość poleceń można wykonywać wielokrotnie przez podanie liczby ponowień przed poleceniem, np. 3dw usunie 3 kolejne słowa, 2dd usunie 2 kolejne wiersze itp.

WYSZUKIWANIE I ZAMIANA:
  • /tekst - ustawia kursor na pierwszym wystąpieniu tekst (szuka w dół od kursora)
  • ?tekst - jak /tekst, lecz szuka w górę od kursora
  • n - ustawia kursor na kolejnym wystąpieniu tekstu szukanego przez /tekst lub ?tekst
  • :s/txt1/txt2 - zamienia pierwsze wystąpienie txt1 w bieżącym wierszu tekstem txt2
  • & - ponawia ostatnio wykonaną zamianę od bieżącej pozycji kursora
  • :s/txt1/txt2/g - zamienia wszystkie wystąpienia txt1 w bieżącym wierszu tekstem txt2
  • :%s/txt1/txt2/g - zamienia wszystkie wystąpienia txt1 w całym dokumencie tekstem txt2 (jeśli zamiast /g podamy /gc konieczne będzie potwierdzenie każdej zamiany)
  • :g/txt/polecenie - polecenie działające globalnie na wierszach zawierających txt, np. :g/^$/d - usuwa wszystkie puste wiersze z dokumentu
  • mznak - oznacza bieżący wiersz symbolem znak (pojedyncza litera) - można się do takiego oznaczenia odwołać w innych poleceniach przez 'znak, np. ma w wierszu, przejście 2 wiersze w dół, mb, po czym :'a,'bw plik - zapisze wiersze od oznaczonego przez a do oznaczonego przez b włącznie do pliku plik
INNE:
  • :map znak sekwencja - mapuje (przypisuje do znaku) sekwencję poleceń, co umożliwia posługiwanie się utworzonym skrótem
  • :ab skrót tekst - wpisanie skrót (w trybie dopisywania) rozwijane jest do tekst po wciśnięciu Esc bezpośrednio za wpisanym skrótem
  • :unab skrót - usuwa zapamiętany skrót (od tego momentu nie będzie on już rozwijany)
  • nieużywane znaki (bez przypisanych im poleceń): g, K, q, V, v
  • nieużywane symbole: _, *, \, =
  • :e plik - otwarcie nowego dokumentu
  • :e # - przejście do poprzedniego dokumentu
  • :e nazwa - przejście do dokumentu o podanej nazwie
  • :%nu - chwilowo pokazuje numery wierszy w dokumencie

 Edytor sed

Edytor sed (stream editor) nie jest edytorem interaktywnym. Działa on w trybie wsadowym, w którym domyślnie pobiera tekst ze standardowego wejścia, wykonuje zadane przekształcenia na wszystkich (lub niektórych) jego wierszach (po kolei), a przekształcony tekst wysyła na standardowe wyjście. Dlatego często wywoływany jest on w potoku, np.
$ cat plik1 | sed 's/abc/def/g' > plik2
lub z przekierowaniem wejścia i wyjścia, np.
$ sed 's/abc/def/g' < plik1 > plik2
W powyższym przypadku w każdym wierszu pochodzącym z plik1 łańcuch abc zostanie zastąpiony łańcuchem def, a wynik tego przekształcenia (zmieniony tekst) zostanie zapisany do plik2. Oczywiście możliwe jest (i dość często stosowane) łączenie wielu instancji sed w potoku, np.
$ cat plik1 | sed 's/abc/def/g' | sed 's/j$/k$/g' > plik2
(w tym przypadku oprócz zamiany abc na def dodatkowo każdy znak j zostanie zastąpiony znakiem k, o ile jest to ostatni znak w wierszu).
Polecenia edytora sed można umieszczać w plikach. Takie "programy" sed można uruchamiać przez (z dokładnością do przekierowań, które mogą nie być potrzebne w konkretnych przypadkach):
$ sed -f plik_programu < plik_we > plik_wy
Możliwe jest również wykonanie kilku kolejnych poleceń na każdym wierszu przetwarzanego tekstu:
$ sed -e 'pol1' -e 'pol2' ... < we > wy

OKREŚLANIE WIERSZY, KTÓRE BĘDĄ PRZETWARZANE:

  • numer wiersza
  • $ - ostatni wiersz
  • n1,n2 - wiersze od n1 do n2
  • /wyrażenie/ - wiersze pasujące do podanego wyrażenia regularnego
NAJCZĘŚCIEJ UŻYWANE POLECENIA:
  • [zakres]s/wyrażenie/zamiennik/flagi - zamienia wystąpienie(a) wyrażenia podanym zamiennikiem (ew. tylko w wierszach określonych przez zakres). Zakres zamiany w każdym wierszu zależy od flag. Brak flag oznacza zamianę tylko pierwszego wystąpienia. Flaga g oznacza zamianę wszystkich wystąpień. Podanie w miejsce flag liczby n powoduje zamianę n-tego wystąpienia. W zamienniku można użyć symbolu &, oznaczającego znaleziony tekst przeznaczony do zamiany. Przykładowo 's/[a-z]*/(&)/g' powoduje zamianę dowolnego ciągu liter na ten sam ciąg ujęty w nawiasy okrągłe.
  • d - usuń wybrane wiersze (wybór poprzez określenie numerów lub wyrażenia)
  • !d - usuń wszystkie wiersze oprócz wybranych
  • p - wypisuje wiersze z zakresu (jeśli sed nie był uruchomiony z opcją -n, to powoduje zduplikowanie wierszy z zakresu)
CZĘŚCIOWE WYRAŻENIA W ZAMIANIE.
Wyszukiwane wyrażenie można dzielić na części (numerowane od 1 do 9) przez stosowanie konstrukcji \(wyr1\)\(wyr2\).... Takie części mogą następnie zostać użyte w zamienniku jako \1 \2 itd. Przykładowo, polecenie 's/\([a-zA-Z]*\)\(.*\)/\1/' powoduje pozostawienie w każdym wierszu tylko pierwszego słowa.


 Zadanie 1

UWAGA: koniecznie wykonać na serwerze atos. Proszę wykonać następujące polecenia:
$ cd
$ echo "zzz" > plik.txt
$ ln ./plik.txt /tmp/plik.txt
$ ln -s ./plik.txt /tmp/plik.txt
$ rm /tmp/plik.txt
Wyjaśnić rezultat trzeciego i czwartego polecenia na podstawie man ln i mount. W raporcie umieścić wynik działania trzeciego polecenia i uzasadnienie wyniku działania trzeciego i czwartego polecenia.

 Zadanie 2

Sprawdzić czy można usunąć plik, do którego zostało wykonane dowiązanie symboliczne i (jeśli tak), co dzieje się np. przy próbie wyświetlenia zawartości takiego usuniętego pliku przy użyciu dowiązania symbolicznego. W raporcie podać polecenia (z parametrami) użyte w eksperymencie i wynik eksperymentu.

 Zadanie 3

W następującym programie w języku C (  pobierz  )
#include <stdio.h>

int main(int argc, char *argv) {
if (argc > 1) printf("%s\n", argv[1]);
return;
}
pojawiły się błędy. Po pierwsze, *argv powinno mieć postać **argv. Po drugie, zamiast return; powinno być return 0;
Popraw program w edytorze vi wykorzystując jak najmniejszą liczbę wciskanych klawiszy. W raporcie umieść kolejno wciskane klawisze lub ich kombinacje.

 Zadanie 4

W poprawionym programie z zadania 3 (  pobierz  ) chcemy wprowadzić następującą zmianę: wiersz 4 zastępujemy dwoma wierszami:
    if (argc > 2) printf("%s\n", argv[2]);
else if (argc > 1) printf("%s\n", argv[1]);
Wprowadź żądaną zmianę w edytorze vi wykorzystując jak najmniejszą liczbę wciskanych klawiszy. W raporcie umieść kolejno wciskane klawisze lub ich kombinacje.

 Zadanie 5

Skonstruuj polecenie wykorzystujące sed, które wykona czynność edycyjną żądaną w zadaniu 3. W raporcie podaj polecenie.

 Zadanie 6

Napisz w raporcie, co dokładnie robi polecenie
$ sed '/^g/s/g/s/g' < we > wy

 Zadanie 7

Podaj polecenie (w jak nakrótszej formie) wykorzystujące sed, które spowoduje wstawienie w miejsce każdego pustego wiersza ze standardowego wejścia dwóch pustych wierszy (niepuste wiersze mają zostać nietknięte) i wypisze wynik na standardowym wyjściu. W raporcie podaj znalezione polecenie.

 Zadanie 8

Niektóre języki programowania (np. C++ czy Delphi) dopuszczają tzw. komentarze wierszowe. Oznacza to, że tekst począwszy od // aż do końca wiersza traktowany jest jako komentarz. Podaj w raporcie polecenie sed usuwające takie komentarze z kodu źródłowego.

 Zadanie 9

Załóżmy, że w bieżącym katalogu znajduje się wiele plików zawierających obrazy w formacie JPG. Użytkownik był jednak niedbały i pliki mają różne rozszerzenia: jpg, jpeg, JPG, JPEG. Proszę skonstruować polecenie (ciąg poleceń) powłoki wykorzystujące sed, które ustawi wszystkim plikom rozszerzenie jpg pozostawiając nietknięte nazwy plików (części nazwy przed ostatnią kropką). W raporcie umieść skonstruowane polecenie.



Valid HTML 4.01!