Awk is a flexible pattern matching, text processing and line-oriented language, Linux provides us with an implementation version of it, gawk.
We can use the awk or gawk command to demonstrate. Awk is a symbolic link to gawk:
OPTIONS
Here are some common options for gawk command:
Option |
Meaning |
-f program-file or ‑‑file program-file |
Reads the gawk execution script from the file. |
-F fs or ‑‑field-separator fs |
Specifies the value of the predefined variable FS. Use this value as the delimiter for the column. |
-v var=val or ‑‑assign var=val |
Assign the value val to the variable var. |
VARIABLES, RECORDS AND FIELDS
Here are some common built-in variables for gawk command:
Option |
Meaning |
ARGC |
The number of command-line arguments. |
ARGV |
Command line argument array. |
FNR |
The number of records from the current input file. |
FS |
The field separator for input content; the default is a space. |
NF |
The number of fields from the input. |
NR |
The number of records from the input. |
OFS |
The field separator for output content; the default is a space. |
ORS |
The record separator for output content; the default is a newline. |
RS |
The record separator for input content; the default is a newline. |
PATTERNS AND ACTIONS
Here are some common patterns and actions for gawk command:
PATTERNS
Option |
Meaning |
BEGIN |
Print once at the beginning. |
END |
Print once at the end. |
/regular expression/ |
Executes a regular expression for each line of content. |
relational expression |
Performs operator calculations on each line of content. |
pattern && pattern or pattern || pattern or ! pattern |
Performs logical operations on each line of content. |
pattern ? pattern : pattern |
Performs a ternary operation on each line of content. |
pattern1, pattern2 |
Start with the pattern1-matched row until the pattern2-matched row. |
ACTIONS
Option |
Meaning |
{} |
Everything in parentheses are executable statements. |
Operators
Option |
Meaning |
$N |
Refers to the Nth field. |
++ – |
Auto-increment and auto-decrement. |
+ - ~ |
Plus, minus, and negation. |
* / % |
Multiplication, division, and modulus. |
space |
String concatenation. |
< > <= >= == != |
Relational operators. |
&& || |
Logical AND and OR. |
?: |
Ternary operator. expr1 ? expr2 : expr3. |
= += -= *= /= %= ^= |
Assignment. |
I/O Statements
Option |
Meaning |
print |
Outputs the current record, ending with the value defined by the built-in variable ORS. |
printf |
Output formatted content. |
The printf Statement
Option |
Meaning |
%a, %A |
A hexadecimal floating point number. |
%c |
A single character. |
%d, %i |
The integer part of a decimal number. |
%e, %E |
A floating point number. |
%o |
An unsigned octal number. |
%u |
An unsigned decimal number. |
%s |
A character string. |
%x, %X |
An unsigned hexadecimal number. |
Examples
Run Program Only
Output Argument Count
With the ARGC variable, we can get the number of command-line arguments:
1
|
awk 'BEGIN{print ARGC}' # Print the command line argument count
|
Output Argument Value
With the ARGV variable, we can get the value of the command-line argument:
1
|
awk 'BEGIN{print ARGV[0]}' # Print the command line first argument value
|
Output Integer Variable
1
|
awk 'BEGIN{var=123;print var}' # Print the self-defined integer variable
|
Output Integer Variables Summation
We can obtain the summation of two integer variables before the output:
1
|
awk 'BEGIN{var=123;var2=321;print var+var2}' # Print the summation of these two integer variable
|
Output String Variable
1
|
awk 'BEGIN{var="abc";print var}' # Print the self-defined string variable
|
Use the Input Stream as Content
Awk can also handle content from the input stream:
1
2
|
ll /
ll / | awk '{print $1}'
|
Handle File Content
As well as dealing with the content from the file.
Let’s prepare some test content first:
1
2
3
4
5
6
7
8
|
printf '%s\n' \
'user1:10020:10010:Dong Chen:/bin/bash:active' \
'user2:10021:10010:Dong Chen1:/bin/bash:inactive' \
'user3:10022:10010:Dong Chen2:/bin/bash:active' \
'user4:10023:10010:Dong Chen3:/bin/bash:inactive' \
'user5:10024:10010:Dong Chen4:/bin/bash:active' \
'user6:10025:10010:Dong Chen5:/bin/bash:inactive' > awk_file
cat awk_file
|
The BEGIN and END patterns will only print once:
1
|
awk -F: 'BEGIN{print "HEADER"}END{print "FOOTER"}{print $1,$2,$3,$4,$5}' awk_file
|
Output With A Customized Field Separator
Through -v argument, we can customize the output field separator’s variable OFS:
1
|
awk -v OFS=', ' -F: '{print $1, $4, $2, $3, $5}' awk_file
|
Output Formatted Content
Through printf command and its formats, we can print formatted content:
1
|
awk -F: '{printf "User Account: %s, Username: %s, User ID: %d, Group ID: %d, Login Shell: %s\n", $1, $4, $2, $3, $5}' awk_file
|
If Else Ternary Operation
We can use a ternary operator to do conditional statement operations:
1
|
awk -F: '($6=="active" ? status="Working hard" : status="Lazy"){printf "%s is %s.\n", $1, status }' awk_file
|
References
The GNU Awk User’s Guide,
GAWK(1)
Buy me a coffee