The Basics of awk
To use awk
, you often work with textfiles. The text file could look something like this.
ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000
What awk
basically does, is handle each line, one by one. It also separates the fields in a line so you can get your specified value. By default, you’ll use whitespace
as a separator.
The syntax should look something like this
# with a file
awk '{print}' test.txt
# with pipes
echo "some text" | awk '{print}'
It is important to use '
instead of "
to make it work.
Printing fields
You can use awk
in many different ways. The most common is printing one or more separate fields. Each field is given a variable you can use. This applies to all lines, not only the first one used in this example.
$1 $2 $3 $4
ajay manager account 45000
If you want to print the whole line, you’ll use $0
. Here are some examples of how you can use it.
# print whole line
awk '{print $0}' test.txt
# print only first field
awk '{print $1}' test.txt
# print first and last
awk '{print $1, $4}' test.txt
You can also filter to write fields that only contain a specific text.
# print only lines containing the word "manager"
awk '/manager/ {print}' test.txt
# print only lines containing the word "manager" or "clerk2
awk '/manager|clerk/ {print}' test.txt
Built-in variables
There are some variables you can use as well.
NR
- line numberNF
- number of fields in each lineFS
- field separator (whitespace as default)RS
- record separator (newline as default).OFS
- output field separator (blank space is default).ORS
- output record separator
Some basic usages with the variables
# display last field only
awk '{print $NF}' test.txt
# display only first line
awk 'NR==1 {print $0}' test.txt
# display line from 3 to 6
awk 'NR==3, NR==6 {print $0}' test.txt
# display each line with line number before
awk '{print $NR,$0}' test.txt
# print all lines with more than 0 fields
awk 'NF > 0' test.txt
# print lines with more than 0 characters
awk 'length($0) > 10' test.txt
# print line if first field is "ajay"
awk '$1 == "ajay" {print $0}' test.txt
Change field separator
By dafult, each field is separated by a whitespace. If you want to use something else, you can specify it with the F
flag.
# use = as separator
awk -F '=' '{print $1}'
# use + or = as separator
awk -F '[+=]' '{print $1}'