Advanced Bash Scripting
awk
Bash Hybrid
This guide demonstrates how to combine the power of awk with Bash to process delimited text files. We’ll compare a pure awk script to a Bash/awk hybrid, then progressively build a reusable salary‐benchmarking tool.
Why Bash-AWK Hybrids?
- Pure awk scripts are concise for text processing.
- Embedding awk inside Bash adds flexibility (variables, flags, CLI args).
- Shebangs (
#!/usr/bin/env …
) let you run scripts directly.
Pure awk Script (salary.awk
)
#!/usr/bin/env awk -f
BEGIN {
FS = "|"
}
{
print $2, $3
}
Bash Script Embedding awk (print_names.sh
)
#!/usr/bin/env bash
awk -F "|" '{
print $2, $3
}'
You can run either script by:
chmod +x print_names.sh
./print_names.sh < employees.txt
Or invoke awk directly:
awk -f salary.awk employees.txt
Preparing the Data Source
Our employees.txt
file uses |
as the field separator and contains:
Column No | Field | Description |
---|---|---|
1 | Employee ID | Unique identifier |
2 | First name | Given name |
3 | Last name | Family name |
4 | Department | Department name |
5 | Job title | Position title |
6 | Contact email | |
7 | Salary | Annual salary (USD) |
Note
Set the field separator with -F
or FS
to split on |
.
Salary Thresholds
Threshold Variable | Criteria |
---|---|
high_salary | Salary ≥ 90000 (high earners) |
low_salary | Salary ≤ 65000 (potential bumps) |
1. Basic One-Liner
Print first name, last name, and salary for every employee:
awk -F "|" '{ print $2, $3, $7 }' employees.txt
Output:
Kriti Shreshtha 60000
Rajasekar Vasudevan 75000
Debbie Miller 80000
Enrique Rivera 65000
Feng Lin 90000
Andy Luscomb 95000
Mark Crocker 85000
Jing Ma 100000
2. Filter by Salary Range
Use -v
to pass thresholds into awk:
awk -F "|" \
-v high_salary=90000 \
-v low_salary=65000 \
'$7 >= high_salary || $7 <= low_salary {
print $2, $3, $7
}' employees.txt
This shows both high and low earners in one stream.
3. Add a Header with BEGIN
Introduce a one-time header via BEGIN
:
awk -F "|" \
-v high_salary=90000 \
-v low_salary=65000 \
-v header="==== Salary Adjustments ====" \
'BEGIN { print header }
$7 >= high_salary || $7 <= low_salary {
print $2, $3, $7
}' employees.txt
4. Wrap into a Bash Script (salary.sh
)
For readability and reuse, move the awk call into a Bash script:
#!/usr/bin/env bash
awk -F "|" \
-v high_salary=90000 \
-v low_salary=65000 \
-v header="==== Salary Adjustments ====" '
BEGIN {
print header
}
$7 >= high_salary || $7 <= low_salary {
print $2, $3, $7
}
' < employees.txt
Make it executable and run:
chmod +x salary.sh
./salary.sh
5. Separate “Up” and “Down” Sections (salary-v2.sh
)
Print distinct headers for high and low salaries:
#!/usr/bin/env bash
awk -F "|" \
-v high_salary=90000 \
-v low_salary=65000 \
-v up_header="===== Needs to be adjusted up =====" \
-v down_header="===== Needs to be adjusted down =====" '
$7 >= high_salary {
print down_header
print $2, $3, $7
}
$7 <= low_salary {
print up_header
print $2, $3, $7
}
' < employees.txt
6. One Header per Group (salary-v3.sh
)
Use flags inside awk to avoid repeating headers:
#!/usr/bin/env bash
awk -F "|" \
-v high_salary=90000 \
-v low_salary=65000 \
-v up_header="===== Needs to be adjusted up =====" \
-v down_header="===== Needs to be adjusted down =====" '
$7 <= low_salary {
if (!printed_up_header) {
print up_header
printed_up_header = 1
}
print $2, $3, $7
}
$7 >= high_salary {
if (!printed_down_header) {
print down_header
printed_down_header = 1
}
print $2, $3, $7
}
' < employees.txt
7. Parameterize with CLI Arguments (salary-v4.sh
)
Allow users to override thresholds when running the script:
#!/usr/bin/env bash
readonly UP_HEADER="===== Needs to be adjusted up ====="
readonly DOWN_HEADER="===== Needs to be adjusted down ====="
high_salary="${1:-90000}"
low_salary="${2:-65000}"
awk -F "|" \
-v high_salary="$high_salary" \
-v low_salary="$low_salary" \
-v up_header="$UP_HEADER" \
-v down_header="$DOWN_HEADER" '
$7 >= high_salary {
if (!printed_down_header) {
print down_header
printed_down_header = 1
}
print $2, $3, $7
}
$7 <= low_salary {
if (!printed_up_header) {
print up_header
printed_up_header = 1
}
print $2, $3, $7
}
' < employees.txt
Run with defaults:
chmod +x salary-v4.sh
./salary-v4.sh
Or specify custom thresholds:
./salary-v4.sh 80000 60000
Next Steps
You’ve now explored:
- Pure awk vs Bash/awk hybrids
- Using
-v
to pass variables into awk - Conditional headers with
BEGIN
and internal flags - Parameterizing scripts via CLI
Practice customizing these scripts for different file formats, field counts, or more complex filtering logic.
References
Watch Video
Watch video content
Practice Lab
Practice lab