Skip to main content

Awk

awk

pattern {action}
pattern {action}

$ awk '{print $2}' /etc/fstab

to filter out comment lines - starting with #

$ awk '/^[^#]/ {print $2}' /etc/fstab

to grep on TWO occurences (AND operator)

$ awk '/pattern1/ && /pattern2/' /var/log/messages

case insensitive

$ awk '/pattern1/ && /pattern2/' IGNORECASE=1 /var/log/messages

print first field from password file using field seperator ':'

$ awk -F: '{print$1}' /etc/passwd

print only user ID > 500

$ awk -F: '$3>=500 {print$1}' /etc/passwd

display average of numbers entereed on a line:

$ awk '{ sum=0; for (i=1; i<=NF; i++) sum +=$i; print sum/NF; }'

NF

number of fields in the current line

NR

the current record number (line number)

FS

input field seperator (space by default)

RS

record seperator (newline by default)

Example

Example

Example

Example

Example

Example

Example

Example

Example

Example

show the 5th record on the second line:

df  /tmp | awk 'NR==2 {print$5 }'

use awk with a program

the file maxuid:

BEGIN {maxuid = 0; FS=":" }
{ if ($3 > maxuid) maxuid = $3 }
END { print" the largest UID is ", maxuid }

then use awk like this:

$ awk -f maxuid /etc/passwd

to ignore user nobody:

BEGIN {maxuid = 0; FS=":" }
$1 != "nobody" { if ($3 > maxuid) maxuid = $3 }
END { print" the largest UID is ", maxuid }

cat -n: (adds line numbers)

$ awk '{ print NR, $0}' /etc/fstab

wc -w: (count words)

$ awk '{ w += NF } END { print w}' /etc/fstab

grep chris /etc/passwd:

$ awk '/^chris/' /etc/passwd

writing self contained scripts

#!/usr/bin/awk -f
{ cost[$1] += $2*$4 }
END { for (cat in cost) print cat, cost[cat] }

chmod u+x catscript
./catscript 

http://www.pement.org/awk/awk1line.txt