awk is filter. awk performs the specified action on lines that match the pattern. Like ‘sed’, a regular expression pattern must be enclosed in a forward slashes. If no pattern is listed, the action is performed on every input line.
awk 'pattern {action}' [files]
$ awk '/^S/' phone.list
$ awk '/^S/ {print $1}' phone.list
Variables
$0 represents the whole current input record
$1 represents the first field of the current input record
$NF is number of fields for the current input record
NR is number of Lines read
Operators
Relational Operators
< and > Less than and Greater than
<= and >= Less than or equl to AND Greater than or equl to
== and != Equl to AND Not qual to
~ and !~ Matches AND Doesn't match regular expressions
Boolean Operator:
|| Logical OR
&& Logical AND
! Logical NOT
Assignment Operators
++ Add 1 to variable.
-- Subtract 1 from variable.
+= Assign result of addition.
-= Assign result of subtraction.
*= Assign result of multiplication.
/= Assign result of division.
%= Assign result of modulo.
^= Assign result of exponentiation.
**= Assign result of exponentiation.[6]
Arithmetic Operator
+ Addition
- Subtraction
* Multiplication
/ Division
% Modulo Division (Remainder)
= assignment
printf fuction: printf statement can be used to specify the width and alignment of output fields. Unlike print function, it does not give any new line charater at the end of the line. The contents of the field will ne right justif ied by default. You musr specify “-” to get left justification. Thus “%-20s” out puts a string left justif ied in a fiels 20 character wide.
Format Specifiers used in printf
c ASCII Character
d Decimal Integer
e Floating point format
s String
% Literal %
Example of formatting:
$ ls -l
-rwxrwxr-x 1 c1jkaila usa 543 Jan 30 15:28 autopath
drwxr-xr-x 2 c1jkaila usa 512 Mar 19 15:14 bin
drwxr-x--- 2 c1jkaila usa 512 Mar 19 09:23 odbc
Without formating:
$ ls -l | awk '{print $9, $2}'
autopath 1
bin 2
odbc 2
With formating:
$ ls -l | awk '{printf "%-25s%-5s\n", $9, $2}'
autopath 1
bin 2
odbc 2
sdata 2
shareware 2
tmp 2
To find a patern “Dec” in 6th field
ls -l | awk '$6 == "Dec"'
To display the first and second fields of each line
awk '{print $1, $2}' <filename>
To display all the lines containing string1 in file called file1
awk '/string1/' file1
To display the first and 3rd fields of /etc/passwd file
awk -F: '{print $1, $3}'
To display the first and last field of /etc/passwd file
awk -F: '{print $1, $NF}'
To display the previous field to the last filed of any file
awk '{print $(NF-1)}' file_name
To sum all the fields using awk command:
ls -l | awk '{sum += $5} {print sum}'
ls -l | awk '{sum += $5} END {print sum}'
To add few numbers and find out the average
echo "test 10 20 30" | awk '{total = $2 + $3 + $4} {ave = total / 3} {print ave}'
To add the value of Unix variable $var1 to the beginning of each line in file1
cat file1 | awk -v name=$var1 '{print name" " $0}'
To replace DS with DSsmtp.comcast.net if the line has only single word ‘DS’
awk '{if ($0~/^DS$/) {print "DSsmtp.comcast.net"} \
else {print}}' /etc/mail/sendmail.cf
This example is used in AIX
awk '{if ($0!~/^\*/ && $0~/:$/ && $1~/^default:$/) {print $0"\n\tregistry = NIS"} \
else if ($0!~/^\*/ && $0~/:$/ && $1!~/^default:$/) {print $0"\n\tregistry = files"} \
else {print}}' /etc/security/user > /etc/security/user.new
To add # mark to the beginning of each line except for the lines starting with #, ftp, shell, and telnet:
awk '{if ($1~/^#/ || $1~/^ftp/ \
|| $1~/^shell/ || $1~/^telnet/) \
{print} else {print "#"$0}}' /etc/inetd.conf
Running Unix commands directly using awk
# ps -ef | grep syncd | grep -v grep | awk '{system("kill -9 " $2)}'
The above command find the process ID of sysncd and kills that process.
Some examples with sample output
$ awk -F":" '{ print "username: " $1 "\t\tuid:" $3" }' /etc/passwd
username: halt uid:7
username: operator uid:11
username: root uid:0
Read Full Post »