Text Processing
Grep Counts
Filtering Matching Lines
grep can count matching lines in a stream. A script can keep the search term in a variable so the same pipeline answers different questions.
Program
Play the script to count matching log lines after choosing the search pattern.
grep_counts.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
log=$'info boot\nwarn disk\nerror fail\ninfo done'
pattern="error"
matches="$(printf '%s\n' "$log" | grep -c "$pattern")"
echo "$pattern:$matches"
#!/usr/bin/env bash
log=$'info boot\nwarn disk\nerror fail\ninfo done'
pattern="warn"
matches="$(printf '%s\n' "$log" | grep -c "$pattern")"
echo "$pattern:$matches"
#!/usr/bin/env bash
log=$'info boot\nwarn disk\nerror fail\ninfo done'
pattern="info"
matches="$(printf '%s\n' "$log" | grep -c "$pattern")"
echo "$pattern:$matches"
log ← info boot, warn disk, error fail, info done
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="error"values this stepinfo boot, warn disk, error fail, info donelogpattern ← error
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="error"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"values this steperrorpatternmatches ← 1
4pattern="error"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"values this step1matcheserrorpatternecho "$pattern:$matches"
5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"outputerror:1values this steperrorpattern1matches
log ← info boot, warn disk, error fail, info done
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="warn"values this stepinfo boot, warn disk, error fail, info donelogpattern ← warn
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="warn"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"values this stepwarnpatternmatches ← 1
4pattern="warn"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"values this step1matcheswarnpatternecho "$pattern:$matches"
5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"outputwarn:1values this stepwarnpattern1matches
log ← info boot, warn disk, error fail, info done
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="info"values this stepinfo boot, warn disk, error fail, info donelogpattern ← info
3log=$'info boot\nwarn disk\nerror fail\ninfo done'4pattern="info"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"values this stepinfopatternmatches ← 2
4pattern="info"5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"values this step2matchesinfopatternecho "$pattern:$matches"
5matches="$(printf '%s\n' "$log" | grep -c "$pattern")"6echo "$pattern:$matches"outputinfo:2values this stepinfopattern2matches
Follow the Count
logcontains four lines:info boot,warn disk,error fail, andinfo done.patternstarts aserror.grep -c "$pattern"counts matching lines.- Only
error failmatches the default pattern. - The script prints
error:1. | pattern | matching lines | output | | --- | --- | --- | | error |error fail| error:1 | | warn |warn disk| warn:1 | | info |info boot,info done| info:2 |
grep -c
`grep -c` prints the number of matching lines instead of the lines themselves.
quoted pattern
Quoting `$pattern` keeps the selected search text as one argument.
pipeline
`printf ... | grep ...` sends generated text directly into the filter.
Exercise: grep_counts.sh
Reproduce error:1, then change pattern to the pinned variants warn and info and predict warn:1 and info:2.