2017 m. sausio 3 d., antradienis

awk pavyzdžiai

awk - tai komanda turinti programavimo kalboms būdingų bruožų. Ši komanda atskiria failų eilutes, kuriose atrandamas vartotojo užkoduotas šablonas.

-F: - laukelio skyriklis, paprastai skyriklis yra tarpas. Skaitant passwd failą, jį pakeiskime į ":".
$0 - visų argumentų atvaizdavimas.
$1..$n - n argumento atvaizdavimas.

Rezervuoti kintamieji:
NR - Perskaitytų failo eilučių kiekis faile.
NF - Laukų skaičius einamojoje eilutėje.
exit - Programos nutraukimas.

$ awk -F: '{print $1}' /etc/passwd #Atspausdins visus passwd failo vartotojus  ($1)
$ awk -F: '{print $1, $3}' /etc/passwd #Atspausdins 1, 3 dvitaškiu atskirtą žodį
$ awk -F : '$3 > 1000 {print $0}' /etc/passwd #Atspausdins tik tas eilutes, kurių vartojo id ($3) > 1000

Kaip atspausdinti eilutes tam tikru  intervalu?

$ cat -n aaa | awk 'NR%2==1' #Pradeda, nuo 1 eilutės ir spausdinam, kas 2

Kaip gauti intarvalą tarp dviejų reikšmių?

$ awk -F : '($3 > 1000) && ($3 <= 1003) {print $0}' /etc/passwd #Atspausdins vartotojus, kurių id 1000 > x < 1003

Tuščių eilučių pašalinimas, kartu  atspausdinant tam tikrą eilučių skaičių:
$ awk '{$2=$2};1 && FNR <= 5' file #Su && sujungiame komandas.

Argumentų reikšmių priskyrimas:
$ echo "vienas du trys atspausdintas tekstas" | awk '{$1=$2=$3="";print}' #Atspausdins tik " atspausdintas tekstas"

Scenarijai

Kaip rasti negaliojančius sistemos vartotojus?

Vartotojų galiojimo laikas kontroliuojamas chage komandą. Galiojimo laikas saugomas /etc/shadow dokumente, nurodant dienų skaičių po epochos laiko pradžios.
TODAY=$(echo $(($(date --utc --date "$1" +%s)/86400))) #Dienos praėjusios po 1970 sausio 1 d iki šiandien
$ sudo gawk -F: '{if (($8 > 0) && ($TODAY > $8)) print $1}' /etc/shadow

Kaip atspausdinti savo ip adresą?

$ ip a s $(ip r s 0/0 | awk '{print $5;exit}') | awk '$1 ~ /inet$/ {print $2;exit}'


Prie kokių servisų esam prisijungę?:
$ netstat -np | awk '{print $7}' | awk -F/ '{count[$2]++}END{for(j in count) print count[j],j}' | sort -nr