linux_wiki:awk

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
linux_wiki:awk [2015/03/09 22:53]
billdozor
linux_wiki:awk [2019/05/25 23:50] (current)
Line 6: Line 6:
 Gawk is the GNU Project's implementation of the AWK programming language. Gawk is the GNU Project's implementation of the AWK programming language.
  
-I typically stick to using gawk and in most cases, awk is a symlink to gawk+In most cases, awk is a symlink to gawk.
-This page will contain useful gawk commands as I run into them.+
  
 **Checklist** **Checklist**
-  * DistrosAll +  * Distro(s)Any 
-  * gawk installed+  * Software: awk/gawk installed 
 + 
 +---- 
 + 
 +====== General Awk Variables ====== 
 + 
 +  * -F":" => Set the field seperator to colon (:), instead of spaces (default). 
 +    * This can be set to any character 
 +  * $0 => The entire line (excluding new line at the end) 
 +  * $1 - $number => The fields 
 +  * NF => Number of fields on the current line 
 +  * NR => Current line number
  
 ---- ----
Line 24: Line 34:
 </code> </code>
 Notice that the last line "I am fine." is not displayed at all because it doesn't match the regex. (Hello) 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
 +<code bash>
 +VERSION=4.3.0
 +echo | gawk -v n1=${VERSION} -v n2=3.5.3  '{if (n1>=n2) print ("true"); else print ("false");}'
 +
 +true
 +</code>
 +
 +----
 +
 +===== Print Line After Match =====
 +
 +Search for a regex string and print the line AFTER the match.
 +
 +<code bash>
 +awk '/mystring/ { getline; print }'
 +</code>
 +  * mystring => regex string to search for
 +  * getline => set the line $0 to the next line
 +  * print => print the line
 +
 +----
 +
 +===== Print Line Before Match =====
 +
 +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.
 +
 +  - Find users and account disabled status<code bash>
 +/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
 +</code>
 +  - Narrow it down to just usernames and True/False values<code bash>
 +/usr/bin/ipa user-find --sizelimit=0 --all | grep -E "(User login|Account disabled)" | awk '{print $3}'
 +
 +rjones
 +False
 +sanderson
 +True
 +</code>
 +  - Add in the awk magic that will display ONLY the username with "False" after it (Not Disabled)<code bash>
 +/usr/bin/ipa user-find --sizelimit=0 --all | grep -E "(User login|Account disabled)" | awk '{print $3}' | awk '/False/ { print x }; { x=$0 }'
 +
 +rjones
 +</code>
 +
 +**Explanation**
 +  * If the current line matches the regular expression "False" ("/False/"), then
 +    * Print the value of x ("{ print x }").
 +  * Next, store the current line in the variable "x" ("{ x=$0 }" (Always do this; Does not matter if it matches)
 +    * This has the effect of making the previous line available when evaluating the next line.
 +      * Note: This will not work if the very first line matches the pattern, as x will not contain any lines yet.
 +
 +----
 +
  • linux_wiki/awk.1425956008.txt.gz
  • Last modified: 2019/05/25 23:50
  • (external edit)