Awk: Difference between revisions
Jump to navigation
Jump to search
Line 15: | Line 15: | ||
cat FILE |
cat FILE |
||
# <configuration buildProperties="" description="" id="some_id.1525790178" name="some_name" parent="some_parent"> |
# <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 |
# some_id.1525790178 |
||
perl -lne 'print $1 if /<configuration .* id="([^"]*)" name="some_name"/' FILE |
|||
# some_id.1525790178 |
# some_id.1525790178 |
||
</source> |
</source> |
Revision as of 08:36, 30 March 2017
References
- An Awk Primer (good tutorial on Awk)
- GAWK: Effective AWK Programming (gawk.pdf from package gawk-doc)
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
andARGV
:
awk ’BEGIN {
for (i = 0; i < ARGC; i++)
print ARGV[i]
}’ inventory-shipped BBS-list