Cílem je vyzkoušet si textové úpravy pomocí filtru awk
Jednoduché transformace pomocí příkazu awk
Pokud máte naklonovaný repozitář
https://gitlab.fit.cvut.cz/barinkl/uos-workbench.git, aktualizujte jej, jinak si jej naklonujte.
~( cd ~/uos-workbench && git pull ) \
|| git clone https://gitlab.fit.cvut.cz/barinkl/uos-workbench.git
Do proměnné passwd
uložte absolutní cestu k souboru passwd
v adresáři uos-workbench
. Zjistěte, zda soubor z této proměnné existuje.
~passwd=~/uos-workbench/passwd
~[ -f "$passwd" ] && echo OK
Pomocí příkazu awk
vypište počet řádků v souboru passwd
.
~awk 'END { print NR }' "$passwd"
Vypište pouze 3. sloupec (UID) souboru passwd
.
~awk -F: '{ print $3 }' "$passwd"
Jedním průchodem dat vypište nejvyšší UID ze souboru passwd
.
~awk -F: '$3 > max { max = $3 }; END { print max }' "$passwd"
Jedním průchodem dat vypište uživatelské jméno uživatele s nejvyšším UID ze souboru passwd
.
~awk -F: '
$3 > max { max = $3; user = $1 }
END { print user }
' "$passwd"
Vypište reálné jméno všech uživatelů (5. sloupec) ze souboru passwd
, které pomocí funkce tolower()
převedete na malá písmena.
~awk -F: '{ print tolower($5) }' "$passwd"
Vypište původní jméno i jméno převedené na malá písmena, oddělte je pomocí ' ->
' .
~awk -F: '{ print $5 " -> " tolower($5) }' "$passwd"
~awk -F: '
BEGIN { OFS=" -> " }
{ print $5, tolower($5) }
' "$passwd"
Vypište reálné jméno zaměstnanců (na konci reálného jména je slovo zam
).
~awk -F: '$5 ~ / zam$/ { print $5 }' "$passwd"
Do výstupu předchozího příkladu přidejte na začátek řádky uživatelské jméno (1. sloupec) a reálné jméno převeďte na malá písmena.
~awk -F: '$5 ~ / zam$/ { print $1, tolower($5) }' "$passwd"
Z výstupu předchozího příkladu vypište pouze uživatelské jméno a příjmení uživatele.
~awk -F: '$5 ~ / zam$/ { print $1, tolower($5) }' "$passwd" \
| awk '{ print $1, $3 }'
Složitější transformace pomocí příkazu awk
Vypište prvních 5 znaků z uživatelského jména a z příjmení pomocí funkce substr()
.
Předpokládejte, že příjmení je 2. slovo v reálném jméně uživatele.
~awk -F'[: ]' '{ print substr($1,1,5), substr($6,1,5) }' "$passwd"
Vypište prvních 5 znaků z uživatelského jména a příjmení, které převedete na malá písmena.
~awk -F'[: ]' '
{ print substr($1,1,5), tolower(substr($6,1,5)) }
' "$passwd"
V předchozí úloze zjistěte, zda začátek příjmení odpovídá začátku uživatelského jména. Pokud ne, vypište daný řádek.
~awk -F'[: ]' '
substr($1,1,5) != tolower(substr($6,1,5))
' "$passwd"
Vypište celé reálné jméno a z něj odstraňte poslední slovo a přidejte na začátek řádky informaci o počtu slov ve jméně.
~awk -F: '{ print $5 }' "$passwd" | awk '{ $NF=""; print NF, $0 }'
~awk -F: '{ print $5 }' "$passwd" | awk 'NF > 0 { NF--; print NF, $0 }'
Vypište reálné jméno uživatele (bez posledního slova), které je nejdelší nebo má nejvíce slov.
Použijte funkci length()
.
~awk -F: '{ print $5 }' "$passwd" \
| awk 'NF > 0 { NF--; print }' \
| awk '
length($0) > l { l = length($0); L = "" }
length($0) == l { L = L "\n" $0 }
NF > n { n = NF; N = "" }
NF == n { N = N "\n" $0 }
END { print l, L; print n, N }
'
Spočítejte průměrnou délku reálného jména uživatele.
awk -F: '{ l += length($5) }; END { print l/NR }' "$passwd"