====== 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. ----