Seminár k operačným systémom: Cvičenie 7 [Bash III.]

Cvičenie 3

Oboznámte sa so shellcheck.net

Ktorí používatelia majú nastavenú GECOS položku?

cut -f1,5 -d: /etc/passwd | grep -v ":$" | grep -v ":,,,"

Alternatívne

cut -f1,5 -d: /etc/passwd | grep -vE ":$|:,,,"
  • Cez -E zapneme podporu rozšírených regulárnych výrazov (ERE, extended regexps), kam patrí operátor |.
  • Podrobnosti o GECOS na Wikipedii.

Vypíšte esteticky informácie o používateľovi

USER=${1:-$(id -un)}

grep $USER /etc/passwd | cut -d':' -f3,4,5,6,7 |
while IFS=: read -r U_UID U_GID U_GECOS U_HOMEDIR U_SHELL
do
        echo $USER
        echo "--------------------"
        echo "UID:" ${U_UID}
        echo "GID:" ${U_GID}
        echo ${U_GECOS} |
                while IFS=, read -r U_FULLNAME U_ROOM U_PHONE U_OTHER
                do
                        echo "Full Name:" ${U_FULLNAME:-N/A}
                        echo "Room:" ${U_ROOM:-N/A}
                        echo "Office Phone No:" ${U_PHONE:-N/A}
                        echo "Other:" ${U_OTHER:-N/A}
                done

        echo "Home directory:" ${U_HOMEDIR}
        echo "Shell:" ${U_SHELL}
done
  • využili sme kombináciu while/read
  • dokonca dvakrát: vo vnútornom cykle sekáme podľa čiarky
  • while/read beží vždy v nezávislom subshelli, a teda obsahy premenných sa neovplyvňujú
  • predefinujeme IFS

    • input field separator: oddeľovač medzi slovami/políčkami pri rozdeľovaní riadku so vstupom v shelli
    • výpis:

      printf "$IFS" | od -ac -An
      
      • výsledok:

        sp  ht  nl
        \t  \n
        
    • štandardne trojznakový reťazec “<tabulátor><nový_riadok>”

    • používaná (zdroj: Wooledge.org Wiki)
    • pri read do viacerých premenných používaná na delenie riadkov
    • pri neúvodzovkovanej expanzii používaná na sekanie slov (word splitting)
    • pri premennej "$*" (hviezdička v úvodzovkách) sa prvý znak IFS vkladá medzi prvky reťazca

Vytvorte skript, ktorým skompilujete všetky céčkové súbory v adresári

for SUBOR in ./*.c
do
        echo "Kompilujem $SUBOR"
        gcc "$SUBOR" -o ${SUBOR#.c}
done

Majme súbor so zoznamom pápežov. Stiahnite pre každý riadok príslušný článok z Wikipedie

tr ' ' '_' | xargs -n1 -I{} wget -q http://wikipedia.org/wiki/Pope_{} < /tmp/popes/popes.txt
  • Predpis je:

    http://wikipedia.org/wiki/Pope_John_Paul_II
    

Alternatívne (cez for)

while read POPE; do wget -q http://wikipedia.org/wiki/Pope_$(echo $POPE | tr ' ' '_'); done < /tmp/popes/popes.txt 

Alternatívne (cez for)

for SUBOR in /tmp/popes/*
do
        echo "Stahujem z Wikipedie info o ${SUBOR##/tmp/popes/}"

        SUFIX=$(echo ${SUBOR##/tmp/popes}  | tr ' ' '_' )
        wget -q http://wikipedia.org/wiki/Pope_$SUFIX
done
  • operátor ## v expanzii maže prefixy z reťazca
  • ak vypadne z hlavy, vieme použiť aj sed:

    echo $SUBOR | sed 's#/tmp/popes/##' 
    
  • namiesto tr môžeme použiť ďalší sed (s globálnym nahrádzaním g)

     sed 's# #_#g'
    
  • viac sedov môžeme kombinovať cez -e

    SUFIX=$(echo $SUBOR | sed -e 's#/tmp/popes/##' -e 's# #_#g' -e 's#^#Pope_#')
    

Z SQL dumpu MySQL databázy zistite zoznam tabuliek

grep "CREATE TABLE" | cut -d' ' -f3 | tr -d '`' < itat2011.sql

Z SQL dumpu MySQL databázy zistite tabuľky, ktoré majú CREATE, ale nemajú INSERTy

grep 'CREATE TABLE' /tmp/itat2011.sql | cut -d'`' -f2 | sort > creates.sql
grep 'INSERT INTO' /tmp/itat2011.sql | cut -d'`' -f2 | sort > inserts.sql
comm creates.sql inserts.sql | grep -i '^[a-z]'

Alternatívne

grep -E 'CREATE|INSERT' | cut -d' ' -f3 | uniq -c | awk '$1 == 1 { print $2 }' < /tmp/itat2011.sql
  • spoľahneme sa na to, že tabuľka, ktorá má CREATE aj INSERT, sa vo výpise vyskytne dvakrát.
  • cez awk vysekneme len jej názov

Zistite, či počítač žije (= odpovedá na ping)

ADRESA=$1

if [ -z $1 ]
then
    echo "Adresa musi byt zadana"
    exit 1
fi

if ping -c1 -w1 "$ADRESA" > /dev/null
then
        echo "Hostitel $ADRESA zije"
else
        echo "Hostitel $ADRESA neodpoveda"
fi
  • pošleme len jeden paket (-c1)
  • nastavíme len sekundové čakanie (-w1); dovtedy by sa to malo stihnúť
  • ping vracia exit code 0, ak uspel, inak vracia 1
  • if dostane príkaz a podľa jeho exit codu vykoná vetvu true alebo false
  • pomocou presmerovania do /dev/null potlačíme výstup pingu

Zistite, či počítače uvedené v textovom súbore po riadkoch žijú

xargs -n1 ./hostzije < ipcky.txt

Využijeme skript z predošlej úlohy. Pomocou xargs berieme vstupy po riadkoch (= po jednotlivých IPčkach) a posielame ich po jednom (-n1) do nášho skriptu.

Alternatívne one-liner

seq 255
    | xargs -I{} ping -c1 -w1 -q 158.197.31.{} 
    | grep -e "PING" -e "packets transmitted" 
    | sed 'N;s/\n//' 
    | cut -d ' ' -f2,12 
    | sed -e 's/ 0%/ FAIL/' -e 's/ 100%/ OK/'
  • skontroluje rozsah 1..255
  • parsuje reťazec s počtom prenesených paketov

One thought on “Seminár k operačným systémom: Cvičenie 7 [Bash III.]

  1. It’s a shame you don’t have a donate button! I’d definitely donate to this brilliant blog! I guess for now i’ll settle for bookmarking and adding your RSS feed to my Google account.

    I lolok forward to fresh updates and will share this site with mmy Facebook group. Talk soon!

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *