Table of Contents

Awk

General Information

AWK is a pattern scanning and processing language. Gawk is the GNU Project's implementation of the AWK programming language.

In most cases, awk is a symlink to gawk.

Checklist


General Awk Variables


Gsub

gawk's gsub string function matches and replaces regular expressions. This can replace a grep | sed combination.

~$ echo -e "Hello, friend.\nHello, how are you?\nI am fine." | gawk 'gsub(/Hello/,"Goodbye")'
Goodbye, friend.
Goodbye, how are you?

Notice that the last line “I am fine.” is not displayed at all because it doesn't match the regex. (Hello)


Number Comparison

Bash doesn't have a really good way to compare floating point numbers. (Such as version numbers) This can be done very well with gawk.

Check to see if VERSION is >= to 3.5.3

VERSION=4.3.0
echo | gawk -v n1=${VERSION} -v n2=3.5.3  '{if (n1>=n2) print ("true"); else print ("false");}'
 
true

Search for a regex string and print the line AFTER the match.

awk '/mystring/ { getline; print }'

This trick allows you to search for a regex string, and print the line BEFORE the match.

FreeIPA Example: I want to get only enabled account usernames.

  1. Find users and account disabled status
    /usr/bin/ipa user-find --sizelimit=0 --all | grep -E "(User login|Account disabled)"
     
    User login: rjones
    Account disabled: False
    User login: sanderson
    Account disabled: True
  2. Narrow it down to just usernames and True/False values
    /usr/bin/ipa user-find --sizelimit=0 --all | grep -E "(User login|Account disabled)" | awk '{print $3}'
     
    rjones
    False
    sanderson
    True
  3. Add in the awk magic that will display ONLY the username with “False” after it (Not Disabled)
    /usr/bin/ipa user-find --sizelimit=0 --all | grep -E "(User login|Account disabled)" | awk '{print $3}' | awk '/False/ { print x }; { x=$0 }'
     
    rjones

Explanation