Awk: Difference between revisions

From miki
Jump to navigation Jump to search
Line 41: Line 41:
</source>
</source>
* '''Pass command-line parameters''' - Awk variables can be defined directly on the invocation line:
* '''Pass command-line parameters''' - Awk variables can be defined directly on the invocation line:
<source lang="awk">
<source lang="bash">
awk -v myvar=123 'BEGIN { printf "myvar is %d\n",myvar }' # Use -v (before program text) for var used in BEGIN section
awk -v myvar=123 'BEGIN { printf "myvar is %d\n",myvar }' # Use -v (before program text) for var used in BEGIN section
echo foo | awk '{ printf "myvar is %d\n",myvar }' myvar=123 # Otherwise specify var after program text
echo foo | awk '{ printf "myvar is %d\n",myvar }' myvar=123 # Otherwise specify var after program text
Line 47: Line 47:
* '''Pass command-line parameters''' - Awk defines the variables <code>ARGC</code> and <code>ARGV</code>:
* '''Pass command-line parameters''' - Awk defines the variables <code>ARGC</code> and <code>ARGV</code>:
<source lang="awk">
<source lang="awk">
BEGIN {
awk ’BEGIN {
for (i = 0; i < ARGC; i++)
for (i = 0; i < ARGC; i++)
print ARGV[i]
print ARGV[i]
}
}’ inventory-shipped BBS-list
</source>
</source>
* '''<code>$0</code> is the whole line'''
* '''<code>$0</code> is the whole line'''

Revision as of 07:57, 22 September 2017

References

Awk Program Examples

ps al | awk '{print $2}'                                         # Print second field of ps output
arp -n 10.137.3.129|awk '/ether/{print $3}'                      # Print third field of arp output, if line contains 'ether' somewhere
getent hosts unix.stackexchange.com | awk '{ print $1 ; exit }'  # Print only first line, then exit
find /proc -type l | awk -F"/" '{print $3}'                      # Print second folder name (i.e. process pid)

Example of parsing an XML file (and comparing with perl):

cat FILE
#        <configuration buildProperties="" description="" id="some_id.1525790178" name="some_name" parent="some_parent">
awk -F "[= <>\"]+" '/<configuration / { if ($8 == "some_name") print $6 }' FILE
# some_id.1525790178
perl -lne 'print $1 if /<configuration .* id="([^"]*)" name="some_name"/' FILE
# some_id.1525790178

Tips

  • Defining environment variable - Using an Awk script and Bash builtin eval
eval $(awk 'BEGIN{printf "MY_VAR=value";}')
echo $MY_VAR
  • Hexadecimal conversion - Use strtonum to convert parameter:
{
    print strtonum($1);       # decimal, octal or hexa (guessed from prefix)
    print strtonum("0"$2);    # To force octal
    print strtonum("0x"$3);   # To force hexadecimal
}
  • Using environment variables - Use ENvIRON["NAME"]:
{ print strtonum("0x"ENVIRON["STARTADDR"]); }
  • Pass command-line parameters - Awk variables can be defined directly on the invocation line:
awk -v myvar=123 'BEGIN { printf "myvar is %d\n",myvar }'     # Use -v (before program text) for var used in BEGIN section
echo foo | awk '{ printf "myvar is %d\n",myvar }' myvar=123   # Otherwise specify var after program text
  • Pass command-line parameters - Awk defines the variables ARGC and ARGV:
BEGIN {
  for (i = 0; i < ARGC; i++)
  print ARGV[i]
}
  • $0 is the whole line
# Concatenate DNS
/^A\?/{print record; record=$0} 
/^A /{record=record " " $0;} 
END {print record}
  • 'String concatenation — simply line up the string without operator.
print "The result is " result;