Systemy Operacyjne - Lab.¶
Instruktor: dr hab. inż. Paweł T. Wojciechowski, prof. PP
Strona na e-kursach: https://ekursy.put.poznan.pl/course/view.php?id=37793
Konsultacje: przez e-mail
Celem tego kursu lab. jest wprowadzenie do systemu operacyjnego Unix, na przykładzie Linux, popularnej open source’owej wersji tego systemu. Materiał kursu obejmuje podstawowe polecenia języka Bash (“Bourne-Again SHell”), operujące na plikach, katalogach, i procesach. Wprowadzone zostaną też elementy programowania w języku Bash, oraz pliki w języku C.
Poniżej lista tematów i odnośniki do ćwiczeń. Przykładowe tematy miniprojektów są tutaj (mogą być też własne).
Data |
Temat zajęć |
Ćwiczenia |
---|---|---|
3.03 |
Zagadnienia organizacyjne. |
|
10.03 |
||
17.03 |
||
24.03 |
||
31.03 |
||
7.04 |
||
7.04 |
||
14.04 |
||
28.04 |
||
5.05 |
||
12.05 |
||
19.05 |
||
26.05 |
||
2.06 |
Odbiór projektów |
|
9.06 |
Kolokwium |
|
16.06 |
Przetestuj funkcje systemowe z rozdziału 2 |
Poniżej kilka przydatnych odnośników:
-
Krótki tutorial dla początkujących użytkowników Unixa (stary, ale wciąż dość aktualny).
-
Kompletny opis języka Bash.
Introduction to Bash scripting
Wstęp do programowania skryptów w języku Bash: “The guide is suitable for anyone working as a developer, system administrator, or a DevOps engineer and wants to learn the basics of Bash scripting.”
-
Podręcznik do openSUSE, tj. dystrybucji systemu operacyjnego Linux dostępnej w naszych laboratoriach. Przydatne rozdziały:
-
Wpisz linię poleceń w Bash, aby zobaczyć tekst pomocy, który pasuje do każdego argumentu.
-
Jeśli wciąż nie masz Unix-a na własnym komputerze..
Terminal i pomoc systemowa¶
- Tryby pracy
Ctr-Alt-F<i> przejście do trybu tekstowego (terminala)
Alt-F7 powrót do trybu graficznego
Alt-F<i> przełączanie terminali
logout
lubexit
lub Ctr-D wyjście z terminala- tab
uzupełnia litery polecenia Bash
- ↑, ↓
wybór wcześniejszych poleceń
- Składnia poleceń języka Bash
komenda OPCJE ARGUMENTY
, gdzie OPCJE i ARGMENTY mogą być opcjonalne. Opcje specyfikuje się używając myślnika, np.-a
lub--all
. Opcje można łączyć, np.-a -b -c
lub w skrócie-abc
- uname
wyświetla informacje o systemie, np.
undame -a
wyświetla wszystkie informacje- who
pokazuje kto jest zalogowany
who am i
wypisuje efektywny identyfikator użytkownika, który uruchomił komendę.- id
wyświetla rzeczywiste i efektywne identyfikatory użytkownika i grupy
- finger
user information lookup program
- man
- pomoc systemowa podzielona na sekcje, np.
man ls
wypisuje opis polecenials
w sekcji 1,man 3 sleep
wypisuje opissleep
w sekcji 3. Pliki wyświetlane są programemless
. Dostępne sekcje: - 1 - Programy wykonywalne lub polecenia powłoki2 - Wywołania systemowe (funkcje dostarczane przez jądro systemu)3 - Wywołania biblioteczne (funkcje w bibliotekach programów)4 - Pliki specjalne (które zazwyczaj można znaleźć w
/dev
)5 - Formaty plików i konwencje, np./etc/passwd
6 - Gry7 - Różnorodne (łącznie z pakietami makr i konwencjami)8 - Polecenia do administracji systemem (zazwyczaj tylko dla administratora)9 - Wywołania jądra [Niestandardowa]
man nr_sekcji intro
podaje więcej informacji o danej sekcjiman -t komenda
formatuje opis komendy w Postscript- pomoc systemowa podzielona na sekcje, np.
- info
alternatywna pomoc systemowa
- whatis
wyświetla jednolinijkowe opisy stron podręcznika systemowego
- whereis
znajduje pliki binarne, źródłowe i strony podręcznika dla danego polecenia
- apropos
przeszukuje nazwy i opisy stron podręcznika ekranowego
- echo
wyświetla wiersz tekstu
- more
filtrowa przeglądarka plików, np.
more plik
,more +/łańcuch plik
wyświetli plik od wiersza ze znalezionym łańcuchem- less
program podobny do
more
, ale mający o wiele więcej funkcji. Nawigowanie i wyszukiwanie:- nawigacja:
- j - w dół o linię, k - w górę o linię, f lub Space - okno niżej (forward), b - okno wyżej (backward), d - pół okna niżej (down), u - pół okna wyżej (up)g - idź do 1-ej linii (goto), G - idź do ostatniej linii, ng - idź do n-tej linii
- wyszukiwanie:
/wzór
- znajdź wystąpienie wyrażenia regularnego,?wzór
- j.w. do tyłu, n - powtórz ostatnie wyszukiwanie (next), N - j.w. do tyłu- inne:
- h - pomoc (help)q - wyjście z programu (quit)
Operacje na plikach i katalogach¶
Utwórz plik plik1 przy pomocy edytora emacs:
emacs plik1
Ctrl-x Ctrl-s zapisuje plik
Ctrl-x Ctrl-c wychodzi z edytora
Otwórz plik w edytorze:
emacs plik1
Wczytaj plik do edytora:
Ctrl-x Ctrl-f plik1
- man hier
wypisze opis systemowej hierarchii plików
W celu ustawienia polskiej wersji systemu należy zapisać do pliku .profile
:
LANG=pl_PL.UTF-8
export LANG
lub:
export LANG=pl_PL.UTF-8
lub w przypadku języka tcsh (nie omawianego na zajęciach):
setenv LANG pl_PL.UTF-8
- tree
wypisze zawartość katalogów w formacie drzewa, np.
tree /home/pawel
- -a
wypisuje także pliki ukryte (zaczynące się od
.
)- -d
wypisuje tylko katalogi
- ls
wypisuje zawartość katalogu, np.
ls katalog
,ls /
,ls -al
(wypisuje pełną zawartość katalogu bieżącego razem z atrybutami plików),ls ??
(wypisuje tylko dwuliterowe nazwy)- -a, --all
bez ukrywania plików zaczynających się od
.
- -l
używa długiego formatu wyjściowego (long), tj. wypisuje atrybuty plików: typ pliku (pierwszy znak), prawa dostępu, liczba dowiązań, właściciel (twórca) pliku, jego grupa, rozmiar pliku (w bajtach), oraz data ostatniej modyfikacji.
- Typy plikow:
-
- plik zwykłyd
- directory (directory)l
- dowiązanie (link)b
- plik specjalny, urządzenie blokowe (zob./dev
)c
- plik specjalny, urządzenie znakowe (zob./dev
)s
- gniazdo komunikacyjne (socket)p
- potok (pipe)
- -i, --inode
wyświetla numer i-węzła każdego pliku
- touch
Zmienia czas dostępu i modyfikacji każdego podanego pliku na czas bieżący. Jeśli podany plik nie istnieje, tworzony jest jako pusty (chyba że użyto opcji
-c
lub-h
).- pwd
wypisuje nazwę bieżącego katalogu roboczego
- cd
zmienia katalog roboczy; można podać ścieżkę bezwzględną, tj. zaczynającą się od
/
, np.cd /home/pawel
,cd ~
lub ścieżkę względną, np.cd katalog/
,cd ..
,cd ../lib
cd
bez argumentu powoduje przejście do katalogu domowego, tj. do katalogu w którym jesteśmy po zalogowaniucd .
powoduje pozostanie w katalogu bieżącym- mkdir
tworzy katalogi, np.
mkdir katalog
,mkdir -p a/b
- -p, --parents
tworzy brakujące katalogi nadrzędne
- rmdir
usuwa puste katalogi, np
rmdir katalog,
- -p, --parents
usuwa katalog i katalogi nadrzędne podanej ścieżki np.
rmdir -p a/b/c
działa podobnie dormdir a/b/c a/b a
- cp
kopiuje pliki i katalogi, np.
cp plik1 plik2 katalog
,cp -r katalog1 katalog2
- -r, -R, --recursive
kopiuje katalogi rekurencyjnie
- -i, --interactive
pyta przed nadpisywaniem
- -n, --no-clobber
nie nadpisuje istniejącego pliku
- rm
usuwa pliki lub katalogi, np.
rm -i plik
,rm -r katalog/*
- -r, -R, --recursive
rekurencyjnie usuwa katalogi i ich zawartość
- -i
pyta przed każdym usunięciem
- mv
przenosi pliki i katalogi lub zmienia ich nazwy, np.
mv f katalog
,mv nazwa katalog/nowa_nazwa
- -i, --interactive
pyta przed nadpisywaniem
- -n, --no-clobber
nie nadpisuje istniejącego pliku
- Wzorce w nazwach plików i katalogów, które można używać w każdym poleceniu bash:
- *
dowolny ciąg znaków, w tym pusty ciąg
- ?
dowolny jeden znak
- […]
dowolny jeden znak spośród wymienionych w nawiasach lub dowolne z zakresu, np.
[abc]
,[a-zA-Z]
(dowolna duża lub mała litera)- [^…]
dowolny znak spośród nie wymienionych w nawiasach, np.
[^xX]
[^0-9]
Przykłady:
.*
(pliki ukryte),a*
,a?b
,?[0-9].txt
,[aA]*.?
,[A-Z]*.jpg
,.[^.]*
(pliki ukryte bez.
i..
).Można też podać listę wzorców rozdzielonych
|
i poprzedzonych operatorem?
(zero lub jedno wystąpienie wzorca),*
(zero lub wiele wystąpień),+
(jedno lub więcej wystąpień),@
(jeden z podanych wzorców), lub!
(wszystko za wyjątkiem podanych wzorców), np.ls +(ab|fig)*+(.jpg|.gif)
wylistuje wszystkie pliki JPEG i GIF, których nazwa zaczyna się od “ab” lub “fig”. Jest to odpowiednik
ls ab*.jpg ab*.gif fig*.jpg fig*.gif
ls ab+(1|2).jpg
wypisze ab1.jpg, ab2.jpg, ab1111.jpg, ab222.jpg, itd.
ls !(*.jpg|*.gif)
wypisze wszystkie pliki, które nie są plikami JPEG i GIF. (Zauważ, że polecenie
ls *!(.jpg|.gif)
nie da tego efektu. Dlaczego?)ls !(+(ab|fig)*+(.jpg|.gif))
wypisze wszystkie pliki, które nie są plikami JPEG i GIF i zaczynają się od albo “ab” albo “fig”.
Znaki specjalne w nazwach poprzedzamy znakiem \
, np:
echo \*\?\|\<\>\\
Budowa systemu plików, dowiązania¶
1- budowa systemu plikow
struktura hierar systemu plikow
katalog = plik spec zawierajacy nazwy plikow + numery i-wezlow
i-wezel inode = struktura zaw. dane o pliku:
licznik dowiazan, prawa dostepu, data modyfikacji, atrybuty,
numery blokow dyskowych (duze pliki: posrednie bloki adresujace)
katal1/
(f1.txt --> i-wezel 145 (licznik dowiazan, rwx, numery blokow
--> blok dyskowy 90, --> blok 81, ..)
f2.ps --> i-wezel 78 (licznik dowiazan, r--, --> blok 27, --> blok 78, ..)
k/ --> i-wezel
)
liczba dowiazan dla katalogu ma to samo znacznenie co dla plikow
kazdy katalog (takze pusty) ma mininum dwa dowiazania: z "." i z katalogu macierzystego
2- dowiazania (links)
katal1 (f,ff) --> i-wezel
ln f freshf
ls -l
ls -i print file's inode (serial) number
katalogi, tak jak pliki, maja swoje i-wezly (zob. ls -i dla katalogu)
find . -inum 145
wady:
tylko w ramach jednego systemu plikow ("dysku")
tylko pliki zwykle (nie katalogi)
dowiazania symboliczne (pliki specjalne)
ln -s f freshf
jak w systemie plikow reprezentowane jest dowiazanie symboliczne?
ls -i pokazuje ze plik freshf -> f na swoj i-wezel
ale tzw. "fast links" nie maja swoich i-wezlow
lrwxrxrwrwx freshf -> f
powyzszy zapis "rwx" nie jest prawem dostepu:
chmod .. freshf zmieni prawa dostepu pliku f
e.g. /dev/cdrom -> hdc
/usr/bin
/bin nie jako katalog ale jako dowiazanie
file f typ pliku
find . -type l
find . -type d
Prawa dostępu, wyszukiwanie plików¶
1- prawa dostepu
wyjasnij r,w,x dla plikow/katalogow
katalog = plik specjalny
wyswietlenie kat wymaga x
ls -l: prawa dla user, group, others (rozlaczne zbiory)
chmod u g o a | + - = | r w x lista plikow
u+w,go-w f
-R rekurencyjnie
r 4, w 2, x 1
chmod 644 rw-r--r--
777-111 prog wykonywalne xxx - 022 maska = 644
umask
chown wlasciciel f zmienia ownership
chown -R wlasciciel k to samo rekursywnie
chown -R wojtek:users /home/wojtek
chgrp grupa f zmienia grupe
2- wyszukianie plikow
find katalog [kryteria] rekursywne (w katalogu i podkatalogach)
find /usr -name vi
find /usr -iname vi duze i male litery
find /usr -name ab\* 2> /dev/null lub 'ab*' lub "ab*"
-maxdepth 2 zaglebienie w drzewie <= 2
-links 2 pliki o dwoch dowiazaniach
-ls dodatkowe info o plikach
-wholename pliki pasujace do wzorca, np. './sr*sc'
typy plikow
find /usr -type d
find /usr -type d -name "man[0-9]" koniunkcja kryteriow
daty operacji
-mtime modification time (zmiana zawartosci pliku)
-atime access time (odczyt, zapis lub wykonanie)
-ctime change status (eg. change access rights)
find /usr/bin -type f -atime 10 accessed 10 days ago
find /usr/bin -type f -atime +10 accessed >10 days ago
find /usr/bin -type f -atime -10 accessed <10 days ago
-mmin -amin -cmin w minutach
find . -type f -newer file pliki zmodyfikowane pozniej niz file
rozmiar pliku
-size liczba blokow dyskowych (512 .. 4 KB lub wiecej)
find /usr -size +10k -size -20k pliki od 10 do 20 KB
c w bajtach (characters)
k w kilobajtach
+ - dolny i gorny zakres
wlasciciel pliku
-user -group
prawa dostepu do plikow
find ~ -type f -perm 444
find ~ -type f -perm ugo+r
find ~ -perm -444 co najmniej wszystkie bity
-perm -500 wybierze pliki z prawami u:
rwx = 7 tak (r 4, w 2, x 1)
r-x = 5 tak
rw- = 6 nie (nie ma x)
find ~ -perm /022 co najmniej jeden z bitow
starsza składnia:
find ~ -perm +022 co najmniej jeden z bitow
find ~ -perm 020 -o -perm 002 same as above
warunki zlozone
! negacja
-o lub
\( \) grupowanie
find /tmp -type f \( -size 0 -o -perm 0 -o -name "*~" \)
find ~ ! -perm 220
wykonywanie polecen (disclaimer: do at your risk!!)
find /usr/bin -name "*~" -exec rm {} \;
find /usr/bin ! -perm -001 -exec chmod o+x {} \; -print
zamiast -exec mozna napisac -ok (sprawdz jaka jest roznica)
-print wypisuje znalezione pliki na stdout (przydatne przy -exec)
Edytory tekstów vim i emacs¶
1- edytor vi dwa tryby vi - tryb komend (default) - tryb edycji (Esc zmiania tryb edycji na tryb komend) Podstawowe komendy: i,a,R zastap,Esc,:,$ koniec lini, G koniec tekstu w,e,b x,X usuwanie z tylu z przodu kursora dd u undo, Ctrl-r redo Tutorial interaktywny (wpisz jako polecenie w konsoli): vimtutor pl Krótki tutorial: http://www.cs.put.poznan.pl/akobusinska/downloads/vi.pdf 2- edytor tekstu emacs otworz plik test.tex poruszanie sie po tekscie C-f,C-b,C-n,C-p move jeden znak (Fig.) M-f, M-b move forward/backward word C-a, C-e move poczatek/koniec linii M-a, M-e move poczatek/koniec zdania <- -> z Meta move o jeden wyraz usuwanie, kopiowanie C-d,C-k usuwanie znaku, linii C-space mark text C-w cut, Esc-w copy, C-y paste C-x u lub Ctr-_ undo pamietana jest dluga historia! wyszukiwanie, zamiana C-s search, Ctr-r search backward Esc-% replace Esc-$ spell check pliki C-x C-f czytaj plik C-x C-s zapisz plik Esc C-x C-c wyjscie bufory, okna (C-x C-f test.log) C-x b change buffer C-x C-b all buffers Esc quit C-x 2, C-x 1, Esc, przelacznie myszka C-x o move to other window Alt~ lub F10 menu w emacs w trybie tekstowym Practical Emacs Tutorial: http://ergoemacs.org 3- system skladu tekstu LaTeX Utworz plik test.tex z ponizsza zawartoscia \documentclass{article} %\usepackage[OT4]{polski} % aby dzialalo kodowanie ogonkow, np. \k{e} \usepackage[T1]{fontenc} % wprowadzanie znakow ASCII powyzej 128 \usepackage[utf8x]{inputenc} % standard kodowania Latin2 (ISO8859-2) \usepackage[english,polish]{babel} % polskie przenoszenie slow, english default \begin{document} \title{Unix} \author{Imie Nazwisko} \date{} % bez tej komendy, system wypisze date \maketitle \section{Rozdzial} tekst \subsection{Podrozdzial} tekst \end{document} Skompiluj poleceniem który generuje plik PDF: pdflatex test Przykładowe programy do czytania plików PDF: acroread skim (dla Mac OS) Kompilacja do plików dvi z konwersją do Postscript: latex test ; dvips test -o Przykładowe programy do czytania plików dvi i Postscript: xdvi, gv Polecenie do kompilowania bibliografii (w formacie bib): bibtex Tutorial on-line z przykładami: https://www.overleaf.com/latex/learn/free-online-introduction-to-latex-part-1 Inne tutoriale do LaTeX-a dla początkujących, przykłady, etc. http://www-h.eng.cam.ac.uk/help/tpl/textprocessing/ Przykładowe style LaTeX-owe np. do raportu i pracy dyplomowej na PP: http://www.cs.put.poznan.pl/csobaniec/software/latex/dcsgroup-classes.html
Procesy¶
Proces w systemie Unix to działający program, razem z danymi programu i systemowymi, oraz zmiennymi środowiskowymi, strumieniami stdin, stdout, stderr, i deskryptorami otwartych plików, z których korzysta dany proces.
- ps
wypisuje status procesów
- -A, -e
wszystkie procesy
- -u USERS
procesy należące do wskazanych użytkowników, np.
ps -u pawel
- -f
pełny format atrybutów (UID, PID, PPID, C, STIME, TTY, TIME, CMD), gdzie komenda CMD jest wypisywana razem z argumentami
- -l
długa lista atrybutów (long)
- -x
also processes not connected to terms (daemons)
- -l
long
- -e
environment
- -u
user na poczatku ps -aux | grep ^pawel ps -u pawel Linux only
1- procesy
unix proces = kod binarny, dane programu, dane systemowe (PID, PPID,
srodowisko, przypisanie stdin/out/err, otwarte pliki)
ps
-a all users
-x also processes not connected to terms (daemons)
-l long
-e environment
-u user na poczatku ps -aux | grep ^pawel
ps -u pawel Linux only
STATUS procesu
S sleeping
R aktualnie running
PRI NI priorytety procesu
UID user id
WCHAN jaka funkcje systemowa jadra wywolal proces
pstree hierarchia procesow
init
proces potomny, macierzysty, "adopcja" przez init
top - users, proc, CPU, memory statistics, ps
ksysguard KDE
gtop GNOME
2- sygnaly, usuwanie proc
kill [-nazwa lub nr sygnalu] procid
kill procid wysyla sygnal TERM (Ctrl-C) do procesu o PID=procid, co
powoduje zakonczenie jego dzialania (termination)
kill %vi
killall vi
Numery sygnalow:
TERM = 2 terminate
KILL = 9 kill
HUP = 1 hung up
kill -KILL procid
kill -9 procid
zombie - proces zakonczony ale status jego wykonania nie zostal jeszcze
odczytany przez proces macierzysty (zombie jest oznaczony jako
<defunct>)
3- priorytety
PRI systemowa wartosc priorytetu (ustalana przez system)
NI nice (user defined) od -20 (wiekszy priorytet) do 19 (mniejszy)
renice +5 procid
nice -15 command uruchamia komende z podanym priorytetem
4- zarzadzanie procesami
command & wykonanie w tle
Ctr-Z wstrzymaj proces
jobs
+ proc domyslny
fg resume proc foreground
bg resume proc background &
fg %1
fg %vi
fg %?filename
kill %vi
5- status zakonczenia procesu
0 poprawne zakonczenie
<>0 error
echo $? stat last program
e.g. rm nonexistfile
&& koniunkcja
grep -q slowo plik && echo "znaleziono"
-q no line printed, status is the result
|| alternatywa
grep -q Koniec plik || echo "Koniec" >> plik
() grupowanie
Potoki i strumienie¶
1- przekierowanie i/o stdin =0 stdout =1 stderr =2 i/o procesu cat filter concatenate, C-D cat -n < f1 > f2 < not necessary, -n numbers line cat f* > f3 cat >> f cat << keyword input till keyword split -b 100k dane.zip dane. split file into dane.aa dane ab .. (each <100KB) cat a b c 2> err see content of files but error messages (file not found) to file err cat a b c > x 2> /dev/null cat a b c > abcErr 2>&1 (2>abcErr isn't correct) cat f1 - f2 > f "-" czytaj z stdin cat f1 /dev/stdin f2 > f same as above 2- potoki ls -l /usr/bin | more cat f | head -n 12 | tail -n 8 od 5 do 12 linii head -n 12 f | tail -n 8 same as above head -n 10 f | tail -n 1 | head -c 5 5 pierwszych znakow w 10 linii tail -f log find /usr -name "*.bin" | head -n 5 find /usr -name "*.bin" 2> /dev/null | head -n 5 find /usr -name "*.bin" 2>&1 | head -n 5 find /usr -name "*.bin" | tee f | tail -5 zapisz znalezione pliki do f, ostatnie 5 wypisz na stdout find /usr -name "*.bin" | tee -a f | tail -5 j.w., ale pliki są dopisane do pliku f 3- inne filtry sort f sort -n f numeric ls -l | sort -n +4 wg rozmiaru pliku: +4 wycina pierwsze 4 kolumny, oddzielone spacja lub tab sort -t: -n +2 /etc/passwd -t: zmienia sep kolumn na : -k5,5 5-ta kolumna (POSIX standard) sort -k2,2n -k5,5 sortuj według 2 kolumny numerycznie i 5-tej kolumny alfanumerycznie -f confuses small and big letters -r reverse sorting getent passwd wypisuje tylko uzytkownikow z passwd uniq f usuwa powtarzajace sie, sasiadujace linie sort f | uniq sort -u f same as above sort f | uniq -u unique lines in f sort f | uniq -d duplicate lines in f wc count -l lines, -w words, -c chars ls -l | grep ^- | wc -l count files bc filtr kalkulator cat f | tr ab AB translate a to A, b to B (tr wymaga np. cat) cat f | tr ab A translate a to A, b to A cat f | tr a-c '?' | tr -d '\t\n' delete znaki tab i nowej lini cat f | tr -s ' ' squeeze spacje do jednej cat f | tr -s '\t' ' ' squeeze spacje lub tab do jednej spacji (zob. inne znaki specjalne w man tr) cut select column, podajac numer (-f) lub przesuniecie w znakach (-c) lub bajtach (-b) wzgledem pocz linii; kolumny rozdzielone tab, lub 'znak' piszac -d znak (d=delimiter) cut -f1,3-5,7- f zakresy (np. od siodmej do konca) ls -l | tr -s ' ' | cut -f 5,9 -d ' ' nazwa i rozmiar pliku ls -l | tr -s ' ' '\t' | cut -f 5,9 nazwa i rozmiar pliku (ladniejszy wydruk) co robi ponizsza komenda? who | cut -f1 -d " " | sort | uniq | wc -l biezacy uzytkownicy
Przetwarzanie tekstów (grep)¶
- grep
wypisuje wiersze pasujące do wzorca, np.
grep słowo *.txt
wypisze wiersze w plikach z rozszerzeniemtxt
zawierającesłowo
, zaśgrep "[0-9]*" *.txt
wypisze linie zawierające cyfrę. Składnia:grep [OPCJE...] WZORCE [PLIK...]
grep [OPCJE] -f PLIK ... [PLIK...]
Uwaga: Czasami trzeba objąć wyrażenie regularne znakami cudzysłowu, np.
grep -E "(a) (b) 2 1" plik
.- Przykładowe opcje:
- -E, egrep
interpretuje WZORCE jako rozszerzone wyrażenia regularne (extended regexp)
- -F, fgrep
interpretuje WZORCE jako listę ciągów znaków, a nie wyrażeń regularnych (fixed string), np.
fgrep '+++' *.txt
- -f PLIK
pobiera wzorce z PLIKU, po jednym na wiersz (file)
- -i
ignoruje różnicę wielkości liter (ignore case)
- -v
wybiera wiersze niepasujące do wzorca (invert)
- -w
wybiera tylko te wiersze, w których dopasowane wzorce tworzą całe słowa (words)
- -c
wypisuje liczbę wierszy pasujących (z opcją
-v
niepasujących) do wzorca (count)- --color
koloruje pasujące łańcuchy znaków
- -l
wypisuje nazwy plików zamiast dopasowań
- -L
wypisuje nazwy tych plików, w których nie dopasowano wzorca
- -o
wypisuje tylko znalezione frazy
- -r
czyta katalogi rekurencyjnie, bez dowiązań symbolicznych (recursive)
- -R
czyta katalogi rekurencyjnie, w tym dowiązania symboliczne (recursive)
- -n
podaje numery znalezionych wierszy
- -<n>
wypisuje kontekst, tj. dodatkowo <n> linii przed i za znalezionym wierszem
- Wyrażenie regularne (wzorzec opisujący zbiór łańcuchów) budujemy używając operatorów:
.
- pasuje do każdego pojedynczego znaku[...]
- pasuje do każdego znaku na liście^
- początek wiersza$
- koniec wiersza<
i>
- początek i koniec słowa*
- poprzedzający element będzie dopasowany zero lub więcej razy- Wyrażenie rozszerzone (użyj
egrep
lubgrep -E
): +
- poprzedzający element powtórzony co najmniej raz (r+
=rr*
){n}
- poprzedzający element powtórzony n-krotnie{n,m}
- poprzedzający element powtórzony co najmniej n-krotnie, ale nie więcej niżm
razy{n,}
- poprzedzający element powtórzony co najmniej n-krotnie ({1,}
=+
){,m}
={0,m}
?
- poprzedzający element powtórzony co najwyżej jeden raz (?
={,1}
)|
- alternatywan
- n-ty poprzedzający element w nawiasach- Przykłady wyrażeń regularnych:
[abc]
a lub b lub c[a-zA-Z]
dowolna litera mała lub duża[^0-9]
dowolny znak oprócz cyfry^abc$
wiersz zawierający tylko abc[^^]
dowolny znak oprocz ^[-^]
myślnik lub ^\<[a-z]+\>
słowo małymi literamia*
łańcuch pusty lub wielokrotność a.*
dowolny ciąg znaków.*ok.*
dowolny wiersz zawierający ok (w tym samo ok)a+
co najmniej jedno a (to samo coaa*
)a{5}
aaaaa(wy)?nosi
wynosi lub nosi(Ala | Ola)
słowo Ala lub Olaa|bc(d|e)
a, bcd, bce\<[a-z]+\>
słowo małymi literami(\<[a-z]+\>).*\1
tekst z powtórzonym słowem (małe litery)(a) (b) \2 \1
pasuje do tekstu: a b b a(a (b)) \2
pasuje do tekstu: a b b- Sprawdź jaka jest różnica między:
grep --color "[^x]" f
grep --color -v x f
- Znaki specjalne:
.
,[
,]
,^
,$
,*
,\
jako znaki we wzorcach poprzedzamy backslashem, np.\.
t
- tabulator
Przykładowe polecenia:
ls -l | grep ^d
wypisze podkatalogi w bieżącym katalogu
grep -rl ^abc *
find . -type f -name "*.txt" -exec grep -l ^abc {} \;
find . -type f -name "*.txt" -exec grep -lq ^abc {} \; -exec rm -f {} \;
gdzie
- -q
nic nie pisz na
stdout
(qiet)- -f
usuń bez potwierdzenia
1- xargs
Jak wyswietlic atrybuty plikow, przy czym nazwy tych plikow zaczynaja sie
na 'a' i sa wymienione w pliku lista.txt ?
Jak usunac pliki o nazwie zaczynajacej sie na 'a', wymienione w pliku
lista.txt ?
Przykladowe rozwiazania:
grep ^a lista.txt | xargs -t ls -l option -t echoes executed command
ls -l a1 a2
grep ^a lista.txt | xargs -n 1 -t ls -l
ls -l a1
ls -l a2
(option -n specifies max number of args)
grep ^a lista.txt | xargs -t rm
Programowanie w Bash (I)¶
1- interpreter polecen - shell proc 1..n -> shell <-> user kernel -/ 2- zmienne srodowiskowe a=v echo $a a='v $b' b=v a="v $b" unset a remove var a set all env vars env all exported vars HOME katalog domowy dla user (synonim: ~) USER user PATH sciezka poszukiwan programow /bin /usr/bin /usr/X11R6/bin PS1 e.g. "\h:\w>" PS2 TERM LANG=pl_PL.ISO8859-2 jezyk_panstwo.kodowanie znakow e.g. Latin2 see also man locale 3- eksportowanie local vs. exported (przekazane proc potomnym) sh echo $b exit export b export a=v 4- aliasy, wykonanie ciągu poleceń alias s="ls -l" unalias type vi shows if vi is a program, alias, command, or function type echo x="sleep 2; ls -l" eval $x 5- pliki konfig sh 1. /etc/profile, 2. ~/.profile bash 1. /etc/profile, 2. ~/.bash_profile start pierwszego (login) shell'a (often contains: source .bashrc) 3. ~/.bash_login logowanie 4. ~/.profile 5. ~/.bash_logout wylogowanie ~/.bashrc start shell'a csh see /etc/csh.*, ~/.login, ~/.logout, ~/.cshrc source .profile 6- zarzadzanie procesami rm -rf /tmp/*; cp a /tmp sekwencja && || cp a /tmp && find /usr -name "p*" rownolegle (cd /; ls -l) { cd /; ls -l; } jaka roznica? () grupowanie, nowy shell {} grupowanie, ten same shell (y=1; echo $y); echo $y { y=1; echo $y; }; echo $y 7- skrypty s.sh ssh -l inf.. sirius.cs.put.poznan.pl sh s.sh sh -x s.sh debug chmod +x s.sh PATH=$PATH:. #! /bin/bash # komentarz dirname /bin/bash /bin basename /bin/bash bash basename ~/f.txt .txt f NAME=`basename $FILE .gz` note the use of `..` echo `expr 1 + 2` note space around + echo $((1+2)) bash $1..$9 zmienne pozycyjne $# liczba args shift this means the same as $i := $(i+1) for all i test eval expr stat last status (0 is true, non 0 is an error) if test $1 = v then echo $? last stat else .. fi if [ "$1" = v ] then echo $? last stat else .. fi testy lancuchow s = t s != t -z s string 0 znakow -n s string <>0 znakow testy liczb n -eq m n -ne m n -gt m n -lt m n -ge m n -le m testy plikow -e f file exists -f f zwykly file -d f katalog -L f sybolic link -r f user has read access -w f user has write access -x f user has execute access -s f files exists and size >0 inne testy war1 -a war2 and war1 -o war2 or ! war negacja war see man test
Programowanie w Bash (II)¶
1- powtorka
if [ $? -eq 0 ]
if [ $# -le 2 ] less or equal two args
if [ "$1" = "tekst" ] "$1" to avoid error if $1 not defined
if [ -f "$1" -a -r "$1" ] "$1" to avoid error if $1 not defined
zmienne specjalne
n arg
0 nazwa skryptu
# liczba args
@ lista args "$1" .. "$n"
* lista args "$1 .. $n"
? last stat
$ PID this shell
! PID last proc in backg
2- petle
for f in *.txt
do
mv $f $f.TXT
done
`seq 3 7`
while [ -n "$1" ]
do
echo "$1"
shift
done
true
false
while ! ping -c 1 sirius > /dev/null 2>&1
do
sleep 20
done
echo "siec OK" | mail ..
-c n stop after sending (and receiving) n ECHO_RESPONSE packetsstops after 1 send
break ends loop
continue przejscie do kolejnej iteracji
3- case
case $x in
v) .. ;;
v1|v2) .. ;;
esac
case $x in
[tT]*) .. ;;
*) .. ;;
esac
4- inne
read
while read l
do
echo $l
done < plik
cat plik | dwa procesy => l not seen outside loop
while read l
do
echo $l
done
grep .. | head .. |
while
5- functions
procesy ()
{
local x=1
ps -u $1
}
procesy user
unset procesy
6- lista args
lista.txt:
a1
a2
c2
grep ^a lista.txt | xargs -t chmod go-x -t echoes executed command (option)
chmod go-x a1 a2
grep ^a lista.txt | xargs -n 1 -t chmod go-x
chmod go-x a1
chmod go-x a2
(option -n specifies max number of args)
jak wprowadzic args w srodku ? see below
sh -c 'echo $2 $1' skrypt a b -c wykonanie komend podanych w linii
grep ^a lista.txt | xargs sh -c 'cp $* /tmp' skrypt
cp a1 a2 /tmp
Wybrane narzędzia, środowisko graficzne¶
1- archiwizacja i kompresja
tar cvf k.tar k/
gzip f
gunzip f
split f
df disk free
du disk used
2- komunikacja
write user
mesg y
mesg n
talk
wall
mail
alpine
imie.nazwisko@student.put.poznan.pl
lpr, lpq, lprm drukowanie
hostname -d
hostname -f
host sirius podaje adresy IP
ssh -l username sirius.cs.put.poznan.pl
ssh -l username sirius.cs.put.poznan.pl -Y enables trusted X11 forwarding
scp user@sirius.cs.put.poznan.pl:/home/user/file d/
scp file user@host:/home/user/
3- X Windows
xterm -display sirius:0 proces na lokalnym komp, polaczenie z serverem X na sirius (0 to nr monitora)
DISPLAY=hostname:0
export DISPLAY
xhost +name server access control program for X (name is username or hostname)
xhost -name
Note
This page is under development.
This document was generated on Apr 14, 2025.