Systemy operacyjne

Opis zajęć i zasad

Zajęcia 3

Komendy ogólnego przeznaczenia *

finger

finger wyświetla informacje na temat użytkownika:

finger
finger root
finger mw
finger witkowski

Jak widac dowiadujemy się, jakie są prawdziwe personalia użytkownika (In real life), nazwy jego kartoteki prywatnej (Directory), rodzaj shell'a (Shell), kiedy się zalogowal (On since), lub kiedy ostatnio byl w sieci (Last login), kiedy czytał ostatnią paczkę poczty.

who

who podaje informacje o zalogowanych użytkownikach:

who
who -a
who -l

passwd

Komenda passwd służy do zmiany hasła.

passwd

Jeśli chcemy sprawdzić pewne informacje o naszym koncie i haśle, używamy do tego opcji -S, dzięki której dostajemy informację składającą się z siedmiu pól, tj. login, czy hasło jest zablokowane (L), nie ma hasła (NP), lub czy jest użyteczne hasło (P), trzecia opcja to data ostatniej zmiany hasła. Kolejne cztery pola to: minimalny i maksymalny czas, czas ostrzeżenia o zbliżającej się konieczności zmiany hasła, oraz nieaktywny okres czasu hasła. Czas ten wyrażony jest w dniach. Minimalny oraz maksymalny czas oznaczają minimalna ilość czasu (w dniach), w którym nie można zmieniać hasła oraz maksymalny czas (wyrażony w dniach), w którym hasło jest ważne, po upływie tego czasu hasło będzie trzeba zmienić.

passwd -S

Metaznaki

Metaznaki służą do zastępowania znaków przy niektorych komendach:

* - zastępuje dowolny ciąg znaków (także pusty)

? - zastępuje dokładnie jeden dowolny znak

[] - zastępuje dokładnie jeden znak z podanego zakresu, np.: [abc]

[^] - znak ^ na początku oznacza dopełnienie zbioru, czyli dla przykładu [^abc], oznacza dowolny znak nie będący literą a, b i c.

Przykład:

ls [abc].txt
ls a*
ls a?txt
ls [^a].txt

Filtry

Najogólniej filtry to programy, których zadaniem jest odczyt danych ze standardowego wejścia, przetworzenie tych danych i zapis ich na standardowe wyjśćie. W zeszłym tygodniu poznaliśmy filtry cmp, diff, head i tail.

more

Wyświetlanie wyniki strona po stronie, przejście do następnego fragmentu następuje po naciśnięciu klawisza spacja.

ls -l | more
ls -l | more -5
ls -l | more -5 -p

Wyjście z trybu more następuje po wciśnięciu q.

sort

Polecenie sort układa wiersze pliku w określonym porządku zgodnie z wartościami pewnych pól zawartymi w każdym pliku. Pola takie nazywamy kluczami sortowania.

Jeżeli pola są rozdzielone znakiem innym niż znak tabulacji trzeba w takim wypadku użyć opcji -t i podać znak rozdzielający.

Ważna funkcja polecenia sort jest funkcja łączenia plików, jest to możliwe pod warunkiem, ze pliki które chce się połączyć są juz uprzednio posortowane. W przypadku łączenia plików używamy opcji -m.

ls | sort
ps -A | sort
ps -A | sort -n
ps -A | sort -n -r

Jeżeli chcemy posortować po odpowiedniej kolumnie, to musimy skorzystać z przełącznika -k.

ps -A | sort -k4 -r
ls -al | sort -r -n -k5

uniq

Jak wiemy posortowane wyniki mogą zawierać powielone wiersze danych, czyli ten sam wiersz może powtarzać sie n razy, za pomoca polecenia uniq można takie powielone wiersze usunąć.

printf "a\na\nb\nb\nc" > out.out
cat out.out
uniq out.out

wc

Za pomocą polecenia wc można zliczać liczbę bajtów, słów, znaków, linii w pliku.

Podstawowe użycie tego polecenia drukuje w następującej kolejności: liczbę wierszy, liczbę słów, liczbę bajtów i nazwę pliku:

wc out.out

Jeśli wpiszemy większą ilość plików, to każdy z osobna zostanie obsłużony, a na koniec zostanie wyświelona łączna liczba poszczególnych elementów. Jeśli nie wpiszemy nazwy pliku, to program będzie czytał dane ze standardowego wejścia, a po zakończeniu wpisywania (CTRL+D) informacje zostaną wyświetlone.

ls -l > a.txt
wc out.out a.txt

Istnieje możliwość wyświetlania wybranych elementów osobno. Jeśli chcemy wyświetlić tylko ilość bajtów, to używamy opcji -c, jeśli interesuje nas ilość znaków to opcja -m przychodzi z pomocą. Ilość wierszy sprawdzamy za pomocą -l. Długość najdłuższego wiersza uzyskamy za pomocą -L. Liczba słów to opcja -w.

wc -c a.txt
wc -m a.txt
wc -l a.txt
wc -L a.txt
wc -w a.txt
ls -l | wc

grep

grep (ang. globally look for a regular expression and print) przeszukuje wskazane pliki wejściowe (lub standardowe wejście jeśli nie podano żadnych lub podano nazwę pliku '-'), szukając linii zawierających coś pasującego do podanego wzorca. Domyślnie, grep wypisuje pasujące linie.

printf "test\ntest\nbalalbal\blatestbla" > plik.txt
grep test plik.txt #szuka słowa test w pliku plik.txt
grep tESt plik.txt #szuka słowa tESt w pliku plik.txt
grep -i tESt plik.txt #jak wyżej, niewarażliwość na wielkość liter
printf "test2\ntesty\nbal test albal\nblabla\n" > plik2.txt
grep test plik.txt plik2.txt #szuka słowa test w plikach plik.txt i plik2.txt
grep -v test plik2.txt #wyświetli te linie, które nie zawierają w sobie słowa test
cat plik.txt | grep 'test' #można też grepować wyjście polecenia
grep -w test plik2.txt #dopasowanie co do słowa tzn. znajdzie wyłącznie słowa test, a nie np. test123, atest
grep -c test plik.txt #zwróci liczbę wystąpień
grep -n test plik.txt #każda linia wyniku zostanie poprzedzona numerem linii
grep -o te plik.txt #wypisze tylko dopasowane elementy wzorca
grep -E t[a-z][a-z] plik.txt #korzysta z rozszerzonego wzorca do szukania
grep -r test /etc/ #przeszukiwanie rekursywne (wraz z podkatalogami)

Zauważ, że gdy chcamy poszukiwać ciągu kilku słów musimy je objąć w cudzysłów.

grep 'bal test' plik2.txt
grep bal test plik2.txt

Inne:

grep -A 1 root /etc/group #oprócz linii z szukaną frazą, wyświetli nam X wierszy występujących po niej
grep -B 1 root /etc/group #oprócz linii z szukaną frazą, wyświetli nam X wierszy występujących przed nią
grep -C 1 root /etc/group #oprócz linii z szukaną frazą, wyświetli nam X wierszy występujących przed i po niej

tr

Polecenie tr umożliwia zmianę znaków na inne, usuwanie nadmiernej ilości znaków (np. spacji, kropek, itp.).

cat plik2.txt | tr 'a-z' 'A-Z'
cat plik2.txt | tr -d 'tb' # usuwa podane znaki z wejścia
echo aaabbbaaattttteeee | tr -s 'ta' # usuwa powtórzenia i zostawia jeden znak
echo aaabbbaaattttteeee | tr 'ta' '*^'
echo abcdefghijklmnopqrstuvwqxyz | tr 'a-z' 'zyxwvutsrqponmlkjihgfedcba'
echo aaabbbaaattttteeee | tr [:alpha:] '*' #zobacz w man dostepne klasy

cut

cut wypisuje wybrane fragmenty linii z wejścia.

printf "one\t   two\t   three\t four\t  five\nalpha\t   beta\t  gamma\t delta\t epsilon\n" > data.txt
cut -f 3 data.txt #trzecie pole kazdej linii
cut -c 2 data.txt #drugi znak każdej linii
cut -f 3- data.txt #trzecie i dalsze pola kazdej linii
cut -c 3-12 data.txt #trzeci do dwunastego znak każdej linii
cut -f 1 -d ':' /etc/group #-d określa inny niż tabulacja podzielnik dla pól

Wyrażenia regularne

Wyrażenia regularne (regexp – od angielskiego „regular expressions”) to wzorce opisujące ciąg znaków. Są one podobne, ale różne od metaznaków.

[abc] pasuje do 'a' lub do 'b' lub do 'c'.

[^ds] pasuje do wszystkich znaków za wyjątkiem 'd' i 's'.

[0123456789] pasuje do dowolnej z cyfr.

[a-z] pasuje do wszystkich liter od a do z

[a-g] pasuje do wszystkich liter od a do g

. dowolny znak

^ pusty łańcuch na początku linii

$ pusty łańcuch na końcu linii

[A-Za-z] dowolna duża lub mała litera

\< pusty łańcuch na początku słowa

\> pusty łańcuch na końcu słowa

? element wcześniej może wystąpić co najwyżej raz

* element poprzedzający może wystąpić zero lub wiele razy

+ element poprzedzający może wystąpić jeden raz lub więcej

{n} element poprzedzający musi wystapić dokładnie n razy

{n,} element poprzedzający musi wystapić dokładnie n razy lub więcej

{n,m} element poprzedzający musi wystapić n razy lub więcej, ale nie więcej niż m.

Przykłady :

cat /etc/group | grep -E '^root'
cat /etc/group | grep -E 'root$'
ls -a | grep -E '[a-z][.]txt'
ls -a | grep -E '[p]{1}[a-z]*[.]txt'
ls -a | grep -E '[0-9]{1}[.]{1}[a-Z]*'

Zadania

  1. Wypisz identyfikatory grup z pliku /etc/group z o numerach między 100-199:

  2. Wypisz rozszerzenia plików w twoim katalogu domowym

  3. Polecenie last -n (gdzie n jest liczbą) wypisuje listę n użytkowników, którzy ostatnio logowali się w systemie. Sprawdzić, ile razy w ciągu ostatnich 500 logowań pojawił się w systemie wybrany użytkownik (może być Twój login), wypisać ich liczbę.

  4. Wyświetl listę wszystkich plików z bieżącego katalogu w jednej linii

  5. Napisać polecenie zliczające sumę znaków z pierwszych pięciu linii danego pliku

  6. Wypisz wszystkie katalogi w biezącym katalogu.

  7. Wypisz do ilu elementów katalogu /etc inni użytkownicy (other) mają prawo odczytu?

  8. Wyświetl listę uprawnień (i tylko uprawnień) do elementów katalogu /etc.

  9. Wyświetl statystykę częstości występowania poszczególnych uprawnień dla członków grup do elementów w katalogu /etc.

*

Wykorzystano materiały z:

http://www.cs.put.poznan.pl/csobaniec/edu/sop/doc/sop1.pdf

https://bap.faculty.wmi.amu.edu.pl/index.php/dydaktyka/dsop/

http://mediologia.pl/filtry-w-linuksie/4-2-panorama-filtrow-linux

http://www.arturpyszczuk.pl/commands-wc.html

http://czytelnia.ubuntu.pl/index.php/2010/02/18/konsola_nie_gryzie_czesc1/

http://math.uni.lodz.pl/~wardd/dydaktyka/pwsz/so/grep_find_cw.pdf

http://www.computerhope.com/unix/ucut.htm