📖 Guide
Awk — Complete Reference
Comprehensive awk cheat sheet covering pattern matching, string functions, arrays, control flow, output formatting, and common one-liners.
73 commands across 9 categories
BasicsPattern MatchingBuilt-in VariablesString FunctionsMathematical FunctionsArraysControl FlowOutput FormattingCommon One-liners
Basics
| Command | Description |
|---|---|
awk '{print}' file | Print every line (like cat) |
awk '{print $1}' file | Print the first field of each line |
awk '{print $1, $3}' file | Print first and third fields separated by space |
awk -F: '{print $1}' /etc/passwd | Use colon as field separator |
awk '{print NR, $0}' file | Print line numbers before each line |
awk 'END {print NR}' file | Count total number of lines |
awk '{print $NF}' file | Print the last field of each line |
awk -v var=value '{print var, $1}' filee.g. awk -v threshold=100 '$1 > threshold' data.txt | Pass external variable into awk |
Pattern Matching
| Command | Description |
|---|---|
awk '/pattern/' file | Print lines matching a regex pattern |
awk '!/pattern/' file | Print lines NOT matching a pattern |
awk '$3 > 100' file | Print lines where field 3 is greater than 100 |
awk '$1 == "admin"' file | Print lines where field 1 equals 'admin' |
awk '/start/,/end/' file | Print range of lines between two patterns (inclusive) |
awk '$2 ~ /^[A-Z]/' file | Print lines where field 2 starts with an uppercase letter |
awk '$2 !~ /test/' file | Print lines where field 2 does NOT match 'test' |
awk 'NR>=5 && NR<=10' file | Print lines 5 through 10 |
Built-in Variables
| Command | Description |
|---|---|
NR | Current line (record) number across all files |
NF | Number of fields in the current line |
FS | Input field separator (default: whitespace) |
OFS | Output field separator (default: space) |
RS | Input record separator (default: newline) |
ORS | Output record separator (default: newline) |
FILENAME | Name of the current input file |
FNR | Line number within the current file (resets per file) |
BEGIN {OFS=","} {$1=$1; print}e.g. Reassigning $1=$1 forces awk to rebuild the line with OFS | Reformat output to CSV by setting OFS |
String Functions
| Command | Description |
|---|---|
length($0)e.g. awk '{print length($0)}' file | Return the length of the current line |
substr($1, 2, 5) | Extract substring: field 1, starting at position 2, length 5 |
index($0, "search") | Return position of first occurrence of 'search' in line |
split($0, arr, ":") | Split line by colon into array arr; returns number of elements |
sub(/old/, "new") | Replace first occurrence of pattern in current line |
gsub(/old/, "new") | Replace all occurrences of pattern in current line |
tolower($1) | Convert field 1 to lowercase |
toupper($1) | Convert field 1 to uppercase |
match($0, /[0-9]+/) | Find regex match; sets RSTART and RLENGTH |
Mathematical Functions
| Command | Description |
|---|---|
awk '{sum += $1} END {print sum}' file | Sum all values in field 1 |
awk '{sum += $1} END {print sum/NR}' file | Calculate the average of field 1 |
int(3.9) | Truncate to integer (returns 3) |
sqrt(144) | Square root (returns 12) |
sin(x) / cos(x) / atan2(y,x) | Trigonometric functions (radians) |
log(x) / exp(x) | Natural logarithm and e^x |
srand(); rand() | Seed random generator and get random number between 0 and 1 |
awk 'BEGIN {print 2^10}' | Exponentiation (prints 1024) |
Arrays
| Command | Description |
|---|---|
arr[key] = value | Assign value to associative array |
for (key in arr) print key, arr[key] | Iterate over all array elements |
if (key in arr) | Check if key exists in array |
delete arr[key] | Remove element from array |
delete arr | Delete entire array (GNU awk) |
length(arr) | Return number of elements in array (GNU awk) |
awk '{count[$1]++} END {for (k in count) print k, count[k]}' file | Count occurrences of each unique value in field 1 |
asorti(arr, sorted) | Sort array indices into sorted array (GNU awk) |
Control Flow
| Command | Description |
|---|---|
if (condition) action; else othere.g. awk '{if ($1 > 50) print "high"; else print "low"}' file | Conditional execution |
for (i=1; i<=NF; i++) print $i | C-style for loop (print each field on its own line) |
while (condition) action | While loop |
do { action } while (condition) | Do-while loop (runs at least once) |
nexte.g. awk '/skip/ {next} {print}' file | Skip to the next input line |
exit | Stop processing and run END block |
BEGIN { ... } | Execute before processing any input |
END { ... } | Execute after all input is processed |
Output Formatting
| Command | Description |
|---|---|
printf "%s\t%d\n", $1, $2 | Formatted output with printf (string, integer, newline) |
printf "%10s", $1 | Right-align field in 10-character width |
printf "%-10s", $1 | Left-align field in 10-character width |
printf "%.2f", $1 | Print floating point with 2 decimal places |
print $1 > "output.txt" | Redirect output to a file |
print $1 >> "output.txt" | Append output to a file |
print $1 | "sort -n" | Pipe output to external command |
Common One-liners
| Command | Description |
|---|---|
awk '{print NF}' file | Print number of fields per line |
awk 'NF' file | Remove blank lines (only print lines with fields) |
awk '!seen[$0]++' file | Remove duplicate lines (preserves order) |
awk '{$1=""; print substr($0,2)}' file | Remove the first field from each line |
awk '{line[NR]=$0} END {for (i=NR;i>=1;i--) print line[i]}' file | Reverse file line by line (like tac) |
awk '{for(i=NF;i>=1;i--) printf "%s ",$i; print ""}' file | Reverse the order of fields on each line |
awk -F, '{print $2}' file.csv | Extract second column from a CSV file |
awk 'NR==FNR{a[$1];next} $1 in a' file1 file2 | Print lines from file2 where field 1 appears in file1 |
📖 Free, searchable command reference. Bookmark this page for quick access.