Total Hit Counter

Friday, February 1, 2013

awk command

To Print Last field with sapretor 
awk -F: '{ print $NF }' input.txt


To Print Second Last field with sapretor 
awk -F: '{ print $(NF-1) }' input.txt




<em>pattern matching and processing </em>

<strong>awk 'pattern {action}' filename </strong>

reads one line at a time from file, checks for pattern match, performs action if pattern matched <em>pattern</em>

NR is a special awk variable meaning the line number of the current record
can use a line number, to select a specific line, by comparing it to NR (for example: NR == 2)
can specify a range of line numbers (for example: NR == 2, NR == 4)
can specify a regular expression, to select all lines that match

$n are special awk variables, meaning the value of the nth field (field delimiter is space or tab)

$0 is the entire record
can use field values, by comparing to $n (for example: $3 == 65)
every line is selected if no pattern is specified

instructions

print - print line(s) that match the pattern, or print fields within matching lines
print is default if no action is specified
there are many, many instruction, including just about all C statements with similar syntax
other instructions will be covered in future courses

examples, using the file cars from page 654 of "A Practical Guide to Linux"

awk 'NR == 2, NR == 4' cars - print the 2nd through 4th lines (default action is to print entire line)
awk '/chevy/' cars - print only lines matching regular expression, same as grep 'chevy' cars
awk '{print $3, $1}' cars - print third and first field of all lines (default pattern matches all lines)
awk '/chevy/ {print $3, $1}' cars - print third and first fiield of lines matching regular expression
awk '$3 == 65' cars - print only lines with a third field value of 65
awk '$5 &lt; = 3000' cars - print only lines with a fifth field value that is less than or equal to 3000
the file testfile can be used with the following examples:
awk '{print $1}' testfile - print first field of every record
awk '{print $3 $1}' testfile
awk '{print $3, $1}' testfile - inserts output field separator (variable OFS, default is space)
awk -F, '{print $2}' testfile - specifies that , is input field separator, default is space or tab
awk '$2 ~ /[0-9]/ {print $3, $1}' testfile - searches for reg-exp (a digit) only in the second field
awk '{printf "%-30s%20s\n", $3, $2}' testfile - print 3rd field left-justified in a 30 character field, 2nd field right-justified in a 20 character field, then skip to a new line (required with printf)

awk '$3 &lt;= 23' testfile - prints lines where 3rd field has a value &lt;= 23
awk '$3 &lt;='$var1' {print $3}' testfile - $var1 is a shell variable, not an awk variable, e.g. first execute: var1=23
awk '$3&lt;='$2' {$3++} {print $0}' testfile - if field 3 &lt;= argument 2 then increment field 3, e.g. first execute: set xxx 23

awk '$3&gt; 1 &amp;&amp; $3 &lt; 23' testfile - prints lines where 3rd field is in range 1 to 23
awk '$3 &lt; 2 || $3 &gt; 4' testfile - prints lines where 3rd field is outside of range 2 to 4
awk '$3 &lt; "4"' testfile - double quotes force string comparison
NF is an awk variable meaning # of fields in current record
awk '! (NF == 4)' testfile - lines without 4 fields
NR is an awk variable meaning # of current record
awk 'NR == 2,NR==7' testfile - range of records from record number 2 to 7
BEGIN is an awk pattern meaning "before first record processed"
awk 'BEGIN {OFS="~"} {print $1, $2}' testfile - print 1st and 2nd field of each record, separated by ~
END is an awk pattern meaning "after last record processed"
awk '{var+=$3} END {print var}' testfile - sum of 3rd fields in all records
awk '{var+=$3} END {print var/NR}' testfile - average of 3rd fields in all records - note that awk handles decimal arithmetic

awk '$5 &gt; var {var=$5} END {print var}' testfile - maximum of 5th fields in all records
awk '$5 &gt; var {var=$5} END {print var}' testfile - maximum of 5th fields in all records
sort -rk5 testfile | awk 'NR==1 {var=$5} var==$5 {print $0}' - print all records with maximum 5th field

Simple awk operations involving functions within the command line:

awk '/chevy/' cars

# Match lines (records) that contain the keyword chevy note that chevy is a regular expression...

awk '{print $3, $1}' cars

# Pattern not specified - therefore, all lines (records) for fields 3 and 1 are displayed
# Note that comma (,) between fields represents delimiter (ie. space)

awk '/chevy/ {print $3, $1}' cars

# Similar to above, but for chevy

awk '/^h/' cars

# Match cars that begin with h

awk '$1 ~ /^h/' cars                       ### useful ###

# Match with field #1 that begins with h

awk '$1 ~ /h/' cars

# Match with field #1 any epression containing the letter h

awk '$2 ~ /^[tm]/ {print $3, $2, "$" $5}' cars

# Match cars that begin with t or m and display field 3 (year), field 2 (model name) and then $ followed by field 4 (price)

--------------------------------------------------------------------------------------------------
Complex awk operations involving functions within the command line:

awk ‘/chevy/ {print $3, $1}’ cars
# prints 3rd &amp; 1st fields of record containing chevy

awk ‘$1 ~ /^c/ {print $2, $3}’ cars
# print 2nd &amp; 3rd fields of record with 1st field beginning with c

awk ‘NR==2 {print $1, $4}’ cars
# prints 1st &amp; 4th fields of record for record #2

awk ‘NR==2, NR==8 {print $2, $3}’ cars
# prints 2nd &amp; 3rd fields of record for records 2 through 8

awk ‘$3 &gt;= 65 {print $3, $1}’ cars
# prints 3rd &amp; 1st fields of record with 3rd field &gt;= 65

awk ‘$5 &gt;= “2000” &amp;&amp; $5 &lt; “9000” {print $2, $3}’ cars
# prints 2nd &amp; 3rd fields of record within range of 2000 to under 9000

No comments: