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

Terminal i pomoc systemowa

1

17.03

Operacje na plikach i katalogach

2.1

24.03

Budowa systemu plików, dowiązania

2.4

31.03

Prawa dostępu, wyszukiwanie plików

2.2, 2.3

7.04

Edytory tekstów vim i emacs

3 (bez 3.3)

7.04

Procesy

4

14.04

Potoki i strumienie

5 (bez 5.3), 6.2, zadania (bez grep)

28.04

Przetwarzanie tekstów (grep)

5.3, zadania (z grep)

5.05

Przetwarzanie tekstów (grep)

10.2, zadania

12.05

Programowanie w Bash (I)

6 (bez 6.2), 7

19.05

Programowanie w Bash (II)

8

26.05

Wybrane narzędzia, środowisko graficzne

9

2.06

Odbiór projektów

9.06

Kolokwium

16.06

Dostęp do plików w języku C

Przetestuj funkcje systemowe z rozdziału 2

Poniżej kilka przydatnych odnośników:

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 lub exit 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 polecenia ls w sekcji 1, man 3 sleep wypisuje opis sleep w sekcji 3. Pliki wyświetlane są programem less. Dostępne sekcje:
1 - Programy wykonywalne lub polecenia powłoki
2 - 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 - Gry
7 - 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 sekcji
man -t komenda formatuje opis komendy w Postscript
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ły
d - 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 zalogowaniu

cd . 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 do rmdir 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 rozszerzeniem txt zawierające sł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 lub grep -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})
| - alternatywa
n - 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 literami
a* ł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 co aa*)
a{5} aaaaa
(wy)?nosi wynosi lub nosi
(Ala | Ola) słowo Ala lub Ola
a|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.