upr shell


Interpretery komend, skrypty, filtry
Witold Paluszyński
witold@ict.pwr.wroc.pl
http://sequoia.ict.pwr.wroc.pl/<"witold/
Copyright © 2001 2003 Witold PaluszyÅ„ski
All rights reserved.
Niniejszy dokument zawiera materia ly do wyk ladu na temat interpreterów
komend Unixa, programowania skryptów i wykorzystania typowych filtrów
Unixa: grep a, sed a, awk a, itp. Jest on udostepniony pod warunkiem
wykorzystania wy lacznie do w lasnych, prywatnych potrzeb i może być
kopiowany wy lacznie w ca lości, razem z niniejsza strona tytu lowa.
Praca z interpreterem poleceń
Potoki (pipeline): równoleg le uruchomienie poleceń z po laczeniem ich
wyjść i wejść
who
who | wc -l
who | tee save | wc -l
Listy: laczenie poleceń (ściślej: potoków) spójnikami:;, &, ||, &&.
cc prog.c ; echo kompilacja zakonczona
cc prog.c & echo kompilacja uruchomiona
grep pieniadze msg.txt && echo sa pieniadze
grep pieniadze msg.txt || echo nie ma pieniedzy
Priorytety spójników:| najwyższy,||,&& średni,;,& najniższy
date; who | wc
(date; who) | wc
Polecenie interpretera można wzia ć w nawiasy, co zmienia priorytety jego
interpretacji. Co wiecej jednak, powoduje to wykonanie polecenia w
wewnetrznym interpreterze, bedacym podprocesem procesu g lównego.
Interpretery komend i filtry 1
Praca z interpreterem poleceń (cd.)
Skierowanie wejścia/wyjścia:
>, >>, >&, <, <<=...=
Znaki powodujace dopasowanie do nazwy plików:
* ? [a-zA-Z_]
Dodatkowo C-shell:
{str1,str2,...} ~[user]
Interpretery komend i filtry 2
Tworzenie skryptów
Chcemy policzyć liczbe użytkowników w laczonych do systemu:
who | wc -l
Możemy utworzyć w lasna komende, która bedzie to robi la, umieszczajac
powyższa linie poleceń w pliku (np. count) i wywo lujac go np. komenda
sh count
cat > count
who | wc -l
^D
sh count
Możemy również nadać plikowi count atrybut x, i umieścić go w jednej z
kartotek na ścieżce PATH. Wtedy można pos lugiwać sie plikiem
zawierajacym polecenia, zwanym skryptem, jak programem binarnym:
chmod +x count
mv count ~witold/bin
rehash
count
Interpretery komend i filtry 3
Skrypty można wywo lywać z argumentami, do których dostep z wewnatrz
skryptu zapewniony jest przez mechanizm pozycyjny:
echo pierwszy argument: $1
echo drugi argument: $2
echo trzeci argument: $3
echo itd. ...
echo argument zerowy: $0 # nazwa skryptu
echo wektor argumentow: $* # bez arg. zerowego
echo liczba argumentow: $# # tylko Bourne shell
Interpretery komend i filtry 4
Zmienne
Istnieja dwa rodzaje zmiennych: zmienne lokalne interpretera komend, i
zmienne globalne, tzw. środowiskowe, dziedziczone przez podprocesy od
ich procesów macierzystych. Zatem zmienne globalne sa dostepne dla
programów uruchamianych przez interpreter komend, w tym również
rekurencyjnie uruchamianych interpreterów komend.
C-shell Bourne shell
set a = 5 a=5
echo a ma wartosc $a echo a ma wartosc $a
setenv ZMGL 20 export ZMGL
echo ZMGL ma wartosc $ZMGL ZMGL=20
# program ma dostep do ZMGL echo ZMGL ma wartosc $ZMGL
./program ... # program ma dostep do ZMGL
unsetenv ZMGL ./program ...
# tylko chwilowy eksport
ZMGL=20 ./program ...
Interpretery komend i filtry 5
Niektóre programy systemowe używaja zmiennych środowiskowych, które
zmieniaja sposób ich dzia lania:
PATH używany przez sam interpreter poleceń
TERM używany przez programy ekranowe, które chca skorzystać z
operacji terminala użytkownika innych niż zwyk le przesuwanie
MAIL ścieżka do pliku ze skrzynka pocztowa użytkownika
PAGER określenie programu, który należy wywo lać w celu
wyświetlania tekstu ekran po ekranie, np.man
EDITOR określenie programu, który należy wywo lać w celu edycji pliku
zainicjowanej przez niektóre programu, np.crontab
Interpretery komend i filtry 6
Znaki specjalne: cytowanie
\ odbiera znaczenie specjalne nastepujacego po nim znaku
 ... zaniechanie interpretacji wszelkich znaków specjalnych
"..." zaniechanie interpretacji znaków specjalnych z wyjatkiem $,
\(tylko w Bourne shellu), i ...
Ponadto, znak NEWLINE (\n, ASCII 10), traci znaczenie specjalne po\,
ale jest dopuszczalny wewnatrz napisów cytowanych tylko w Bourne shellu.
W teorii to wydaje sie proste, ale wyrażenia cytowane można sk ladać, i
czasem trzeba dobrze sie zastanowić, aby zanalizować, albo skonstruować
jakieś wyrażenie, i wtedy powyższe regu ly trzeba stosować bardzo uważnie.
echo " proste " # to jest proste
echo  \ # to tez
echo "\"" # poprawne w Bourne shellu ale nie w C-shellu
echo  \  # poprawne choc niekompletne w Bourne shellu,
# to samo znaczenie, ale niepoprawne w C-shellu
Interpretery komend i filtry 7
Bourne shell: algorytm dzia
lania
1. czyta jedna komende z wejścia
2. dokonuje interpretacji komendy, np. podstawień wartości zmiennych
3. traktujac pierwsze s lowo komendy jako jej nazwe (polecenie), a
pozosta le s lowa jako argumenty, wykonuje komende w jeden z
nastepujacych sposobów:
(a) jako funkcje lub wbudowana komende interpretera
(b) jako program zawarty w pliku dyskowym, jeśli polecenie ma postać
sk ladniowa nazwy pliku (wzglednej lub bezwzglednej), np.
/bin/echolub../prog/prog1
(c) jako program zawarty w pliku dyskowym, jeśli plik o podanej nazwie
znajduje sie w jednym z katalogów dyskowych zadanych zmienna
PATH
program zawarty w pliku dyskowym może być programem binarnym, lub
tzw. skryptem (zestawem komend)
Interpretery komend i filtry 8
Bourne shell: interpretacja komendy
algorytm interpretacji komendy jest dużo bardziej z lożony niż algorytm jej
wykonania:
1. podstawienia komend zagnieżdżonych ( ... )
2. podstawienia parametrów pozycyjnych (argumentów wywo lania
$1, $2) i zmiennych ($PATH, $var)
3. podzia l linii komendy na argumenty (które moga być puste, np.  )
4. zastosowanie skierowania strumieni wejścia i wyjścia
5. podstawienia nazw plików ze znakami specjalnymi*, ?, [...]
" apostrofy ( ... ) powoduja brak jakiejkolwiek interpretacji znaków w
nich zawartych, natomiast cudzys lowy ("...") powoduja jedynie
interpretacje zawartych w nich znaków $,\, i ...
Interpretery komend i filtry 9
Bourne shell: znaki specjalne
\ \z powoduje wziecie znaku  z dos lownie
# jeśli na poczatku s lowa to poczatek komentarza
" dopasowuje sie do dowolnego ciagu znaków w nazwach plików
? dopasowuje sie do pojedynczego znaku
[abc...] dopasowuje sie do pojedynczego znaku spośród podanych,
można rownież używać przedzia lów np. a-z
; sekwencyjne wykonanie komend
& równoleg le (asynchroniczne) wykonanie komend
(...) wykonanie ... w wewnetrznym interpreterze komend
 ... wykonanie komend w ..., otrzymane wyjście zastepuje  ...
 ... wziecie ... dos lownie
 ... wziecie ... dos lownie, jednak po interpretacji $,  ... , i\
zm=wart przypisanie wartości zmiennej
$zm wziecie wartości zmiennej
${zm} wziecie wartości zmiennej, unika dwuznaczności w po laczeniu
z innym tekstem
$1, ... parametry pozycyjne skryptu ($1 do $9), nazwa skryptu ($0)
Interpretery komend i filtry 10
Bourne shell: wyrażenia warunkowe
if test -r prog.dane
then
prog < prog.dane
else
prog
fi
if [ " tty " = "/dev/console" ] ; then echo Konsola ; fi
case $DISPLAY in
":0.0") host= uname -n :0.0;;
":0") host= uname -n :0.0;;
*) host=$DISPLAY;;
esac
Interpretery komend i filtry 11
Bourne shell: polecenia petli
for x in *.c
do
# cmp wyswietla na wyjsciu informacje o roznicach
if [ " cmp $x~ $x " ]
then
echo Plik $x zmienil sie, wysylamy koledze...
mailx -s "nowa wersja pliku $x" kolega < $x
fi
done
while true
do
/bin/echo -n "Podaj nazwe skryptu do wykonania: "
sh  line
done
Interpretery komend i filtry 12
Testowanie warunków
Warunki logiczne w instrukcjachifiwhiletestowane sa przez
sprawdzenie statusu (kodu zakończenia, ang. status, exit code) programów.
Statusem programu jest liczba ca lkowita zwracana przez proceduremain()
instrukcja return expr;lub funkcja biblioteczna exit(expr);. Status
można zwrócić ze skryptu wbudowanym poleceniemexitlubreturn.
Wartość statusu 0 oznacza prawde, a każda inna wartość fa lsz.
Wartość statusu jest normalnie niewidzialna przy interakcyjnym
wykonywaniu poleceń, ale jest przechwytywana przez interpreter poleceń, i
dla poleceń wykonywanych synchronicznie, bezpośrednio po wykonaniu
polecenia jest dostepna w zmiennej$?(w C-shellu$status).
Niektóre programy sa specjalnie przygotowane do sprawdzania warunków,
np. maja opcje powodujaca brak wyświetlania czegokolwiek na wyjściu, a
tylko zwracanie wyniku przez status (grep,cmp,mail, i inne).
Etatowym narzedziem do sprawdzania warunków jesttest, obs lugujacy

bogaty jezyk specyfikacji warunków.
Interpretery komend i filtry 13
Przyk lady:
test -r filespec # czy plik istnieje i jest dostepny do odczytu
test -d filespec # czy plik istnieje i jest katalogiem
test -z string # czy dany string ma dlugosc zero
test string # czy dany string jest pusty
test str1 = str2 # czy dane dwa stringi sa identyczne
test n1 -eq n2 # czy dwie liczby calkowite rowne
test 1.1 -eq 1 # daje 0 (prawda) - przez zaokraglenie
test 1+1 -eq 2 # daje 1 (falsz) - nie oblicza wyrazen
test n1 -ge n2 # czy n1 >= n2, analogicznie -gt -le -lt
Interpretery komend i filtry 14
Obliczenia arytmetyczne
oblicz=5
echo $oblicz --> 5
oblicz=$oblicz+1
echo $oblicz --> 5+1
expr 3 + 4 --> 7
expr 2 - 5 --> -3
expr 10 / 3 --> 3
expr 3 \* 8 --> 24
expr 3 + 4 \* 5 --> 23
expr 3+4 --> 3+4
oblicz=5
oblicz= expr $oblicz + 8
echo $oblicz --> 13
Interpretery komend i filtry 15
exprposiada jeszcze zestaw operatorów do porównywania stringów z
obs luga wyrażeń regularnych (patrzman expr), ale jego zdolności do
obliczeń arytmetycznych nie siegaja g leboko. Kiedy potrzebne sa obliczenia
zmiennoprzecinkowe, można/należy zastosować program kalkulatora
stosowegodc, używajacego odwrotnej notacji polskiej, a aby skorzystać z
kilku podstawowych funkcji matematycznych niezbedny jest programbc,
który jest preprocesoremdc.
oblicz= echo 4k 10 3 / p | dc
echo $oblicz --> 3.3333
oblicz= echo 4k 2 v p | dc
echo $oblicz --> 1.4142
oblicz= echo "l(2.73)" | bc -l -c | dc
echo $oblicz --> 1.00430160919686836451
oblicz= echo "s(3.14)" | bc -l -c | dc
echo $oblicz --> .00159265291648695253
Interpretery komend i filtry 16
Bourne shell: skierowanie here document
echo Creating /etc/resolv.conf ...
nameserver=$1
cat > /etc/resolv.conf << END-OF-RESOLV-CONF
domain stud.ii
search stud.ii prac.ii ii.uni.wroc.pl
nameserver $nameserver
END-OF-RESOLV-CONF
echo Done /etc/resolv.conf
echo Fixing /etc/hosts ...
ed /etc/hosts << \END-OF-EDIT-STRING
1,$s/stud.ii/ii.uni.wroc.pl/
1,$s/prac.ii/ii.uni.wroc.pl/
w
q
END-OF-EDIT-STRING
echo Done /etc/hosts
Interpretery komend i filtry 17
Bourne shell: przyk
lad  skanowanie argumentów
while [ $# -ge 1 ]
do
case $1 in
-a) AFLAG=1; shift
;;
-b) BFLAG=1; shift
;;
-o) OARG=$2; shift 2
;;
-*) echo usage: $0 [-a] [-b] [-o oarg] args ...
exit 1
;;
*) break
;;
esac
done
echo options: "-a=$AFLAG" "-b=$BFLAG" "-o=$OARG" "args=$*"
Interpretery komend i filtry 18
Bourne shell: przyk lanie danych poczta
lad  przesy
# tarmail: send encoded files by mail
if test $# -lt 3; then
echo "Usage: tarmail address \"subject\" directory-or-file(s)"
exit
else
address=$1
echo "address = $address"
shift
subject="$1"
echo "subject = $subject"
shift
echo files = $*
tar cvf - $* | compress | btoa | mail -s "$subject" $address
fi
Interpretery komend i filtry 19
Bourne shell: przyk
lad  samorozpakowujace archiwum
# bundle: pakujemy wiele plikow do skryptu
echo  # w celu rozpakowania przepusc przez /bin/sh
for i in $*
do
echo "echo tworzymy plik $i 1>&2"
echo "cat >$i << Koniec danych pliku $i "
cat $i
echo "Koniec danych pliku $i"
done
Interpretery komend i filtry 20
C-shell: przyk
lad  modyfikatory  :
lpipascal program.p #wywolanie kompilatora Pascala
ldpascal program.o #wywolanie linkera
#!/bin/csh -f
echo "lpipascal -longint -o $1:r.o $1"
lpipascal -longint -o $1:r.o $1
if ($status != 0) then
echo  Pascal compilation failed, linking not done\!\!
exit $status
endif
if ($1 == $1:r) then
echo "ldpascal -strip -o a.out $1:r.o"
ldpascal -strip -o a.out $1:r.o
exit 0
endif
echo "ldpascal -strip -o $1:r $1:r.o"
ldpascal -strip -o $1:r $1:r.o
modyfikatory wartości wyrażeń: :h :r :e :t :s/old/new/ :q :x
Interpretery komend i filtry 21
Unixowe interpretery komend  historia
" oryginalny interpreter komend: Bourne shell (/bin/sh)

" zmodyfikowany interpreter komend do pracy interakcyjnej: C-shell
(/bin/csh) zawiera wiele ulepszeń i zmieniona sk ladnie z lo
żonych
poleceń programowych
" ulepszone wersje Bourne shella: Korn shell (/bin/ksh), Born Again

Shell (/bin/bash), ten ostatni zawiera mechanizm historii i kontrole
podprocesów w stylu C-shella, zachowujac jednak sk ladnie poleceń
programowych Bourne shella, oraz dodajac ekranowa edycje komend
" ulepszona wersja C-shella (/bin/tcsh), zawiera edycje ekranowa
komend
obserwacja 1: wspó lcześnie używane interpretery komend (tcsh i bash)
różnia sie minimalnie, g lównie sk ladnia poleceń programowych
obserwacja 2: z punktu widzenia kompatybilności i przenośności istnieje
tylko jeden interpreter komend  oryginalny Bourne shell
Interpretery komend i filtry 22
Wyszukiwanie wzorców  grep
grep money *
cat * | grep money
grep -n Count *.[ch]
grep  ^From $MAIL | grep -v  From szef
grep -i kowalski spis.telef
ls -l | grep -v  .[cho]$
ls -l | grep  ^........w
grep  ^[^:]*:: /etc/passwd
cat dictionary | grep  ^..w.w..e.t$ # ekwiwalent
cat text | grep  \([-A-Za-z][-A-Za-z]*\) [ ]*\1 
egrep  socket|pipe|msgget|semget|shmget *.[ch]
pisanie znaków specjalnych grep a w shell u, co znacza poniższe wyrażenia?
grep \\ grep  \$
grep \\\\ grep  \ $
grep \$ grep "\$"
grep \\$ grep  "$
grep \\\$ grep "$"
Interpretery komend i filtry 23
Wyrażenia regularne grep i egrep
w kolejności malejacego priorytetu:
z dowolny znak niespecjalny pasuje do siebie samego
\z kasuje specjalne znaczenie znaku z
'"
poczatek linii
$ koniec linii
. dowolny pojedynczy znak
[abc...] dowolny znak spośród podanych, można podawać przedzia ly
znaków np. a-zA-Z
['"abc...] dowolny znak spoza podanych, również moga być przedzia ly
\n to do czego dopasowa lo sie n-te wyrażenie\(r\)(tylko grep)
r" zero lub wiecej powtórzeń wyrażenia r
r+ jedno lub wiecej powtórzeń wyrażenia r (tylko egrep)
r? zero lub jedno wystapienie wyrażenia r (tylko egrep)
r1r2 r1 i nastepujace po nim r2
r1|r2 r1 lub r2 (tylko egrep)
\(r\) zapamietane wyrażenie regularne r (tylko grep)
(r) wyrażenie regularne r (tylko egrep)
żadne wyrażenie regularne nie pasuje do znaku nowej linii
Interpretery komend i filtry 24
Edytor strumieniowy  sed
sed 10q # przepuszcza 10 pierwszych linii
sed  /wzorzec/q # wyswietla do linii z wzorcem
sed  /wzorzec/d # opuszcza linie z wzorcem (grep -v)
sed  /^$/d # opuszcza puste linie
sed -n  /wzorzec/p # wyswietla tylko linie z wz.(grep)
sed  s/^/^I/ # indentacja (taby na pocz.linii)
sed  /./s/^/^I/ # ulepszona indentacja
sed -n  /begin{verbatim}/,/end{verbatim}/p
sed -n  /^[ ^I]*$/,$s/^/ > /p | tail +2l
cat $* \
| sed -n -e  /^From: /s/^From: \([^<]*\).*/\1 wrote:/p \
-e  /^[ ]*$/,$s/^/ > /p \
| sed -e  1s/ wrote:/ wrote:/ -e  2s/^ > $//
Interpretery komend i filtry 25
sed: przyk (1)
lad
sierra-90> who
NAME LINE TIME IDLE PID COMMENTS
witold + vt04 Oct 21 04:46 2:45 238
witold + ttyp0 Oct 21 04:46 2:43 292
witold + ttyp1 Oct 21 04:46 . 291
witold + ttyp2 Oct 21 04:46 . 290
sierra-91> who | sed  s/ .* / /
NAME COMMENTS
witold
witold 292
witold 291
witold 290
sierra-92> who | sed  s/ .* [^ ]/ /
NAME OMMENTS
witold 38
witold 92
witold 91
witold 90
sierra-93> who | sed  s/ .* \([^ ]\)/ \1/
Interpretery komend i filtry 26
sed: przyk (2)
lad
s/s/>/\>/g
/^[ ]*$/i\


/^[ ]*%/s/^[ ]*%\(.*\)$//
s/\\\\/
/g
s#\\verb\(.\)\([^\1]*\)\1#\2#g
s#\\underline{\([^}]*\)}#\1#g
s/\\section{\([^}]*\)}/

\1<\/h1>/
s/\\subsection{\([^}]*\)}/

\1<\/h2>/
s#\\begin{enumerate}#
    #g
    s#\\begin{itemize}#
      #g
      s#\\begin{description}#
      #g
      s#\\end{enumerate}#
#g
s#\\end{itemize}##g
s#\\end{description}##g
s#\\item#
  • #g
    s#\\begin{verbatim}#
    #g
    s#.end{verbatim}#
    #g
    Interpretery komend i filtry 27
    sed: przyk (3)
    lad
    Poniższy przyk ladowy program sed a skraca powtórzenia pustych linii do
    pojedynczej linii wykorzystujac polecenie wczytywania kolejnych wierszy
    (N) i petle zrealizowana przez skok do etykiety (b):
    # pierwsza pusta linie jawnie wypuszczamy na wyjscie
    /^$/p
    :Empty
    # nastepnie dodajemy kolejne puste linie usuwajac znaki NEWLINE
    /^$/{ N;s/.//;b Empty
    }
    # mamy wczytana niepusta linie (jesli cokolwiek), wypuszczamy ja
    {p;d;}
    Program w pe lni kontroluje co jest wyświetlane na wyjściu i dzia la tak
    samo wywo lany z opcja -njak i bez niej.
    Interpretery komend i filtry 28
    sed: operatory
    a\ wyprowadz na wyjście kolejne linie do linii nie zakończonej\
    b etyk skok do etykiety
    c\ zmień linie na nastepujacy tekst, jak dla a
    d skasuj linie
    i\ wyprowadz nastepujace linie przed innym wyjściem
    l wyświetl linie, z wizualizacja znaków specjalnych
    p wyświetl linie
    q zakończ
    r plik wczytaj plik, wypuść na wyjście
    s/s1/s2/z zastap stary tekst s1 nowym s2; jeden raz gdy brak mody-
    fikatora z, wszystkie gdy z=g, wyświetlaj podstawienia gdy
    z=p, zapisz na pliku gdy z=w plik
    t etyk skok do etykiety, gdy w bieżacej linii dokonane podstawienie
    w plik zapisz linie na pliku
    y/s1/s2/ zamień każdy znak z s1 na odpowiedni znak z s2
    = wyświetl bieżacy numer linii
    !polec wykonaj polecenie seda polec gdy bieżaca linia nie wybrana
    : etyk etykieta dla poleceń b i t
    {...} grupowanie poleceń
    Interpretery komend i filtry 29
    Inne przydatne filtry Unixa
    # tr - zamiana znakow
    cat * | tr -cs "[A-Z][a-z]" "[\012*]" \
    | sort | uniq -c | sort -nr | head
    alias 8859-2-to-windows tr \
     \261\352\346\263\361\363\266\274\277 \
     \245\251\206\210\344\242\230\253\276
    # cut - wycinanie pionowych kolumn danych
    first= echo $1 | cut -c1
    cut -d: -f1,5 /etc/passwd
    Interpretery komend i filtry 30
    Uniwersalny filtr programowalny  awk
    # tylko warunki
    ls -l ~student | awk  $5 > 100000 
    # tylko akcje
    awk  {print $2,$1} nazwa_pliku
    cat /etc/passwd | awk -F:  { print $4, $3 }
    # warunki i akcje
    awk -F:  $7 ~ /bash$/ { printf "%-s: %-s",$1,$3 } /etc/passwd
    # uzycie zmiennych do zapamietania kontekstu miedzy wierszami
    awk  $1 != prev { print; prev = $1 } 
    # zmienne wbudowane awka
    awk  NF > 5 { print "linia ",NR," za dluga" } 
    # ustawianie wartosci poczatkowych zmiennych awka
    awk  BEGIN { var1=0 } { ... }  var1=-1
    Interpretery komend i filtry 31
    # uzywanie pol wejsciowych jak zmiennych
    awk  $1 < 0 { $1 = 0 } $1 > 100 { $1 = 100 } { print $0 } 
    awk  NF > 8 { print $(NF-2) } 
    # przekazywanie argumentu do skryptu
    awk  { s += $1 } END { print s }
    awk  { s += $ $1 } END { print s }
    # petle
    awk  BEGIN { x=1; y=1; for (i=1; i<=20; i++) \
    { print y;z=x; x=x+y; y=z} }  < /dev/nul
    # tablice asocjacyjne
    awk  { sum[$1] += $2 } \
    END { for (name in sum) print name, sum[name] }
    awk  { for (i=1; i<=NF; i++) freq[$i]++ } \
    END { for (word in freq) print word, freq[word] }
    Interpretery komend i filtry 32
    awk: przyk
    lad
    = hp5_q-636, uid 71, gid 0, size 48121, Mon Oct 27 09:10:42 CET 2003
    y /etc/lp/interfaces/hp5_q
    z hp5_q
    C 1
    D hp5_q
    F /var/spool/lp/tmp/rab/636-1
    O nobanner flist= (lpr_filter)
    P 20
    T 636-1
    t postscript
    U kreczmer@rab
    s 0x0010
    v 0
    = hp5_q-168, uid 71, gid 0, size 47960, Mon Oct 27 09:23:43 CET 2003
    z hp5_q
    C 1
    D hp5_q
    F /var/spool/lp/tmp/rab/168-1
    O nobanner flist= (lpr_filter)
    P 20
    T 168-1
    t simple
    U mw@rab
    s 0x0010
    v 0
    Interpretery komend i filtry 33
    Interpretery komend i filtry 34
    # Copyright 1993 Witold Paluszynski
    # All rights reserved.
    # NAME: lpsumrequests -- summarize lp print jobs by users
    # SYNOPSIS: lpsumrequests
    # DESCRIPTION: wybiera ze strumienia wejsciowego, ktory musi
    # miec format rejestru /usr/spool/lp/logs/requests,
    # informacje o wykonanych zadaniach drukowania i
    # wypuszcza zwiezly skrot, po 1 linijce
    awk 
    BEGIN { jobid = "" ; user = "unknown" ; filecount = 0}
    $1 == "U" { user = $2 }
    $1 == "F" { filecount++
    filenames[filecount] = $2 }
    $1 == "=" && jobid != "" ) {
    printf "%s %s %s",user,size,date
    for (i = 1 ; i <= filecount ; i++)
    printf " %s",filenames[i]
    printf "\n"
    }
    Interpretery komend i filtry 35
    $1 == "=" {
    filecount = 0
    user = "unknown"
    jobid = $2
    size = substr($8,1,length($8)-1)
    date = $9 " " $10 " " $11 " " $12 " " $13
    }
    END {
    if ( jobid != "" ) {
    printf "%s %s %s",user,size,date
    for (i = 1 ; i <= filecount ; i++)
    printf " %s",filenames[i]
    printf "\n"
    }
    } 
    Interpretery komend i filtry 36
    # Copyright 1993 Witold Paluszynski
    # All rights reserved.
    # NAME: lptotalsum -- total up print job sizes by users,years,months
    # SYNOPSIS: lptotalsum [year [month]]
    # DESCRIPTION: sumuje ilosc wydrukow wedlug uzytkownikow na
    # podstawie zestawienia wyprodukowanego przez script
    # lpsumrequests, przy czym jesli dane sa parametry $1 i $2
    # to tylko w danym roku i miesiacu
    awk  $7 ~ /^ $1 / && $4 ~ /^ $2 /  | awk 
    BEGIN { year = " $1 " ; month = " $2 "
    if (year == "") year = "ALL"
    if (month == "") month = "ALL"
    }
    { jobsizes[$1] += $2 ; jobcount[$1]++ }
    END {
    printf "Print job summary for year: %s, month: %s\n\n",year,month
    for (user in jobsizes)
    printf "User %s, print job count %s, total size %d\n", \
    user,jobcount[user],jobsizes[user]
    } 
    Interpretery komend i filtry 37
    awk: zmienne wbudowane
    FILENAME nazwa bieżacego pliku wejściowego
    FS znak podzia lu pól (domyślnie spacja i tab)
    NF liczba pól w bieżacym rekordzie
    NR numer kolejny bieżacego rekordu
    OFMT format wyświetlania liczb (domyślnie%g)
    OFS napis rozdzielajacy pola na wyjściu (domyślnie spacja)
    ORS napis rozdzielajacy rekordy na wyjściu (domyślnie linefeed)
    RS napis rozdzielajacy rekordy na wejściu (domyślnie linefeed)
    Interpretery komend i filtry 38
    awk: operatory
    w kolejności rosnacego priorytetu:
    = += -= *= /= %= operatory przypisania podobne jak w C
    || alternatywa logiczna typu short-circuit
    
    && koniunkcja logiczna typu short-circuit
    
    ! negacja wartości wyrażenia
    > >= < <= == != operatory porównania
    ~ !~ (nie)dopasowanie wyrażeń regularnych do napisów
    nic konkatenacja napisów
    + - plus, minus
    * / % mnożenie, dzielenie, reszta
    ++ -- inkrement, dekrement (prefix lub postfix)
    Interpretery komend i filtry 39
    awk: funkcje wbudowane
    cos(expr) kosinus, argument w radianach
    exp(expr) eexpr
    getline() czyta nastepna linie z wejścia
    index(s1,s2) pozycja napisu s2 w s1; zwraca 0 jeśli nie ma
    int(expr) cześć ca lkowita
    length(s) d lugość napisu znakowego
    log(expr) logarytm naturalny
    sin(expr) sinus, argument w radianach
    split(s,a,c) podziel napis s wzgledem c na cześci do tablicy a
    sprintf(fmt,...) formatowanie napisu
    substr(s,m,n) n-znakowy podciag s poczawszy od pozycji m
    Interpretery komend i filtry 40


    Wyszukiwarka

    Podobne podstrony:
    Ghost in the Shell 2 0 (2008) [720p,BluRay,x264,DTS ES] THORA
    Hide In Your Shell
    shell
    zakres przepisów upr
    shell
    upr kukurydzy
    Shell Chords
    Attenuation of Blast Overpressures from Liquid in an Elastic Shell
    help shell ru
    Secure Shell (SSH)
    ZarzÄ…dzanie wiedzÄ… Sphinx, Detreex, Neuronix, PC Shell
    shell help
    SpWU sprzeciw od wyr zaocz w post upr biznesforum
    function ncurses def shell mode
    o zas wyk upr przysł SP

    więcej podobnych podstron