Robert Fidytek
Transkrypt
Robert Fidytek
SYSTEMY OPERACYJNE Laboratorium_5 MENU 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 Linki Ostatnia aktualizacja: 2005-03-23 10:51:31 Pliki do zadań: lab5_pliki.zip. Zadania - awk (gawk). Napisać następujące programy w awk: 1. 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) 2. 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 3. 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 + 4. 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 + 5. Posortować i wypisać z pliku "/etc/passwd" loginy wszystkich użytkowników. awk 'BEGIN {FS=":"} {print $1} ' /etc/passwd |sort Lukasz Komar + 6. Wypisać z pliku "/etc/passwd" wszystkie linie dłuższe niż 80 znaków. awk 'length($0)>80 ' /etc/passwd Justyna Benkowska + 7. 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=":"} Piotr Kisieliczyn + $5 =="" {print $1}' /etc/passwd 8. 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 zad8awk puste_linie.txt Karol Wenta + 9. Przepisz z pliku wejściowego "liczby.txt" linie, które są liczbami rzeczywistymi. 10. 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 } ??? 11. 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 + 12. 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 + 13. 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 + 14. 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 + 15. Wypisać wszystkie wina wytrawne i półwytrawne. awk ' $(NF-2)=="wytrawne" || $(NF-2)=="półwytrawne" ' wina.txt Paweł Brzeski + 16. Wypisać gatunki win, dla których obrót był większy od 10 tysięcy. awk ' $(NF-1)*$NF > 10000 Justyna Benkowska ++ ' wina.txt 17. 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 + 18. 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 19. 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 ++ 20. 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 zad20awk /etc/passwd Karol Wenta + Zadania trudniejsze: 1. 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 +++ 2. 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 +++ 3. 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 4. 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" 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 } } ??? 5. Napisać dwa ciekawe programy (operujące na dwóch plikach i/lub wykonujące operacje administratorskie). Copyright © by Robert Fidytek.