Gawk matching

From wikinotes

regex

Used to filter lines, like grep.

echo '
  1920x1080
  foo
  5760x1080
' | awk '$0 ~ /[0-9]+x[0-9]+/ { print $0 }'

match

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

match($0, "searchterm")
if (match($0, "searchterm")) { print "hi" }
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

The matched text is identified using global variables.

RSTART  // the first matching character
RLENGTH // the number of matching characters total

You can extract the value using substr().

echo "abc_def_hij" | awk '{
  success = match($0, "_[a-z]+_");
  if (success) {
    print substr($0, RSTART, RLENGTH);
  }
}'

match-ranges

Similar to sed, awk can operate on ranges between two matches.

# print lines between 'config:' and the end of input
zpool status zroot | awk '/^config:/,/end/ { print $0 }'

Substitution

foo = "/dev/ada0p1"
sub(/p[0-9]+$/, "", $foo)  // search/replace first
gsub(/a/, "b", $foo)       // search/replace all