Systemy Operacyjne - laboratorium 5 - teoria
Standardowe wejście i wyjście, przekierowania, potoki, filtry, wyszukiwanie
informacji
Celem laboratorium jest zapoznanie studentów z jednymi z fundamentalnych pojęć w systemie
UNIX, tj. z pojęciami: standardowego wejścia i standardowego wyjścia oraz z mechanizmami i
pojęciami z nimi związanymi: przekierowaniami, potokami, filtrowaniem informacji,
wyszukiwaniem informacji. Kończąc zajęcia, studenci powinni opanować praktycznie możliwości
jakie dają mechanizmy przekierowania i potoków oraz być w stanie wykorzystać odpowiednie
polecenia UNIX-a, do odfiltrowania określonych informacji, czy też wyszukania informacji
zadanych pewnym wzorcem.
Laboratorium obejmuje następujące tematy:
✔ pojęcie standardowego wejścia i wyjścia,
✔ mechanizm przekierowania,
✔ pojęcie potoku,
✔ deskryptory plików,
✔ filtrowanie informacji,
✔ wyszukiwanie informacji,
✔ dodatkowe polecenia informacyjne.
Standardowe wejście i standardowe wyjście
Dotychczas korzystaliście Państwo z różnych poleceń, które wyświetlały wynik swojego działania
(wyjście polecenia) na ekranie terminala. Wyjście polecenia może mieć bardzo różną formę i nie
chodzi tylko o to, że różne polecenia drukują różne wyniki, ale przede wszystkim o to, gdzie ten
wynik jest drukowany (wyświetlany).
Kiedy polecenie dostarcza wynik, który jest następnie drukowany (wyświetlany) w oknie terminala,
to takie działanie programu nazywamy drukowaniem wyniku na standardowym wyjściu (STDOUT
- ang. Standard Output). Z pojęciem standardowego wyjścia mogliście się już Państwo spotkać na
zajęciach z programowania w językach C i C++, tu jego znaczenie jest identyczne. Przy czym
większość poleceń drukujących jakiś wynik, drukuje go właśnie na standardowym wyjściu.
Niech za przykład posłuży znane już Państwu polecenie ls, które dostarcza wynik właśnie na
standardowe wyjście:
$ ls -l /bin/p*
-rwsr-xr-x 1 root root 32140 sty 2 2003 /bin/ping*
-r-xr-xr-x 1 root root 11724 mar 4 2003 /bin/procps3-kill*
1
-rwxr-xr-x 1 root root 9880 lut 17 2003 /bin/progress*
-r-xr-xr-x 1 root root 61708 mar 4 2003 /bin/ps*
-rwxr-xr-x 1 root root 10872 lut 13 2003 /bin/pwd*
Czasami podczas wywo ywania polece mo ecie si Pa stwo spotka z komunikatami ł ń ż ę ń ć o błędach:
$ cat /etc/shadow
cat: /etc/shadow: Permission denied
Na pierwszy rzut oka, taki wynik nie różni się niczym od wyniku wypisywanego normalnie na
standardowym wyjściu, podobnie jak on zostaje wyświetlony w oknie terminala. Trzeba jednak
wiedzieć, że nie jest on drukowany do STDOUT, tylko do specjalnego rodzaju wyjścia -
nazywanego standardowym wyjściem błędów (STDERR - ang. Standard Error),
zarezerwowanego dla komunikatów o błędach.
W dalszej części zobaczycie Państwo, że łatwo można oddzielić to co zostało zapisane na
STDOUT, od tego co wydrukowano na STDERR, mimo tego, że na ekranie terminala oba wyniki
mogą być ze sobą przemieszane.
Zilustrowano to poniżej (na jednym terminalu komunikaty o błędach i normalny wynik działania
polecenia):
$ cat /etc/issue /etc/shadow
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
cat: /etc/shadow: Permission denied
Skoro istnieje standardowe wyjście, to możemy również mówić o standardowym wejściu (STDIN -
ang. Standard Input), tj. miejscu skąd polecenia odczytują dane potrzebne im do działania.
Tradycyjnie rolę standardowe wejścia pełni klawiatura, stąd wpisując dowolny tekst, czy też
wywołując określone polecenie, korzystacie Państwo właśnie ze standardowego wejścia.
Wiele poleceń w systemie UNIX posiada tę ciekawą własność, że jeżeli nie wyszczególnimy (w
postaci nazwy odpowiedniego pliku) źródła danych dla polecenia, przyjmowane jest, że dane te
mają być odczytywane ze standardowego wejścia (czyli zazwyczaj z klawiatury - odczytywanie
trwa do momentu osiągnięcia końca pliku, co w przypadku klawiatury następuje po wciśnięciu
kombinacji klawiszy Ctrl+D).
Jako przykład takiego działania może posłużyć polecenie cat:
$ cat
To tylko przyklad tego,
jak mozna wykorzystac polecenie cat
do odczytywania danych ze standardowego wejscia
poprzez pominiecie nazwy pliku,
ktory ma byc wyswietlony.
Przekierowania standardowego wejścia i standardowego wyjścia
Czasami chcielibyście Państwo zachować wynik działania jakiegoś polecenia w pliku, po to by móc
go w jakiś sposób później analizować. Zadanie to można bardzo łatwo zrealizować wykorzystując
jedną z fundamentalnych właściwości systemu UNIX, tj. operacje przekierowania wyjścia.
W systemie UNIX, proces przechwytywania wyniku działania polecenia, w celu zapisania go w
2
jakim pliku nosi, jak ju ś ż powiedziano, nazwę przekierowania wyjścia. Polega on na zamianie
miejsca do którego komenda drukuje wynik swojego działania, zamiast standardowo na ekran, do
wskazanego pliku.
Do realizacji tego zadania wykorzystujemy dwa operatory “>” i “>>”. Pierwszy z nich pozwala
zapisać wynik działania we wskazanym pliku. Jeżeli plik o podanej nazwie nie istniał wcześniej
zostanie on utworzony (oczywiście pod warunkiem posiadania odpowiednich praw do tworzenia
nowych plików we wskazanym katalogu), jeżeli plik już istniał, jego zawartość zostanie usunięta i
zastąpiona nową (należy uważać, by nie doprowadzać do takich sytuacji!).
Składnię takiego przekierowania przedstawiono poniżej:
polecenie > plik
gdzie:
polecenie - polecenie, jakie chcemy wywołać, wraz z odpowiednimi parametrami,
plik - nazwa pliku do którego ma zostać zapisany wynik działania polecenia.
Ilustruje to przykład:
$ cd
$ ls /bin/p* > wynik_ls.txt
$ cat wynik_ls.txt
/bin/ping*
/bin/procps3-kill*
/bin/progress*
/bin/ps*
/bin/pwd*
Drugi z operatorów (“>>”), pozwala dopisywać wynik działania polecenia do wcześniej
otrzymanych wyników. W jego przypadku wynik jest dopisywany na końcu wskazanego pliku
(jeżeli plik nie istniał wcześniej zostanie utworzony - tak jak przy “>”).
Składnia przekierowania ma w tym wypadku postać:
polecenie >> plik
Poniżej przykład:
$ cat > plik1.txt
Pierwszy
$ cat > plik2.txt
Drugi
$ cat > plik3.txt
Trzeci
$ cat plik1.txt > plik4.txt
$ cat plik4.txt
Pierwszy
$ cat plik2.txt >> plik4.txt
$ cat plik4.txt
Pierwszy
Drugi
$ cat plik3.txt >> plik4.txt
$ cat plik4.txt
Pierwszy
Drugi
3
Trzeci
Czasami mo emy chcie zapisa wynik dzia ania kilku polece w jednym pliku. ż ć ć ł ń Możemy to zrobić
wykorzystując operator “>>”, możemy również posłużyć się inną postacią przekierowania, której
składnię przedstawiono poniżej:
lista_polecen operator_przekierowania plik
gdzie:
lista_polecen - jest to lista poleceń, które chcemy wykonać, zapisana w postaci “{ polecenie1;
polecenie2; ...; polecenieN; }”,
operator_przekierowania - jeden z wymienionych operatorów przekierowania (np. “>” i “>>”),
plik - nazwa pliku do którego ma zostać zapisany wynik.
Najlepiej zilustrować to na przykładzie:
$ w
13:01:39 up 1:51, 3 users, load average: 0,01, 0,04, 0,00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
student vc/1 11:13 1:48m 0.18s 0.01s /bin/sh /usr/X11R6/bin/startx
student pts/0 11:13 1:47m 0.00s 0.23s kdeinit: kwrited
student pts/1 11:13 0.00s 0.18s 0.02s w
$ who
student vc/1 Oct 21 11:13
student pts/0 Oct 21 11:13
student pts/1 Oct 21 11:13
$ whoami
student
$ who am i
student pts/1 Oct 21 11:13
$ { w; who; whoami; who am i; } > wynik.txt
$ cat wynik.txt
13:02:19 up 1:52, 3 users, load average: 0,00, 0,03, 0,00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
student vc/1 11:13 1:48m 0.18s 0.01s /bin/sh /usr/X11R6/bin/startx
student pts/0 11:13 1:48m 0.00s 0.23s kdeinit: kwrited
student pts/1 11:13 0.00s 0.17s 0.01s w
student vc/1 Oct 21 11:13
student pts/0 Oct 21 11:13
student pts/1 Oct 21 11:13
student
student pts/1 Oct 21 11:13
Jak widać wyniki wywołania poszczególnych poleceń zostały połączone w jedną całość i zapisane
do wskazanego do pliku.
Skoro można dokonywać przekierowania wyjścia, to jest jak sądzę oczywiste, że można również
przekierować standardowe wejście.
Składnia takiej operacji jest podobna jak w przypadku przekierowania wyjścia:
polecenie < plik
gdzie:
polecenie - nazwa polecenia, dla którego chcemy dokonać przekierowania standardowego wejścia,
4
plik - nazwa pliku, który ma pe ni rol standardowego ł ć ę wejścia.
Za przykład niech posłuży, przedstawione już wielokrotnie, polecenie cat. Domyślnie, jeżeli nie
określimy nazwy pliku do wyświetlenia, polecenie to stara się wyświetlić zawartość standardowego
wejścia (jak widać możemy to zmienić):
$ cat > plik1.txt
Pierwszy
$ cat plik1.txt
Pierwszy
$ cat < plik1.txt
Pierwszy
Istnieje jeszcze jedna, ciekawa możliwość przekierowywania standardowego wejścia, stosowana
głównie podczas pisania skryptów. Nosi ona angielską nazwę “here document”, z braku dobrego
polskiego odpowiednika możemy mówić o “zagnieżdżonym dokumencie”. Składnia dla takiej
operacji jest następująca:
polecenie << ogranicznik
dokument
ogranicznik
gdzie:
polecenie - polecenie, które chcemy wywołać,
ogranicznik - łańcuch tekstowy pełniący rolę ogranicznika dla tworzonego dokumentu, musi on być
pojedynczym słowem nie zawierającym spacji ani tabulacji,
dokument - treść dokumentu.
W tym wypadku przykład będzie mało praktyczny, jego celem jest jedynie pokazanie
wykorzystywanej składni i uzyskiwanych efektów:
$ cat << KONIEC_PLIKU
> To co teraz wpisuje stanie sie
> dokumentem, bedacym standardowym
> wejsciem dla polecenia cat. Jak
> widac w zwiazku z wpisywaniem tego
> dokumentu zmienil sie znak zachety.
> Koniec wpisywania nastapi po wpisaniu tekstu
> KONIEC_PLIKU
To co teraz wpisuje stanie sie
dokumentem, bedacym standardowym
wejsciem dla polecenia cat. Jak
widac w zwiazku z wpisywaniem tego
dokumentu zmienil sie znak zachety.
Koniec wpisywania nastapi po wpisaniu tekstu
Operator “<<” jest instrukcją, by odczytywać kolejne linie, dopóki nie pojawi się linia zawierająca
łańcuch tekstowy wskazany jako ogranicznik tekstu. W powyższym przykładzie widać wyraźnie, że
sam łańcuch ogranicznika nie staje się częścią tak utworzonego dokumentu. Pokazuje to wynik
wyświetlony przez cat (ta część tekstu w przykładzie, która nie została zapisana czcionką
wytłuszczoną).
Możemy łączyć w jednym poleceniu przekierowania wejścia i przekierowania wyjścia.
$ cat plik1.txt
5
Pierwszy
$ cat < plik1.txt > plik2.txt
$ cat plik2.txt
Pierwszy
Potoki
Jak ju wspomniano wiele (by nie powiedzie wi kszo ) polece w systemie ż ć ę ść ń UNIX, pozwala na
pracę ze standardowym wejściem (STDIN) i standardowym wyjściem (STDOUT). Dzięki temu
możemy łączyć ze sobą polecenia w taki sposób, że standardowe wyjście z jednego polecenia staje
się standardowym wejściem dla polecenia kolejnego. Taki mechanizm łączenia ze sobą poleceń nosi
nazwę potoku. Do jego realizacji jest wykorzystywany operator “|”.
Składnia dla tej operacji jest następująca:
polecenie1 | polecenie2 | ... | polecenieN
gdzie:
polecenie1, polecenie2, ..., polecenieN - są to polecenia, które pragniemy wykonać. Operator “|”
sprawia, że standardowe wyjście polecenia “polecenie1” staje się standardowym wejściem dla
polecenia “polecenie2” (itd. dla pozostałych poleceń). Każde z poleceń może być tak proste, czy tak
skomplikowane, jak to tylko potrzebne.
Mechanizm potoków, w połączeniu z operacją przekierowania, otwiera przed poleceniami UNIX-a
możliwości niedostępne dla poleceń w innych systemach operacyjnych. Dzięki niemu możemy ze
sobą łączyć różnorakie polecenia, w celu uzyskania określonego wyniku.
Poniższe przykłady pokazują jak można wykorzystywać choć część możliwości oferowanych przez
mechanizm potoków.
Przykład pierwszy pokazuje wykorzystanie poleceń: ls, head i tail. W taki sposób, że pierwsze z
nich wyświetla zawartość określonego katalogu (ls), kolejne (head) pozostawia z wyniku działania
ls tylko 4 pierwsze linie, występujące dalej (tail) wybiera z wyniku otrzymanego z head tylko 2
ostatnie linie. Uff... strasznie to długie:
$ ls -al /bin | head -n 4 | tail -n 2
drwxr-xr-x 19 root root 4096 paź 21 14:15 ../
-rwxr-xr-x 1 root root 2868 sty 28 2003 arch*
Przykład kolejny działa tak jak pierwszy, z tym, że dokładamy jeszcze do potoku polecenie wc, do
zliczenia liczby linii, słów i znaków na jego samym końcu:
$ ls -al /bin | head -n 4 | tail -n 2 | wc
2 18 122
Deskryptory plików
Kiedy w okienku terminala wywołujecie Państwo dowolne polecenie, powłoka UNIX-a otwiera i
powiązuje z tym poleceniem trzy pliki, z których każdy jest reprezentowany przez niewielką liczbę
całkowitą, nazywaną deskryptorem pliku. Deskryptor pliku (ang. file descriptor), jest to mechanizm
za pomocą którego możecie Państwo powiązać liczbę z nazwą pliku, by następnie móc
wykorzystywać tę liczbę do czytania lub pisania do pliku. Czasami deskryptor pliku bywa również
6
nazywany uchwytem pliku (ang. file handle).
Trzy pliki, standardowo powi zane z ka dym poleceniem (wraz z odpowiadaj ą ż ącymi im numerami),
wyszczególniono poniżej:
Standard Input (STDIN), 0,
Standard Output (STDOUT), 1,
Standard Error (STDERR), 2.
Występująca na końcu linii liczba całkowita jest deskryptorem każdego z plików. Domyślnie każdy
z tych plików jest powiązany z terminalem, ale jak już Państwo wiecie, nie ma przeszkód jeżeli
chodzi o jego przekierowanie.
Oprócz powyższych, trzech standardowych plików, istnieje każdorazowo możliwość powiązania z
danym poleceniem dodatkowych plików. Wykorzystujemy do tego celu polecenie exec.
Wykorzystanie deskryptorów plików jest wygodne, jeżeli wielokrotnie planujemy wykonywać
przekierowania do określonego pliku i nie mamy ochoty każdorazowo wpisywać jego pełnej nazwy.
By oszczędzić czas (i klawiaturę) możemy zamiast nazwy pliku wykorzystać jego deskryptor
(liczbę) - zysk z takiego działania jest ewidentny. Ma to zastosowanie szczególnie podczas
tworzenia skryptów powłoki, dlatego też do polecenia exec powrócimy podczas omawiania tego
zagadnienia.
Składnia wywołania polecenia exec jest następująca:
exec n> nazwa_pliku
exec n>> nazwa_pliku
exec n< nazwa_pliku
gdzie:
exec - nazwa polecenie,
n - liczba całkowita (deskryptor pliku),
nazwa_pliku - nazwa pliku, który pragniecie Państwo otworzyć i powiązać z danym deskryptorem.
W zależności od użytego operatora, otwieracie Państwo plik w trybie: “>” - do zapisu, “>>” - do
dopisywania, “<” - do odczyty.
Możecie Państwo również wykonywać ogólne przekierowanie wyjścia i wejścia, stosując
deskryptor pliku i operator przekierowania (i przynajmniej na razie będzie to najczęstsze z
podejmowanych przez Państwa działań).
Składnia dla tej operacji jest następująca:
polecenie n> nazwa_pliku
polecenie n>> nazwa_pliku
polecenie n< nazwa_pliku
gdzie:
polecenie - nazwa polecenia, które pragniecie Państwo wywołać (np. ls),
n - deskryptor pliku (liczba),
nazwa_pliku - nazwa pliku, który pragniecie Państwo otworzyć.
7
Pierwsze dwie pozycje z powy szej listy dokonuj przekierowania wyj cia z ż ą ś danego polecenia do
wskazanego pliku (odpowiednio w trybie do zapisu i do dopisywania). Forma trzecia służy do
przekierowania wejścia polecenia (wskazany plik zostanie otwarty w trybie do odczytu).
Dla przykładu możecie Państwo dokonywać przekierowania standardowego wyjścia, używając
poniższej składni:
polecenie 1> nazwa_pliku
polecenie 1>> nazwa_pliku
W tym przypadku 1, to po prostu deskryptor pliku powiązanego ze standardowym wyjściem.
Dla standardowego wyjścia błędów, inny jest tylko deskryptor pliku:
polecenie 2> nazwa_pliku
polecenie 2>> nazwa_pliku
W przypadku przekierowania standardowego wejścia, mamy:
polecenie 0< nazwa_pliku
Bardzo często zdarza się, że w ramach jednego polecenia pragniemy dokonać przekierowania
zarówno STDOUT, jak i STDERR.
W takim wypadku możemy wykorzystać poniższą składnię:
polecenie 1> nazwa_pliku_dla_STDOUT 2> nazwa_pliku_dla_STDERR
Zamiast operatora “>” można również stosować operator “>>”.
Korzystając z tej wiedzy możemy wreszcie udowodnić, że to co widzicie Państwo na ekranie jako
jeden wynik, jest w istocie połączeniem wyniku otrzymanego z STDOUT i STDERR.
Pokazywałem Państwu wcześniej, że polecenie, jak poniżej, dostarcza obu rodzajów wyników:
$ cat /etc/issue /etc/shadow
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
cat: /etc/shadow: Permission denied
Kolejny przykład pokazuje jak można rozdzielić wyniki z STDOUT i STDERR:
$ cat /etc/issue /etc/shadow 1> STDOUT.txt 2> STDERR.txt
$ cat STDOUT.txt
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
$ cat STDERR.txt
cat: /etc/shadow: Permission denied
Jak widać, w jednym pliku został zapisany normalny wynik działania polecenia (STDOUT),
natomiast w drugim pliku znalazły się informacje o błędach (STDERR).
Często deskryptor standardowego wyjścia jest pomijany, w takim wypadku składnia ulega
8
uproszczeniu (z tak uproszczon sk adnia ju si Pa stwo spotkali cie, ą ą ł ż ę ń ś na samym początku
omawiania operacji przekierowania, to uproszczenie działa zarówno dla standardowego wyjścia, jak
też dla standardowego wejścia, jedynie w przypadku STDERR nadal należy używać deskryptora):
polecenie > nazwa_pliku_dla_STDOUT 2> nazwa_pliku_dla_STDERR
Dla potwierdzenia, powyższy przykład z wykorzystaniem tej uproszczonej składni:
$ cat /etc/issue /etc/shadow > STDOUT.txt 2> STDERR.txt
$ cat STDOUT.txt
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
$ cat STDERR.txt
cat: /etc/shadow: Permission denied
We wszystkich systemach z rodziny UNIX, istnieje specjalny plik o nazwie “/dev/null”. W pewnych
sytuacjach pragnęlibyście Państwo, by niektóre wyniki działania poleceń były w jakiś sposób
usuwane, bo np. nie odczuwacie Państwo potrzeby ich oglądania. Realizując przekierowanie do
tego pliku uzyskujecie Państwo taki właśnie efekt. Wszystko co zostanie do niego zapisane zniknie
bezpowrotnie.
$ cat /etc/issue /etc/shadow
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
cat: /etc/shadow: Permission denied
$ cat /etc/issue /etc/shadow 2> /dev/null
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
W pewnych sytuacjach nie chcemy (lub nie potrzebujemy) oglądać komunikatów o błędach (wiemy,
że mogą się pojawić, ale nam to wcale nie przeszkadza - w tym konkretnym przypadku).
Przekierowując STDERR do “/dev/null” osiągamy taki efekt - jak w powyższym przykładzie.
Jeżeli spróbowalibyście Państwo wyświetlić przy pomocy polecenia cat zawartość pliku “/dev/null”,
to okaże się, że jest on zawsze pusty (niezależnie co do niego wcześniej zapiszemy):
$ cat /dev/null
$
Czasami możecie Państwo chcieć zapisać zarówno wynik pochodzący z STDOUT, jak też z
STDERR, w jednym i tym samym pliku. Można wtedy wykorzystać następującą składnię:
polecenie > nazwa_pliku 2>&1
lista_polecen > nazwa_pliku 2>&1
Zamiast “>” można użyć “>>”, jeżeli chcielibyśmy Państwo, by wyniki były dopisywane do
otrzymanych wcześniej:
polecenie >> nazwa_pliku 2>&1
lista_polecen >> nazwa_pliku 2>&1
Poniższy przykład pokazuje wykorzystanie tego mechanizmu:
$ cat p1.txt
Pierwszy
9
$ cat p2.txt
Drugi
$ ls
p1.txt p2.txt
$ { cat p1.txt > p4.txt 2>&1; cat p2.txt >> p4.txt 2>&1; cat p3.txt >> p4.txt
2>&1; }
$ cat p4.txt
Pierwszy
Drugi
cat: p3.txt: No such file or directory
Przyk ad pozwala te zorientowa si , jak mo na wykorzysta deskryptory ł ż ć ę ż ć plików (np. te
utworzone przy pomocy exec) i jaką rolę ma w tym wypadku operator “&”.
Ogólna składnia przekierowania z wykorzystaniem deskryptorów plików, jest następująca:
n>&m
gdzie:
n, m - deskryptory plików (liczby całkowite), jeżeli m jest znakiem “-”, plik, którego deskryptorem
jest n, zostanie zamknięty. Próba czytania, czy pisania do takiego pliku kończy się błędem.
“>” - operator przekierowania (równie dobrze może to być “<” lub “>>”).
Poniżej kilka “zabaw” z wykorzystaniem deskryptorów. Proszę spróbować odszyfrować, co się tak
naprawdę dzieje podczas kolejnych przekierowań i z jakim plikiem jest na koniec powiązane
standardowe wyjście.
$ exec 1> p2.txt
$ cat p1.txt
$ cat p1.txt 1>&2
Pierwszy
$ cat p1.txt
$ exec 1>&-
$ cat p1.txt
cat: standardowe wyjście: Bad file descriptor
$ exec 1<&2
$ cat p1.txt
Pierwszy
Inną sytuacją jest ta, kiedy chcielibyście Państwo zapisywać na standardowym wyjściu błędów,
również te komunikaty, które normalnie trafiają na standardowe wyjście.
Można to zrobić korzystając z następującej postaci przekierowania:
polecenie 1>&2
lista_polecen 1>&2
Dzięki temu na standardowym wyjściu nie pojawi się żaden wynik:
$ ls -l 2> STDERR.txt 1>&2
$ cat STDERR.txt
razem 12
-rw-r--r-- 1 student student 9 paź 24 16:15 p1.txt
-rw-r--r-- 1 student student 6 paź 24 16:15 p2.txt
-rw-r--r-- 1 student student 54 paź 24 17:20 p4.txt
-rw-r--r-- 1 student student 0 paź 24 17:32 STDERR.txt
10
Ale jak pokazuje przyk ad wynik jest generowany i rzeczywi cie trafia ł ś w całości na STDERR.
Polecenie można uprościć, pomijając deskryptor standardowego wyjścia:
$ ls -l 2> STDERR.txt >&2
$ cat STDERR.txt
razem 12
-rw-r--r-- 1 student student 9 paź 24 16:15 p1.txt
-rw-r--r-- 1 student student 6 paź 24 16:15 p2.txt
-rw-r--r-- 1 student student 54 paź 24 17:20 p4.txt
-rw-r--r-- 1 student student 0 paź 24 17:36 STDERR.txt
Jak widać mechanizm przekierowania wejścia i wyjścia, w połączeniu z potokami i deskryptorami
plików, daje do ręki doświadczonego użytkownika przepotężne narzędzie. Oczywiście sztuką (i to
czasami dużą) jest jego umiejętne wykorzystanie. Tak jak w przypadku innych narzędzi,
mistrzostwo w jego użytkowaniu bierze się z poznania go i doświadczenia w pracy z nim. Tym
samym to Państwo zadecydujecie, czy chcielibyście się nim posługiwać i w jaki sposób (ostatecznie
wielu ludzi umie pisać, co nie oznacza, że każdy z nich jest pisarzem - podobnie wiele osób miało
do czynienia z systemem UNIX, co nie oznacza, że znają ten system).
Filtrowanie tekstów
Bardzo często, podczas pracy w systemie UNIX, zdarza się, że interesuje nas jedynie część wyniku
jakiegoś polecenia. Stajemy w takim przypadku przed koniecznością odfiltrowania tego wyniku, w
taki sposób, by pozostawić tę jego część, która jest przedmiotem naszego zainteresowania. Znając
mechanizm potoków, możemy zrealizować to zadanie, stosunkowo prosto, wykorzystując
odpowiednie polecenia, stworzone z myślą o zadaniach filtrowania tekstów.
Pewną formą filtrowania, jest ograniczenie wyniku do określonej liczby linii (początkowych lub
końcowych). To zadanie nie powinno być dla Państwa żadnym problemem (wystarczy wykorzystać
znane już polecenie: head i tail). Co najwyżej warto wspomnieć o jednej nie wymienionej wcześniej
opcji polecenia tail “-f” (ang. follow).
Dzięki poleceniu postaci:
tail -f nazwa_pliku
będziecie Państwo mogli na bieżąco obserwować, co nowego zostało dopisane do wskazanego
pliku. Jest to szczególnie użyteczne podczas pracy z plikami log-ów.
Często stosowane jest np. takie wywołanie tail:
# tail -f /var/log/httpd/access_log
127.0.0.1 - - [24/Oct/2003:19:19:50 +0200] "GET / HTTP/1.1" 200 7035 "-"
"Mozilla/5.0 (compatible; Konqueror/3.1; Linux)"
...
Pozwala ono administratorowi serwera WWW śledzić na bieżąco kto i skąd próbuje się połączyć z
serwerem.
Polecenie grep
11
Polecenie grep umo liwia Pa stwu odnajdowanie, we wskazanych plikach, ż ń tych linii, które
zawierają określone słowo, czy zwrot. Nazwa programu sięga do początków systemu UNIX i
pochodzi od angielskich słów: globally regular expression print. W nazwie tej pojawia się
określenie “wyrażenie regularne” (ang. regular expression). Czym są i do czego służą wyrażenia
regularne, dowiecie się Państwo pod koniec semestru. W tym momencie jedynie o nich
wspominam.
Podstawowa składnia polecenia grep jest następująca:
grep slowo nazwa_pliku
gdzie:
grep - nazwa polecenia,
slowo - słowo, którego szukamy; polecenie grep wyświetli tylko te linie, z wskazanego pliku
wejściowego, które zawierają podane słowo,
nazwa_pliku - nazwa pliku wejściowego, tego, w którym będzie wyszukiwane określone słowo.
Poniżej prosty przykład (wyświetlanie tych linii z pliku “dlaczego_UNIX?.txt”, które zawierają
słowo “UNIX”):
$ cat dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Linux to system z rodziny unix-ow.
Zdaniem wielu laczenie w jednym zdaniu slow "Windows" i "bezpieczenstwo" jest
nieporozumieniem.
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
Jezeli jeszcze nie przekonaliscie sie Panstwo do unix-ow, to trudno :(
$ grep UNIX dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
W przypadku, gdy grep nie odnajdzie żadnej linii zawierającej określone słowo, po prostu nie
wyświetli żadnego wyniku. Można również prowadzić wyszukiwanie w kilku plikach jednocześnie.
Polecenie grep normalnie odnajduje tylko te linie, w których poszukiwane słowo występuje
dokładnie w tej postaci, w jakiej je określiliśmy (dokładnie, tzn. małe “a” i duże “A”, to dwie różne
litery). Czasami jednak chcielibyśmy odszukać te linie, które zawierają to słowo, niezależnie od
tego jakimi literami (dużymi czy małymi) jest ono zapisane. Wtedy z pomocą przychodzi nam opcja
“-i”.
Kolejny przykład pokazuje jej działanie:
$ cat dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Linux to system z rodziny unix-ow.
Zdaniem wielu laczenie w jednym zdaniu slow "Windows" i "bezpieczenstwo" jest
nieporozumieniem.
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
Jezeli jeszcze nie przekonaliscie sie Panstwo do unix-ow, to trudno :(
$ grep UNIX dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
$ grep -i UNIX dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Linux to system z rodziny unix-ow.
12
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
Jezeli jeszcze nie przekonaliscie sie Panstwo do unix-ow, to trudno :(
Je eli w wywo aniu polecenia grep nie podamy nazwy pliku wej ciowego, polecenie ż ł ś przyjmie, że
tym plikiem jest STDIN. Dzięki temu polecenie grep staje się szczególnie użyteczne podczas pracy
z potokami.
W przykładzie odfiltrowujemy wynik polecenia finger tak, by pozostała tylko linia, w której
znajdują się login i pełna nazwa wskazanego użytkownika:
$ finger student
Login: student Name: Student
Directory: /home/student Shell: /bin/bash
On since Fri Oct 24 20:23 (CEST) on vc/1 43 minutes 59 seconds idle
On since Fri Oct 24 20:23 (CEST) on pts/0 43 minutes 32 seconds idle
On since Fri Oct 24 20:23 (CEST) on pts/1 (messages off)
No mail.
No Plan.
$ finger student | grep Name
Login: student Name: Student
W większości wypadków, praca z grep-em polega na wyszukiwaniu linii zawierających określone
słowo. Czasami jednak interesowałyby nas, dla odmiany, te linie, w których wskazane słowo nie
występuje. Do realizacji takiego zadania możemy wykorzystać opcję “-v”.
Kolejny przykład pokazuje efekt jej działania:
$ cat dlaczego_UNIX?.txt
UNIX to stabilny i bezpieczny system operacyjny.
Linux to system z rodziny unix-ow.
Zdaniem wielu laczenie w jednym zdaniu slow "Windows" i "bezpieczenstwo" jest
nieporozumieniem.
Serwery WWW i serwery baz danych w wiekszosci korzystaja z UNIX-a.
Jezeli jeszcze nie przekonaliscie sie Panstwo do unix-ow, to trudno :(
$ grep -v -i UNIX dlaczego_UNIX?.txt
Zdaniem wielu laczenie w jednym zdaniu slow "Windows" i "bezpieczenstwo" jest
nieporozumieniem.
Podczas przeglądania pliku, w poszukiwaniu wskazanego słowa, polecenie grep numeruje
przeszukiwane linie. Dzięki temu, możecie Państwo zażyczyć sobie, by polecenie wyświetlało
numer każdej ze znalezionych linii. Do tego zadania wykorzystujemy opcję “-n”. Przy czym, po jej
użyciu, każda z linii wyniku ma następującą postać:
nazwa_pliku:numer_linii:linia
Nazwa pliku jest wyświetlana tylko wtedy, gdy polecenie grep przeszukuje kilka plików
jednocześnie.
Ilustruje to następny przykład:
$ cat plik1.txt
UNIX to stabilny i bezpieczny system operacyjny.
Historia systemu UNIX siega lat 60-tych dwodziestego wieku.
$ cat plik2.txt
Prawda jest, ze UNIX (z reguly) nie sluzy do gier.
Uzytkownicy Windows uzywaja programow antywirusowych.
Wirusy dla UNIX-a do prawdziwa zadkosc!
$ grep -n UNIX plik1.txt plik2.txt
13
plik1.txt:1:UNIX to stabilny i bezpieczny system operacyjny.
plik1.txt:2:Historia systemu UNIX siega lat 60-tych dwodziestego wieku.
plik2.txt:1:Prawda jest, ze UNIX (z reguly) nie sluzy do gier.
plik2.txt:3:Wirusy dla UNIX-a do prawdziwa zadkosc!
Czasami, chcieliby cie Pa stwo wiedzie , nie to w jakich liniach dane s owo ś ń ć ł występuje, a tylko w
jakich w ogóle plikach się ono pojawia.
Dla przykładu: poszukujemy wszystkich plików zawierających słowo UNIX, znajdujących się we
wskazanym katalogu. Dysponując dotychczasową wiedzą moglibyście Państwo wydać polecenie:
$ tree tmp
tmp
|-- plik1.txt
|-- plik2.txt
`-- plik3.txt
0 directories, 3 files
$ cat plik1.txt
UNIX to stabilny i bezpieczny system operacyjny.
Historia systemu UNIX siega lat 60-tych dwodziestego wieku.
$ cat plik2.txt
Prawda jest, ze UNIX z reguly nie sluzy do gier.
Uzytkownicy Windows uzywaja programow antywirusowych.
Wirusy dla UNIX-a do prawdziwa zadkosc!
$ cat plik3.txt
Windows RULEZ!
$ grep UNIX tmp/*
tmp/plik1.txt:UNIX to stabilny i bezpieczny system operacyjny.
tmp/plik1.txt:Historia systemu UNIX siega lat 60-tych dwodziestego wieku.
tmp/plik2.txt:Prawda jest, ze UNIX z reguly nie sluzy do gier.
tmp/plik2.txt:Wirusy dla UNIX-a do prawdziwa zadkosc!
Jednak wynik takiego polecenia, zawiera wiele zbędnych informacji. Pamiętajmy - potrzebujemy
tylko nazw plików. W takim przypadku przydatna bywa opcja “-l”.
Wynik jej użycia pokazano poniżej (dla tych samych danych wejściowych co powyżej):
$ grep -l UNIX tmp/*
tmp/plik1.txt
tmp/plik2.txt
Polecenie sort
Polecenie sort możemy wykorzystać (jak wskazuje jego nazwa) do posortowania danych
dostarczonych na jego wejście.
Sortowanie może zarówno dotyczyć łańcuchów tekstowych, jak też liczb. Może ono również
odbywać się zarówno w porządku rosnącym, jak też malejącym. Normalnie sortowanie odbywa się
tak, jakby dane miały postać łańcuchów tekstowych. Dodając opcję “-n” (ang. numeric),
wskazujemy, że chodzi nam o sortowanie liczb. Równocześnie domyślnie sortowanie odbywa się
od najmniejszego elementu do największego (w sensie przyjętego kryterium). Po zastosowaniu
opcji “-r” (ang. reverse) wymuszamy sortowanie w porządku odwrotnym.
Zastosowanie sort pokazują kolejne przykłady:
$ cat plik1.txt
14
Joanna
Jerzy
Adam
Katarzyna
Eugeniusz
Cezary
Klaudia
Bernadetta
Katarzyna
Maurycy
Tomasz
Aleksandra
1
15
25
26
101
13
$ sort plik1.txt
11
01
13
15
25
26
Adam
Aleksandra
Bernadetta
Cezary
Eugeniusz
Jerzy
Joanna
Katarzyna
Katarzyna
Klaudia
Maurycy
Tomasz
$ sort -r plik1.txt
Tomasz
Maurycy
Klaudia
Katarzyna
Katarzyna
Joanna
Jerzy
Eugeniusz
Cezary
Bernadetta
Aleksandra
Adam
26
25
15
13
101
1
$ sort -n plik1.txt
Adam
Aleksandra
Bernadetta
Cezary
Eugeniusz
Jerzy
Joanna
Katarzyna
Katarzyna
15
Klaudia
Maurycy
Tomasz
11
3
15
25
26
101
$ sort -n -r plik1.txt
101
26
25
15
13
1T
omasz
Maurycy
Klaudia
Katarzyna
Katarzyna
Joanna
Jerzy
Eugeniusz
Cezary
Bernadetta
Aleksandra
Adam
Normalnie polecenie sort okre la porz dek sortowania w oparciu o zawarto pierwszej ś ą ść kolumny (w
przykładzie była tylko jednak kolumna). Nie zawsze nam to odpowiada, czasami chcielibyśmy
sortować w nieco odmienny sposób, np. w oparciu o zawartość innej kolumny, sort daje nam taką
możliwość.
Słowo o kolumnach - kolumna to dowolny ciąg znaków nie zawierający znaków separatora
(domyślnie separatorami są tabulacje i spacje). Innymi słowy liczba kolumn w linii, to (w zasadzie)
liczba słów w linii. Kolejne kolumny mają kolejny numer początkowy. Pierwsza kolumna w linii
ma numer 1.
Aby dokonać sortowania w oparciu o zawartość innej kolumny niż pierwsza (domyślna), należy
wykorzystać opcję “-k” (ang. key). Polecenie sort tworzy klucz dla każdej z linii pliku wejściowego,
a następnie dokonuje ich (kluczy) uporządkowania w zależności od określonego kryterium.
Podstawowa składnia, dla takiego użycia sort, jest następująca:
sort -k kolumna_poczatkowa, kolumna_koncowa pliki
gdzie:
kolumna_poczatkowa - numer pierwszej z kolumn stanowiących klucz do sortowania,
kolumna_koncowa - numer ostatniej z kolumn wchodzących w skład klucza.
Jeżeli klucz jest oparty na jednej kolumnie, to składnia ulega uproszczeniu:
sort -k kolumna pliki
Wykorzystanie opcji “-k” pokazuje kolejny przykład:
16
$ cat ceny.txt
<NAZWA_PRODUKTU> <CENA> <ILOSC>
chleb 1.40PLN 100
jablka_1_kg 2.10PLN 90
banany_1_kg 2.70PLN 16
margaryna 3.80PLN 65
kawa_rozpuszczalna 8.90PLN 1
mleko_3.2% 1.80PLN 48
ser_bialy_kostka 4.00PLN 14
serek_topiony_opakowanie 1.50PLN 6
piwo_bezalkoholowe_;)_puszka 3.00PLN 499
$ grep PLN ceny.txt | sort -r -k 1,1
serek_topiony_opakowanie 1.50PLN 6
ser_bialy_kostka 4.00PLN 14
piwo_bezalkoholowe_;)_puszka 3.00PLN 499
mleko_3.2% 1.80PLN 48
margaryna 3.80PLN 65
kawa_rozpuszczalna 8.90PLN 1
jablka_1_kg 2.10PLN 90
chleb 1.40PLN 100
banany_1_kg 2.70PLN 16
$ grep PLN ceny.txt | sort -k 2
chleb 1.40PLN 100
serek_topiony_opakowanie 1.50PLN 6
mleko_3.2% 1.80PLN 48
jablka_1_kg 2.10PLN 90
banany_1_kg 2.70PLN 16
piwo_bezalkoholowe_;)_puszka 3.00PLN 499
margaryna 3.80PLN 65
ser_bialy_kostka 4.00PLN 14
kawa_rozpuszczalna 8.90PLN 1
$ grep PLN ceny.txt | sort -nr -k 3
piwo_bezalkoholowe_;)_puszka 3.00PLN 499
chleb 1.40PLN 100
jablka_1_kg 2.10PLN 90
margaryna 3.80PLN 65
mleko_3.2% 1.80PLN 48
banany_1_kg 2.70PLN 16
ser_bialy_kostka 4.00PLN 14
serek_topiony_opakowanie 1.50PLN 6
kawa_rozpuszczalna 8.90PLN 1
Je eli w pliku wej ciowym znalaz oby si wiele takich samych linii, ż ś ł ę moglibyśmy tak wywołać
polecenie sort, by w wyniku została wyświetlona tylko jedna z tych linii. Do tego celu służy opcja
“-u” (ang. unique).
$ cat plik1.txt
1
11
53
2$
sort plik1.txt
11
12
35
$ sort -u plik1.txt
1
17
2
3
5
Polecenie uniq
Polecenie uniq (ang. unique) usuwa powtarzaj ce si linie z posortowanego pliku ą ę (jak sort z opcją
“-u”). Możemy je wykorzystać do wyświetlania niepowtarzalnych linii z wskazanego pliku.
$ cat plik1.txt
1
11
53
2
$ uniq plik1.txt
15
32
Należy jednak pamiętać, że polecenie to usuwa powtarzające się linie tylko wtedy, gdy występują
one po sobie kolejno (plik jest posortowany), w przeciwnym wypadku efekt działania polecenia nie
jest zgodny z naszymi oczekiwaniami:
$ cat plik1.txt
1
53
21
41
$ uniq plik1.txt
1
5
3
2
1
4
1
Dodatkowe polecenia informacyjne
Na jednych z poprzednich zajęć zetknęliście się Państwo z podstawowymi poleceniami
informacyjnymi w systemie UNIX (Linux). W czasie zajęć dzisiejszych macie Państwo okazję
uzupełnić swoją wiedzę o dodatkowe polecenia służące do uzyskiwania informacji (mogą być one
również przydatne - przynajmniej od czasu do czasu). Część z tych poleceń mieliście już Państwo
okazję poznać, były one jednak używane wtedy do realizacji odmiennych zadań. Poniżej
przedstawiono takie ich wykorzystanie, które dostarcza określone informacje (np. o wersji systemu,
czy posiadanym procesorze).
Polecenie cal
Polecenie cal (ang. calendar) wyświetla prosty kalendarz. Bez podania żadnych dodatkowych
parametrów jest to kalendarz na dany miesiąc, z opcją “-y” wyświetla kalendarz na cały rok (inne
18
opcje prosz przetestowa ę ć samemu).
Poniższy przykład pokazuje sposób użycia i wynik działania polecenia cal:
$ cal
październik 2003
ni po wt śr cz pi so
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
$ cal -y
2003
styczeń luty marzec
ni po wt śr cz pi so ni po wt śr cz pi so ni po wt śr cz pi so
1 2 3 4 1 1
5 6 7 8 9 10 11 2 3 4 5 6 7 8 2 3 4 5 6 7 8
12 13 14 15 16 17 18 9 10 11 12 13 14 15 9 10 11 12 13 14 15
19 20 21 22 23 24 25 16 17 18 19 20 21 22 16 17 18 19 20 21 22
26 27 28 29 30 31 23 24 25 26 27 28 23 24 25 26 27 28 29
30 31
...
Zamieszczono tylko część przykładowego wyniku.
Polecenie cat - wyświetlanie informacji
Kolejne przykłady pokazują, jak można uzyskać konkretne informacje o komputerze przy którym
Państwo pracujecie, poprzez odczytanie zawartości odpowiednich plików tekstowych. Użycie w
przykładach polecenia cat jest jedynie pretekstem (równie dobrze moglibyście Państwo użyć np.
more czy less, albo wręcz programu mc). Ważne jest odczytanie odpowiednich plików, a nie to
czym je odczytamy.
W pliku “/etc/issue” jest zapisana (o ile nie zmienił tego administrator) informacja o posiadanej
przez Państwa dystrybucji Linux-a.
Kolejny przykład pokazuje jak możemy ją odczytać:
$ cat /etc/issue
Mandrake Linux release 9.1 (Bamboo) for i586
Kernel 2.4.21-0.13mdk on an i686 / \l
Plik “/proc/cpuinfo” zawiera informacje o procesorze (procesorach) znajdującym się w danym
komputerze:
$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 4
model name : AMD Athlon(tm) Processor
stepping : 2
cpu MHz : 1007.315
cache size : 256 KB
fdiv_bug : no
hlt_bug : no
19
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 1
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 mmx fxsr syscall mmxext 3dnowext 3dnow
bogomips : 2005.40
Kolejny plik - “/proc/filesystems” - dostarcza informacji o systemach plików wykorzystywanych
przez Państwa:
$ cat /proc/filesystems
nodev rootfs
nodev bdev
nodev proc
nodev sockfs
nodev tmpfs
nodev shm
nodev pipefs
ext2
nodev ramfs
nodev devfs
nodev nfs
nodev devpts
ext3
nodev usbdevfs
nodev usbfs
nodev supermount
vfat
udf
iso9660
Następny plik “/proc/interrupts” zawiera informacje o przerwaniach i przypisanych im
urządzeniach:
$ cat /proc/interrupts
CPU0
0: 380200 XT-PIC timer
...
Zamieszczono tylko część przykładowego wyniku.
Plik “/proc/pci” przechowuje informacje o urządzeniach podłączonych do magistrali PCI.
$ cat /proc/pci
PCI devices found:
Bus 0, device 0, function 0:
Host bridge: VIA Technologies, Inc. VT8363/8365 [KT133/KM133] (rev 3).
Master Capable. Latency=8.
Prefetchable 32 bit memory at 0xe6000000 [0xe7ffffff].
...
Zamieszczono tylko część przykładowego wyniku.
Ostatnim z listy, jest plik “/proc/version” - zawiera on szczegółowe informacje o posiadanej przez
Państwa wersji Linux-a:
$ cat /proc/version
20
Linux version 2.4.21-0.13mdk (flepied@bi.mandrakesoft.com) (gcc version 3.2.2
(Mandrake Linux 9.1 3.2.2-3mdk)) #1 Fri Mar 14 15:08:06 EST 2003
Oczywi cie jest jeszcze ca a masa plików przechowuj cych ró norakie informacje, ś ł ą ż w razie potrzeby
możecie Państwo je odszukać samodzielnie.
Polecenie date
Polecenie to dostarcza informacji o aktualnej dacie. Umożliwia również jej modyfikację, czy też
precyzyjne określenie w jaki sposób data ta ma być wyświetlana.
$ date
pon paź 20 20:18:35 CEST 2003
$ date +"%Y-%m-%d %H:%M:%S"
2003-10-20 20:18:13
Inne sposoby wywołania polecenia date (np. to jak przy jego pomocy zmienić datę) możecie
Państwo odnaleźć w odpowiednim podręczniku man. Jesteście Państwo już na tyle zaawansowani,
by czynić to samodzielnie, stąd nie podaję więcej przykładów.
Polecenie uname
Polecenie to może być wykorzystywane na różny sposób. Wywołane z opcją “-a” dostarcza
informacje o systemie i jądrze Linux-a.
$ uname -a
Linux localhost 2.4.21-0.13mdk #1 Fri Mar 14 15:08:06 EST 2003 i686 unknown
unknown GNU/Linux
Polecenia w, who i whoami
Z poleceniem who już się Państwo spotkaliście, pozostałe mają praktycznie identyczne działanie.
Najlepiej zobaczyć to na przykładzie:
$ w
20:03:39 up 1:16, 3 users, load average: 0,03, 0,05, 0,01
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
student vc/1 18:48 1:15m 0.09s 0.01s /bin/sh /usr/X11R6/bin/startx
student pts/0 18:48 1:14m 0.00s 0.25s kdeinit: kwrited
student pts/1 18:48 0.00s 0.11s 0.02s w
$ who
student vc/1 Oct 20 18:48
student pts/0 Oct 20 18:48
student pts/1 Oct 20 18:48
$ who am i
student pts/1 Oct 20 18:48
$ whoami
student