SYSTEMY OPERACYJNE
M E N U
Ogłoszenia Plan_laboratoriów Laboratorium_1 Laboratorium_2 Laboratorium_3 Laboratorium_4 Laboratorium_5 Laboratorium_6 Kol_1_fin_03_04 Kol_1_imn_03_04 Kol_konkurs1 Giełda_zadań Laboratorium_8 Laboratorium_9 Laboratorium_10 LinkiLaboratorium_5
Ostatnia aktualizacja: 2005-03-23 10:51:31Pliki do zadań: lab5_pliki.zip.
Zadania - awk (gawk).
Napisać następujące programy w awk:
Z pliku "/etc/passwd" wyświetlić nazwy tych użytkowników, którzy korzystają z interpretera tcsh.
awk 'BEGIN {FS=":"} /tcsh/ {print $1} ' /etc/passwd Paweł Brzeski ++ (pierwszy wykonał zadanie)
1.
Z pliku "/etc/passwd" wyliczyć sumę i średnią arytmetyczną wszystkich numerów UID.
awk 'BEGIN{FS=":"; s=0;} {s+=$3}
END{srednia=s/NR; print "srednia:", srednia", suma", s "." ;} ' /etc/passwd Justyna Benkowska
2.
Z pliku "/etc/passwd" wypisać dane użytkowników należących do grupy pracown (zobacz w /etc/group).
awk 'BEGIN {FS=":"} "/home/pracown/" {print $1} ' /etc/passwd Lukasz Komar +
3.
Z pliku "/etc/passwd" wypisać wszystkie wpisy o innych użytkownikach niż root, których UID jest równy 0, w przeciwnym przypadku wypisać test informujący, że takich użytkowników nie znaleziono.
zad4.awk
---BEGIN {FS=":"}
$1!="root" && $3=="0"{nie++;print $1}
END {if(nie==0) print"nie znaleziono uzytkownikow"} ---awk -f zad4.---awk /etc/passwd
Marcin Krzyżanowski +
4.
Posortować i wypisać z pliku "/etc/passwd" loginy wszystkich użytkowników.
awk 'BEGIN {FS=":"} {print $1} ' /etc/passwd |sort Lukasz Komar +
5.
Wypisać z pliku "/etc/passwd" wszystkie linie dłuższe niż 80 znaków.
awk 'length($0)>80 ' /etc/passwd Justyna Benkowska +
6.
Z pliku "/etc/passwd" wyświetlić nazwy tych użytkowników, którzy nie mają wypełnionego pola numer 5 (dodatkowe informacje o użytkowniku).
awk 'BEGIN {FS=":"} $5 =="" {print $1}' /etc/passwd Piotr Kisieliczyn +
7.
Przepisz plik wejściowy "puste_linie.txt" zastępując kolejne puste wiersze, jednym pustym wierszem.
zad8.awk
---NF == 0 {nb++}
NF > 0 {if (nb > 0) print " " ; nb =0; print $0;}
---awk -f zad8---awk puste_linie.txt
Karol Wenta +
Przepisz z pliku wejściowego "liczby.txt" linie, które są liczbami rzeczywistymi. 9.
Przepisz z pliku wejściowego "liczby.txt" liczby należące do określonego przedziału. Składnia: nazwa-skryptu początek-przedziału koniec-przedziału
#! /usr/bin/awk -f BEGIN { MIN = ARGV[1] MAX = ARGV[2] delete ARGV[1] delete ARGV[2] ARGV[1] = "liczby.txt" ARGC += 1 ARGIND = 0 print MIN, MAX }
/[0-9]+/ {
if ($0 >= MIN && $0 <= MAX) print $0
}
???
10.
Z pliku "telefony.txt" wypisać imiona i nazwiska wszystkich osób, których telefony zaczynają się od 058.
awk ' $NF ~ /^058/ {print $2" "$1} ' telefony.txt Paweł Brzeski +
11.
Z pliku "telefony.txt" wypisać imiona i nazwiska wszystkich Kowalskich, których telefony zaczynają się od 058.
awk '$1 ~"Kowalsk[ia]" && $3 ~/^058/ {print $1, $2}' telefony.txt Dagmara Zellma +
12.
Z pliku "telefony.txt" wypisać imiona i nazwiska osób, które nie nazywają się Kowalski lub Kowalska.
awk '!~ /Kowalsk[ia]/ {print $1" "$2}' telefony.txt Tomasz Wojtowicz +
13.
Wypisać wszystkie wina francuskie. (Każdy wiersz pliku "wina.txt" zawiera: nazwę wina, symbol kraju-producenta, kolor, smak, cenę w złotych oraz liczbę butelek sprzedanych w ostatnim miesiącu.)
awk '$(NF-4)=="Fra"' wina.txt Malgorzata Krzyzanowska +
14.
Wypisać wszystkie wina wytrawne i półwytrawne.
awk ' $(NF-2)=="wytrawne" || $(NF-2)=="półwytrawne" ' wina.txt Paweł Brzeski +
15.
Wypisać gatunki win, dla których obrót był większy od 10 tysięcy.
awk ' $(NF-1)*$NF > 10000 ' wina.txt Justyna Benkowska ++
16.
Wypisać wina francuskie, dla których obrót był większy od 10 tysięcy.
awk '$(NF-4)=="Fra" && $(NF-1) * $NF>10000' wina.txt Piotr Kisieliczyn +
17.
Obliczyć obrót dla win białych i czewonych oraz łączny obrót.
zad18.awk
{obrot = $NF * (NF-1); oo += obrot } $(NF-3) ~/białe/ {biale += obrot}
$(NF-3) ~ /czerwone/ {czerwone += obrot}
END {print "Obrót razem:", oo ",w tym : czerwone", białe:", białe".";} Malgorzata Krzyzanowska
18.
Wypisać wino, którego sprzedaż przyniosła największy obrót.
zad19.awk
#!/usr/bin/awk -f NR=1 {omax=$NF*$(NF-1)} {o=$NF*$(NF-1)
if(omax < o) {omax=o; f=$0} else {if(omax==o) {f=f"n"$0}}} END {print omax; print f} ---chmod 775 zad19.awk
./zad19.awk wina.txt Paweł Brzeski ++
Z pliku "/etc/passwd" wypisać wszystkie wiersze, które mają puste pola.
zad20.awk
---BEGIN {FS = ":"}
{for (i=1 ; i <= NF && $i=" "; i++) ;
if (i <= NF) {print} }
---awk -f zad20---awk /etc/passwd
Karol Wenta +
20.
Zadania trudniejsze:
Określić ilość piątków 13-tego w roku zadanym jako parametr (cal).
zad1t.awk
#!/usr/bin/awk -f
BEGIN { FS = " "}
($(6) == "13" || $(13) == "13" || $(20) == "13") {i++} END {printf "n%dn",i}
chmod 775 zad1t.awk cal 2005 |./zad1t.awk Piotr Jarosz +++
1.
Napisać program, do konwersji pliku tekstowego pomiędzy DOS'em a UNIX'em (gsub).
awk 'BEGIN {print$0} {gsub{"^M","n"}} {print$0}' zrodlo.txt > nowe.txt Magdalena Wiesner +++
2.
Wypisać w porządku leksykograficznym wszystkie słowa z pliku "wierszyk.txt" razem z ilością ich wystąpień.
#!/usr/bin/awk -f
BEGIN { FS="[- ,;.[]!?]"} {for(i=1; i<=NF; i++) {ls[$i]++}}
END { for(word in ls) {if(word)print word, ls[word] | "sort"}}
Paweł Brzeski ++
Uwaga: Jest rozróżnialna wielkość liter
3.
Dane są dwa pliki: "prostokat.txt" i "opis.txt". W jednym z nich znajduje się prostokąt zbudowany ze znaków x, zaś drugi zawiera liczby opisujący wymiary tego prostokąta. Napisać program
sprawdzający poprawność prostokąta (wymiary, boki, znaki składowe).
#! /usr/bin/awk -f BEGIN { getline < "opis.txt" HEIGHT=$1 WIDTH=$2 ARGV[1] = "prostokat.txt" 4.
ARGC += 1 h = 0 } /x+/ { w = length($1) h += 1 if (w != WIDTH) {
print "nie zgadza sie szerokosc " exit
} }
/[^x]+/ {
print "zakazane znaki" exit
}
END {
if (h != HEIGHT) {
print "nie zgadza sie wysokosc " exit
} }
???
Napisać dwa ciekawe programy (operujące na dwóch plikach i/lub wykonujące operacje administratorskie).
5.