====== AWK - AWK Patterns ======
Assuming a file exists with the following contents:
10 Peter Terence Roux 45
11 Virginia Genevieve Roux 45
12 Felix Devon Roux 5
13 David Bruce Stevenson 48
14 Bob James Smith 16
48 Adam Winter Ridley 23
----
===== Matching Patterns =====
To only print out lines which **match** a specific search criteria:
awk '/45/ {print $2,$4}' test.txt
returns:
Peter Roux
Virginia Roux
**NOTE:** This only prints out the lines from the file which contained the number 45.
----
===== Multi-line Output with Patterns =====
To output onto multiple lines:
awk '/45/ {print $2,$3,$4 ; print $1, $5}' test.txt
returns:
Peter Terence Roux
10 45
Virginia Genevieve Roux
11 45
**NOTE:** This only prints out the lines from the file which contained the number 45.
* But also prints out a 2nd line because of the use of the semicolon.
**NOTE:** A semicolon does not have to be used to allow using multiple commands.
For instance issue the following command instead:
awk '/45/ {print $2,$3,$4} {print $1, $5}' test.txt
returns:
Peter Terence Roux
10 45
Virginia Genevieve Roux
11 45
12 5
13 48
14 16
48 23
This time an altogether different result is produced, than when a semicolon was used.
The reason for this is that the pattern that is used, **/45/** is only applied to the command immediately following it. In this example, this was only against fields $2, $3 and $4.
The 2nd print statement is not affected by the pattern and would apply to all fields in the input file.
----
===== Match using Multiple Patterns =====
To search for more than one pattern match at a time, issue the following command:
awk '/45|48/ {print $2,$4}' test.txt
returns:
Peter Roux
Virginia Roux
David Stevenson
Adam Ridley
**NOTE:** The pipe symbol **|** is used to provide multiple patterns.
----
===== Match against specific field =====
To restrict the match to only a specific field:
awk '$5 ~ /45|48/ {print $2,$4}' test.txt
returns:
Peter Roux
Virginia Roux
David Stevenson
**NOTE:** Adam Ridley is not displayed even though the source file has a 48 as part of his record.
* The tilda ~ ties the match to a specific field.
----
===== Match not against a specific field =====
To have the match be the opposite of matching a specific field:
awk '$5 !~ /45|48/ {print $2,$4}' test.txt
returns:
Felix Roux
Bob Smith
Adam Ridley
**NOTE:** The **exclamation mark** and **tilda** (!~) together informs to not match to a specific field.
----
===== Match in a Range =====
To have the match be the opposite of matching a specific field:
awk '/4[2-8]/ {print $2,$4}' test.txt
returns:
Peter Roux
Virginia Roux
David Stevenson
Adam Ridley
**NOTE:** This finds all fields with values between 42 and 48.
----