Table of Contents
- Introduction
- Foundations: Why Advanced Text Manipulation Matters
- Advanced
grep: Beyond Simple Pattern Matching - Advanced
sed: Stream Editing Mastery - Advanced
awk: Data Processing and Analysis - Combining Tools: Pipes,
xargs, and Workflows - Practical Examples
- Conclusion
- References
Foundations: Why Advanced Text Manipulation Matters
Basic text commands (e.g., grep "error" log.txt) work for simple tasks, but real-world scenarios demand more:
- Parsing logs with multi-line entries.
- Cleaning CSVs with commas inside quoted fields.
- Aggregating data (e.g., counting unique users from a log).
- Automating edits across thousands of files.
Advanced techniques let you handle these scenarios without writing full-fledged scripts, leveraging bash’s built-in power for speed and simplicity.
Advanced grep: Beyond Simple Pattern Matching
grep searches for patterns in text, but its advanced flags and regex support make it a Swiss Army knife for text extraction.
Extended and Perl-Compatible Regular Expressions
By default, grep uses basic regular expressions (BRE), which require escaping special characters like +, ?, or (). Use extended regex (-E) or Perl-compatible regex (-P) for unescaped syntax and advanced features like lookarounds.
Example 1: Extended Regex (-E)
Extract emails (simplified pattern):
grep -E -o '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}' contacts.txt
-E: Enable extended regex (no need to escape+or().-o: Output only the matched part (not the entire line).
Example 2: Perl-Compatible Regex (-P) for Lookarounds
Extract text after “User: ” (without including “User: ” itself):
grep -P -o '(?<=User: ).*' audit.log
(?<=User: ): Positive lookbehind assertion (matches “User: ” but excludes it from output).
Contextual Matching and Output Control
Use -A (after), -B (before), or -C (context) to include lines around matches.
Example: Show 2 Lines Before and After “error” in a Log
grep -A 2 -B 2 "error" app.log
Output:
2023-10-01 12:00: Connection established
2023-10-01 12:01: Processing request
2023-10-01 12:02: error: Failed to connect to DB # Matched line
2023-10-01 12:03: Retrying connection...
2023-10-01 12:04: Connection restored
Recursive Search and Exclusion
Search across directories with -r, and exclude files/directories with --exclude or --exclude-dir.
Example: Recursively Search for “TODO” in .txt Files (Excluding node_modules)
grep -r --exclude-dir="node_modules" --include="*.txt" "TODO" ./project
Advanced sed: Stream Editing Mastery
sed (stream editor) modifies text line-by-line. Its advanced features handle multi-line edits, conditional changes, and in-place file modification.
In-Place Editing and Backup
Use -i to edit files in-place. Add a suffix (e.g., -i.bak) to create backups.
Example: Replace “old” with “new” in file.txt (with Backup)
sed -i.bak 's/old/new/g' file.txt # Creates file.txt.bak before editing
Multi-Line Operations
sed processes one line at a time by default, but commands like N (append next line), D (delete pattern space), and P (print first line of pattern space) handle multi-line patterns.
Example: Replace “hello\nworld” with “hello world”
sed ':a; N; $!ba; s/hello\nworld/hello world/g' file.txt
:a: Define labela.N: Append next line to pattern space (now holds two lines).$!ba: If not at end of file ($!), branch to labela(loop until all lines are read).s/hello\nworld/hello world/g: Replace the multi-line pattern.
Hold Space and Pattern Space
sed has two buffers:
- Pattern space: Temporary buffer for the current line.
- Hold space: Persistent buffer for storing data between lines.
Commands like h (copy pattern space to hold space), H (append pattern space to hold space), g (copy hold space to pattern space), and G (append hold space to pattern space) enable complex workflows.
Example: Reverse Lines in a File
sed -n '1!G; h; $p' file.txt
1!G: For all lines except the first, append hold space to pattern space.h: Copy pattern space to hold space.$p: Print the final pattern space (reversed lines).
Conditional Branching
Use if-like logic with /{pattern}/{command} to apply edits only to lines matching a pattern.
Example: Add ” [IMPORTANT]” to Lines Containing “error”
sed '/error/s/$/ [IMPORTANT]/' log.txt
/error/: Target lines with “error”.s/$/ [IMPORTANT]/: Append ” [IMPORTANT]” to the end ($) of those lines.
Advanced awk: Data Processing and Analysis
awk is a full-featured programming language for text processing, ideal for structured data (e.g., logs, CSVs) and aggregation.
Associative Arrays for Aggregation
awk supports associative arrays (key-value pairs), perfect for counting, grouping, or summing data.
Example: Count Unique IP Addresses in a Log
Given access.log lines like:
192.168.1.1 - - [10/Oct/2023] "GET /" 200
10.0.0.2 - - [10/Oct/2023] "POST /api" 201
192.168.1.1 - - [10/Oct/2023] "GET /about" 200
Count unique IPs:
awk '{ip=$1; count[ip]++} END {for (i in count) print i, count[i]}' access.log
ip=$1: Extract the first field (IP address).count[ip]++: Increment the count for that IP.END {for (i in count) print i, count[i]}: After processing all lines, print IPs and their counts.
User-Defined Functions
awk lets you define custom functions for reusability.
Example: Function to Capitalize Strings
awk '
function capitalize(str) {
return toupper(substr(str,1,1)) tolower(substr(str,2))
}
{print capitalize($0)}' names.txt
capitalize(str): Takes a string, capitalizes the first character, and lowercases the rest.{print capitalize($0)}: Apply the function to every line ($0).
Handling Complex Delimiters (e.g., CSVs with Quoted Fields)
By default, awk splits fields on whitespace, but FPAT (Field Pattern) defines how to识别 fields (e.g., quoted CSV fields with commas inside).
Example: Parse CSV with Quoted Fields
Given data.csv:
Name,Age,City
"Doe, John",30,"New York"
"Smith, Jane",25,"Los Angeles"
Extract “City” for each row:
awk -v FPAT='([^,]+)|("[^"]+")' '{print $3}' data.csv
-v FPAT='([^,]+)|("[^"]+")': Define fields as either non-comma text or quoted text.
Multi-Line Record Processing
Use RS (Record Separator) to define multi-line records (e.g., logs with entries spanning lines).
Example: Process Multi-Line Log Entries (Delimited by ”====”)
awk -v RS="====" '{print "Entry: " NR "\n" $0 "\n---"}' multi_line_logs.txt
RS="====": Split records on ”====” instead of newlines.NR: Current record number.
Combining Tools: Pipes, xargs, and Workflows
The true power of bash text manipulation lies in combining tools with pipes (|), which pass output from one command to another. xargs converts output into command arguments, enabling bulk operations.
Example: Find Log Files, Extract IPs, Count Unique Addresses
find ./logs -name "*.log" | xargs grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort | uniq -c
find: Locate log files.xargs grep: Pass filenames togrepto extract IPs.sort | uniq -c: Sort IPs and count unique occurrences.
Practical Examples
Log Analysis: Extracting and Counting IP Addresses
Goal: From access.log, count how many times each IP accessed /api.
grep "/api" access.log | awk '{print $1}' | sort | uniq -c | sort -nr
grep "/api": Filter lines with “/api”.awk '{print $1}': Extract IP (first field).sort | uniq -c: Count unique IPs.sort -nr: Sort counts numerically in reverse (highest first).
CSV Data Cleaning: Fixing Quoted Fields
Goal: Remove quotes from data.csv (e.g., "Doe, John" → Doe, John).
sed 's/"//g' data.csv > cleaned_data.csv
Text Transformation: Formatting Report Output
Goal: Convert raw data into a formatted table.
Given stats.txt:
user1 100
user2 200
user3 150
Format as a table:
awk 'BEGIN {print "| User | Score |\n|------|-------|"} {printf "| %-5s | %-5d |\n", $1, $2}' stats.txt
Output:
| User | Score |
|------|-------|
| user1 | 100 |
| user2 | 200 |
| user3 | 150 |
Conclusion
Advanced text manipulation in bash transforms you from a casual user to a power user. By mastering grep, sed, awk, and their combinations, you can automate complex tasks, process large datasets, and extract insights with minimal effort. Practice with real-world files (logs, CSVs) to internalize these techniques—you’ll be surprised how often they solve daily challenges.
References
- GNU
grepManual - GNU
sedManual - GNU
awkManual - RegexOne (Learn regular expressions)
- Sed & Awk, 2nd Edition (O’Reilly Media)
- TLDR Pages (Simplified command references)