|
|
(16 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| AWK is a scripting language that was originally designed for manipulating tables and
| | A scripting language originally designed for manipulating tables, and simple cli tools. |
| 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 | | | = Tutorials = |
| There are two main variations of the unix coreutils (Gnu/BSD), each has different parameters etc.
| | <blockquote> |
| If you are expecting to use awk across different platforms, make no assumptions.
| | {| class="wikitable" |
| }} | | |- |
| | | official docs || https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents |
| | |- |
| | | awk intro || http://www.funtoo.org/wiki/Awk_by_Example,_Part_1 |
| | |- |
| | | awk intro || http://www.math.utah.edu/docs/info/gawk_7.html |
| | |- |
| | |} |
| | </blockquote><!-- Tutorials --> |
|
| |
|
| = Notes = | | = Notes = |
| <blockquote> | | <blockquote> |
| {| class="wikitable" | | {| |
| |- | | |- |
| | [[gawk usage]] | | | [[gawk usage]] |
| | |- |
| | |} |
| | </blockquote><!-- Notes --> |
| | |
| | = Syntax = |
| | <blockquote> |
| | {| |
| |- | | |- |
| | [[gawk variables]] | | | [[gawk variables]] |
Line 22: |
Line 35: |
| | [[gawk loops]] | | | [[gawk loops]] |
| |- | | |- |
| |} | | | [[gawk print]] |
| </blockquote><!-- Notes -->
| | |- |
| | | | [[gawk matching]] |
| = Syntax =
| |
| <blockquote>
| |
| == Loops ==
| |
| <blockquote>
| |
| <source lang="awk">
| |
| var = 0;
| |
| while ( var < 10 ) {
| |
| print var;
| |
| var += 1;
| |
| }
| |
| </source>
| |
| </blockquote><!-- awk loops -->
| |
| | |
| == print, printf, sprintf ==
| |
| <blockquote>
| |
| {{ expand
| |
| | 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
| |
| | |
| <source lang="bash">
| |
| echo "hello" | awk '{$0,"goodbye"}'
| |
| > hello goodbye
| |
| </source>
| |
| | |
| | |
| $1, $2, $3 etc. prints each entry separated by a token. The default
| |
| token is a single space.
| |
| | |
| <source lang="bash">
| |
| echo "one two three four" | awk '{print $1 $3}'
| |
| > one three
| |
| </source>
| |
| }}
| |
| | |
| {{ expand
| |
| | printf
| |
| | | |
| By default, every print statement is converted to a string.
| |
| printf allows you to control the output type, and the spacing of elements
| |
| | |
| <source lang="awk">
| |
| %s # string
| |
| %f # floating point
| |
| %i # integer
| |
| %E # scientific notation
| |
| %4s # string (padded to 4 characters)
| |
| %.4s # string (max 4 characters, truncated if necessary)
| |
| </source>
| |
| | |
| <source lang="bash">
| |
| echo "one two three" | awk '{ printf( "%10s %5s %-10s %s", $1,$2,$3,"\n" ) }'
| |
| > one two three
| |
| </source>
| |
| | |
| <pre>
| |
| 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
| |
| </pre>
| |
| }}
| |
| | |
| {{ expand
| |
| | 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.
| |
| <source lang="bash">
| |
| echo "8.234" | awk '{var = sprintf("%f", $1); print var}'
| |
| </source>
| |
| }}
| |
| </blockquote><!-- awk print, printf, sprintf -->
| |
| | |
| == split ==
| |
| <blockquote>
| |
| You can't call awk -F from within an awk script. But you can use split
| |
| to tokenize within an awk script.
| |
| | |
| <source lang="awk">
| |
| split("this is my string", a, " ")
| |
| a[1] = this
| |
| a[2] = is
| |
| </source>
| |
| | |
| <syntaxhighlight lang="bash">
| |
| echo "aaa bbb cc/11/22" \
| |
| | awk '{ split($3, a, "/"); print(a[2]); }'
| |
| # 11
| |
| </syntaxhighlight>
| |
| | |
| {{ 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
| |
| }}
| |
| </blockquote><!-- awk split -->
| |
| | |
| == match ==
| |
| <blockquote>
| |
| match checks for a matching string, returns char number if found, otherwise returns a 0
| |
| | |
| <source lang="awk">
| |
| match($0, "searchterm")
| |
| </source>
| |
| | |
| <source lang="bash">
| |
| 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
| |
| </source>
| |
| </blockquote><!-- awk match -->
| |
| | |
| == system ==
| |
| <blockquote>
| |
| Executes a command in shell or cmd from an awk script.
| |
| Assigning to a variable only gives return value (1,0)
| |
| <source lang="awk">
| |
| system(ls -la);
| |
| </source>
| |
| </blockquote><!--awk system-->
| |
| | |
| == math ==
| |
| <blockquote>
| |
| <source lang="awk">
| |
| var+= 1;
| |
| var=( (100/2) * 3 );
| |
| </source>
| |
| </blockquote><!-- awk math -->
| |
| | |
| = References =
| |
| {|
| |
| |- | | |- |
| | http://www.funtoo.org/wiki/Awk_by_Example,_Part_1 | | | [[gawk subprocess]] |
| |- | | |- |
| | http://www.math.utah.edu/docs/info/gawk_7.html
| |
| |} | | |} |
| | | </blockquote><!-- Syntax --> |
| </blockquote><!-- Scripting --> | |