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ý znakIFS
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
- využijeme
for
cyklus a expanziu súborov- podrobnosti v článku Cyklus
for
- pri expanzii využijeme predponu
./
kvôli lepšej bezpečnosti expanzie (podrobnosti na http://www.dwheeler.com/essays/filenames-in-shell.html)
- podrobnosti v článku Cyklus
- z výstupného súboru potrebujeme odseknúť príponu
- využijeme buď expanzie premenných, kde mreža odsekáva prípony
- alebo
$(echo "$SUBOR" | cut -d"." -f1)
- alebo
basename "$SUBOR" .c
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ímg
)sed 's# #_#g'
viac
sed
ov 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ú INSERT
y
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]'
comm
porovnáva súbory. Viac pozri samostatný článok
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
ajINSERT
, 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 1if
dostane príkaz a podľa jeho exit codu vykoná vetvu true alebo false- pomocou presmerovania do
/dev/null
potlačíme výstupping
u
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
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!