AWK is a domain-specific language designed for text processing and typically used as data extraction and reporting tool.
In other words, it gets input and shows it in a different way, making it simple to grab only the desired information.
Actually, AWK is much more complex than just grep, sed, or similar Linux commands. It is a complete scripting language.
Printing the desired columns:
awk '{print}' file.txt
awk '{print $1}' file.txt
who | awk '{print $1,$4}'
NF means the Number of Field, and can represent the last field:
awk '{print $NF}' file.txt
awk '{print $(NF-1)}' file.txt
Setting another delimiter character instead of space:
awk -F':' '{print $1,$7}' /etc/passwd
awk -F: '{print $1,$7}' /etc/passwd
Defining the output field separator:
date | awk 'OFS="/" {print $7,$2,$3}'
date | awk 'OFS="-" {print $7,$2,$3}'
Executing command before and after:
who | awk 'BEGIN {print "Connected users:"} {print $1,$4} END {print "End of the list."}'
Adding RegEx patterns (conditions) to the data:
awk -F: '$3 >= 1000 {print $1,$3}' /etc/passwd
awk '/UUID/ {print $1}' /etc/fstab
A short-list of built-in functions:
- Numeric
- atan2(y, x)
- cos(x)
- exp(x)
- int(x)
- log(x)
- rand()
- sin(x)
- sqrt(x)
- srand([x])
- String
- asort(source [, dest [, how ] ])
- asorti(source [, dest [, how ] ])
- gensub(regexp, replacement, how [, target])
- gsub(regexp, replacement [, target])
- index(in, find)
- length([string])
- match(string, regexp [, array])
- patsplit(string, array [, fieldpat [, seps ] ])
- split(string, array [, fieldsep [, seps ] ])
- sprintf(format, expression1, …)
- strtonum(str)
- sub(regexp, replacement [, target])
- substr(string, start [, length ])
- tolower(string)
- toupper(string)
- Input/output
- close(filename [, how])
- fflush([filename])
- system(command)
- Time
- mktime(datespec [, utc-flag ])
- strftime([format [, timestamp [, utc-flag] ] ])
- systime()
- Bits
- and(v1, v2 [, …])
- compl(val)
- lshift(val, count)
- or(v1, v2 [, …])
- rshift(val, count)
- xor(v1, v2 [, …])
- Type
- isarray(x)
- typeof(x)
awk 'BEGIN {print function(arg1, "arg2")}'
awk 'length($0) > 80'
awk '{ if (length($0) > max) max = length($0) } END { print max }'
Scripting:
nano cmd.awk
#!/bin/awk -f
BEGIN { print "Hello!" }
chmod +x cmd.awk ./cmd.awk
Examples:
#!/bin/awk -f
BEGIN { n=1
while ( n < 5 )
{
print n;
n++;
}
}
#!/bin/awk -f
BEGIN {
for (i=1; i <= 10; i++) {
printf "The square of ", i, " is ", i*i;
}
exit;
}
#!/bin/awk -f
BEGIN {
print "Start";
}
{
print "Perform";
}
END {
print "Complete"
}
#!/bin/awk -f
BEGIN {
lines=0;
total=0;
}
{
lines++;
total+=1;
}