Gawk

From wikinotes
Revision as of 13:34, 20 September 2020 by Will (talk | contribs) (Will moved page Awk to Gnu awk)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

AWK is a scripting language that was originally designed for manipulating tables and presenting them in human-readable formats. It is useful on the commandline, I'd prefer to use a more powerful language than awk than use it for scripting.


WARNING:

There are two main variations of the unix coreutils (Gnu/BSD), each has different parameters etc. If you are expecting to use awk across different platforms, make no assumptions.


Usage

splitting strings

amixer get Master | grep 'Mono:' | awk -F "[" '{print $2}' | awk -F "]" '{print $1}'
awk 'BEGIN {print (10/2)}'

multiline matching

Awk can be used to match multiple lines. This is very very useful.

## Find the line state UP, then print the line 2 lines afterwards
## (each 'getline' returns the next line)

ip addr \
   | awk -F" " '/state UP/ { getline;getline; print $0 }' \

Syntax

Variables

Awk does not use a character to indicate that the current word is a variable. Note that each line must have a ';' to indicate line-end

$1 is the first argument passed to awk
$0 is the entire line passed to awk

var = 1;
array[1] = "abc";
result = ( (1/100) * 20 );

If Statments

if ( var >= 10 ) {
   print "var is larger than or equal to 10";
} else if ( var <= 5 ) {
   print "var is smaller than or equal to 5";
} else {
   print "all other cases"
}

Loops

var = 0;
while ( var < 10 ) {
   print var;
   var += 1;
}

print, printf, sprintf

print

Your basic print, like echo.

Multiple items can be printed separated by a comma. They will be output with a space between them by default. $0 prints the entire submitted line

echo "hello" | awk '{$0,"goodbye"}' 
> hello goodbye


$1, $2, $3 etc. prints each entry separated by a token. The default token is a single space.

echo "one two three four" | awk '{print $1 $3}'
> one three

printf

By default, every print statement is converted to a string. printf allows you to control the output type, and the spacing of elements

%s    # string
%f    # floating point
%i    # integer
%E    # scientific notation
%4s   # string (padded to 4 characters)
%.4s  # string (max 4 characters, truncated if necessary)
echo "one two three" | awk '{ printf(   "%10s %5s %-10s %s",    $1,$2,$3,"\n"   ) }'
>          one     two three
printf statements must be encased in parentheses. The first section specifies the format.

--left alignment
%10s means that the first entry ($1 in this case) is a string and will have a 
'column' 10 characters wide from the start of the word.
ex: {one.......}

--right alignment
%-10s means that the entry ($3) will have a column 10 characters wide, but starting at the end of the word.
ex: {.....three}

--integer
you could also just as easily print an integer with:

echo "10.459" | awk '{ printf( "%i", $1) }'
> 10

sprintf

sprintf is syntactically identical to printf except that instead of printing to the standard output, it is designed to be printed to a variable.

echo "8.234" | awk '{var = sprintf("%f", $1); print var}'

split

You can't call awk -F from within an awk script. But you can use split to tokenize within an awk script.

split("this is my string", buffer, " ")
a[1] = this
a[2] = is

NOTE:

awk has no way of measuring size of an array. You can however use split on a variable, and count the number of tokens

WARNING:

awk array indexes start at 1

match

match checks for a matching string, returns char number if found, otherwise returns a 0

match($0, "searchterm")
echo "abcdefg" | awk '{var=match($0, "cd"); print var}'
#> 3

echo "abcdefg" | awk '{var=match($0, "zef"); print var}'
#> 0

echo "abcdefg" | awk '{ 
   if(match($0, "cd")) { 
       print "match found"; 
   } 
}'
#> match found

system

Executes a command in shell or cmd from an awk script. Assigning to a variable only gives return value (1,0)

system(ls -la);

math

var+= 1;
var=( (100/2) * 3 );

References

http://www.funtoo.org/wiki/Awk_by_Example,_Part_1
http://www.math.utah.edu/docs/info/gawk_7.html