Awk’s built-in variables include the field variables—$1, $2, $3, and so on ($0 is the entire line) — that break a line of text into individual words or pieces called fields.
NR: NR command keeps a current count of the number of input records. Remember that records are usually lines. Awk command performs the pattern/action statements once for each record in a file.
NF: NF command keeps a count of the number of fields within the current input record.
FS: FS command contains the field separator character which is used to divide fields on the input line. The default is “white space”, meaning space and tab characters. FS can be reassigned to another character (typically in BEGIN) to change the field separator.
RS: RS command stores the current record separator character. Since, by default, an input line is the input record, the default record separator character is a newline.
OFS: OFS command stores the output field separator, which separates the fields when Awk prints them. The default is a blank space. Whenever print has several parameters separated with commas, it will print the value of OFS in between each parameter.
ORS: ORS command stores the output record separator, which separates the output lines when Awk prints them. The default is a newline character. print automatically outputs the contents of ORS at the end of whatever it is given to print.
NR číslo aktuálně zpracovávaného záznamu // The current record's number.
NF počet položek aktuálního záznamu // The number of fields in the record.
NF <===> Number of fields - representuje podleni sloupec, v podstate pokud chcem JENOM ten posledni sloupec - pozor pokud nektery z radku nema stejny pocty sloupcu, VZDY NF zobrazi POSLEDNI sloupec daneho radku!
FS oddělovač poli // Field separator.
RS oddělovač záznamů // Record separator.
OFS nastaveni vystupniho znaku mezi jednotlivymi poli, pokud chci oddelit tabelatoroma zadam OFS="\t" // Output field separator.
ORS Output record separator.
FILENAME jméno aktuálního vstupního souboru (v případě standardního vstupu "-" // The name of the presently processed input file.
PRIKLADY
## awk '$1 >= "1" && $1 < "T" && $1 !~ /^D.*k$/ {print $0}' priklad4 >>>>>>>
## Jak vidno výrazu vyhověl rovněž "Dodatečný řádek", protože jeho první položka, řetězec "Dodatečný" sice začíná na "D", ale nekončí na "k"
## $0 representuje celou radku textu
awk '/delnik/ {print}'
<===> vypise radky kde je pouze slovo delnikawk '/delnik/'
<===> taktez vypise radky kde JE pouze slovo delnik
awk '/ni/ {print $0}' dataawk 'NR>2 {print $NF}'pokud je v textu (radce) slovo "ni" tak vypis tento radek (print $0 znamena "vytiskni tento radek")
awk -F'[<>]' '{print $2}' SOUBOR
<===> vypise pouze obsah mezi znaky < > v SOUBORU
awk -F'[()]' '{print $2}'
<===> vypíše pouze údaje které jsou mezi dvěma závorkama ()
awk -F, '{print $NF}' priklad02
<===> vypise pouze posledni udaj z radku a to i kdyz ma udaj mezery mezi sebou
awk '!/delnik/'
<===> vypise radky kde NENI slovo delnik
awk '!/ni/ {print $0}' data
<===> pokud je v textu (radce) slovo "ni" tak NEVYPISUJ tento radek
awk '{print $1}'
<===> vypise prvni sloupec z tabulkoveho seznamu oddeleneho mezerouawk '{print $1,$4}'
<===> vypise pouze sloupce 1 a 4 (jmeno + plat)awk '{print $1,$NF}'
<===> vypise pouze sloupec 1 a posledni sloupecawk 'NR>2 {print $NF}'
<===> vypise posledni hodnotu v kazde radce
awk '{print $1}' | cut -c4-8 | sort -V | uniq
<===> vybere pouze pismena od pozice 4 az 8 z prvniho sloupce, seradi je a odebere duplicitni
awk '{print NR "- " $1 }'
<===> vypise pouze prvni sloupec a pred nej prida pomlcku a cislo radku
awk 'length($0) > 10'
<===> vypise pouze ty radky, ktere maji vice jak 10 znaku
echo "12 23 11" | awk '{split($0,a); print a[3]; print a[2]; print a[1]}'
<===> rozdeli radek na jednotlive sloupce a vypise je POD SEBE
echo "12:23:11" | awk '{split($0,a,":"); print a[3]; print a[2]; print a[1]}'
<===> rozdeli radek na jednotlive sekce podle znaku zavorka (:) a kazdou cas napise na novy radek
awk '{print NR,$0}' employee.txt
<===> ocisluje pred kazdou radku cislo radkuawk 'NR==3, NR==5 {print NR,$0}' priklad01
<===> vypise pouze radky 3 az 5
awk '{print $NF}'
<===> vypise POSLEDNI sloupec z tabulkoveho seznamu (oddeleneho mezerou)
awk '$1 == "#" {print $2}'
<===> vypise jen radku ktere zacinaji/nebo obsahuji symbol # ale z nich pouze druhy sloupec
cat /etc/passwd | awk -F: '{print $1 " " $7}'
<===> Chceme třeba vědět, který uživatel používá jaký shell
awk '{print "'\''"$0}' pokus | awk '{print $0"'\'',"}' > pokus-modified
<===> vytvořím nový soubor s názvem pokus-modified, který bude mít na začátku každé řádky jednoduchou uvozovku a na konci jednoduchou uvozovku a čárku.
awk {'print $3, $1, $2'} FS=/ | sort -n
<===> nahradi delice (cisla oddelena lomitkama) oddeli jednotlive sloupce mezerou a seradi je od nejvetsiho po nejmensi
awk -F "/" '{print $3, $1, $2}' | sort -V
<===> nahradi delice (cisla oddelena lomitkama) oddeli jednotlive sloupce mezerou a seradi je od nejvetsiho po nejmensi
awk '{print $1}' FS='\t' input.txt
<===> vykucha pouze prvni ze sloupcu (pouze pokud jsou hodnoty oddelene tabulatorem)
awk -F: '{print $1}' /etc/passwd
<===> vypise pouze prvni sloupec - definuje oddelovace jako :
awk -F"," 'NR!=1{print $1,$3}' OFS="," priklad2
<===> OFS is another awk special variable. Just like how FS is used to separate the input fields, OFS (Output field separator) is used to separate the output fields.
nawk -F/ '{print $1$3}' priklad3 | tr -d \"
<===> ??
awk '{$2=$2};1' priklad06
<===> odstrani vice mezer v textu
awk -F ',' '{if($2==$3){print $1","$2","$3} else {print "Zadne Duplikaty"}}' priklad08
<===> porovna druhy a treti sloupec a vypise u sloupcu textu kde NENI duplicitni hodnota vysledek "Zadne Duplikaty"
awk -F"," '{if ($2!=$3) {print $1, $2, $3} else {print $1, "Duplikaty"}}' priklad08
<===> porovna druhy a treti sloupec a vypise u sloupcu textu kde JE duplicitni hodnota vysledek "Duplikaty"
awk '{if ($4!=0 && $8=="WPA2") {print $0}}' data35
<===> vypise pouze ty radku kde NENI ve 4.sloupci NULA a ZAROVEN v 8.sloupci je udaj WPA2
awk '{ if (length($0) > max) max = length($0) } END { print max }' data
<===> vypise delku (pocet pismen) NEJDELSIHO radkuawk 'NF > 0' data
<===> vypis kazdy radek ktery ma alespon jeden sloupec tj. vypusti take ty radky, kde nic neniawk 'NF > 4' data
<===> vypis jen ten radek, ktery ma alespon ctyri sloupce
id | sed 's/,/\n/g' | awk -F '[(|)]' '{print $2}'
<===> z celeho radku nahradi carky novou radkou a vykucha vse uvnitr zavorek
grep input file | awk '{print}' ORS=', '
<===> pokud je na kazdem radku neco, tak to nahaze za sebe a oddeli carkou
awk -F\; '{for(i=1;i<=NF;i++)r[i]=r[i] sep $i;sep=FS}END{for(i=1;i<=NF;i++)print r[i]}' priklad09
<===> prevede tabulka radku na tabulku sloupcu
awk '{ for (i=1; i<=NF; i++) if ($i ~ /ai/) print $i }'
<===> hledá část slova (v tomto případě ai) a pokud ho ve slově ajde celé slovo vypíše
několik způsobů smazání prázdných řádků
awk /./
<===> odstraní prázdné řádkyawk 'NF'
<===> odstraní prázdné řádkyawk 'length'
<===> odstraní prázdné řádkyawk '/^[ \t]*$/ {next;} {print}'
<===> odstraní prázdné řádkyawk '!/^[ \t]*$/'
<===> odstraní prázdné řádky
PRIKLADY
$ cat DATA
abcdefghi.234,12345,xyz
riosadsef.543,19432,eis
baifafsag.342,01934,eod
$ awk -F, '{print substr($1, 1, length($1)-4), $3}' DATA
abcdefghi xyz
riosadsef eis
baifafsag eod