Chapter 08Lesson 01~75 minutes

grep and Regular Expressions in Automation

`grep` is both a text filter and a Boolean probe. Reliable automation depends on knowing which role you need, how grep reports no-match versus error, and when a literal string is safer than a regular expression.

BeginnerText processingHands-on lab

Learning objectives

By the end of this lesson

  • Use grep as a filter and as a predicate.
  • Distinguish fixed strings from regular expressions.
  • Interpret grep exit status correctly.
  • Search repositories without parsing display decoration.
  • Preserve filename boundaries in search workflows.

1. grep is both a filter and a predicate

grep reads text, selects lines matching a pattern, and communicates the result through exit status. That makes it useful both in pipelines and directly inside if.

printf '%s\n' \
  'INFO api ready' \
  'WARN cache slow' \
  'ERROR worker failed' |
grep '^ERROR'
StatusMeaningAutomation interpretation
0At least one selected line matchedTreat as success/true
1No selected line matchedUsually a normal negative result
>1An error occurredTreat as an operational failure

2. Use -q when only the Boolean result matters

-q suppresses normal match output, leaving exit status as the interface.

if grep -q '^STATUS=READY$' app.env; then
  printf 'ready\n'
else
  status=$?
  if (( status == 1 )); then
    printf 'not ready\n'
  else
    printf 'grep failed: %d\n' "$status" >&2
  fi
fi

3. Use fixed-string mode for literal data

When the search value is literal data rather than a regular expression, grep -F prevents regex metacharacters from changing the meaning.

needle='api[blue].example.com'
grep -F -- "$needle" hosts.txt
Pattern boundary

Do not feed arbitrary data into a regular expression when literal matching is the real requirement.

4. Use -E for extended regular expressions

Extended regular expressions make alternation and grouping easier to read.

grep -E '^(INFO|WARN|ERROR)[[:space:]]+[a-z0-9.-]+' app.log

5. Anchors and POSIX character classes clarify intent

RegexMeaningUse
^Start of lineUseful for prefixes
$End of lineCombine with ^ for full-line validation
[[:digit:]]Digit classPortable character class
[[:space:]]Whitespace classBroader than a literal space
printf '%s\n' 200 404 500 abc |
grep -E '^[[:digit:]]{3}$'

6. Recursive repository search

Recursive search is useful for CI policy checks and repository audits.

grep -RFn --exclude-dir=.git -- 'TODO_SECURITY' .
Human output

Filename and line-number decoration is excellent for diagnostics, but do not treat it as a durable machine protocol.

7. Context options help humans diagnose failures

grep -n -C 2 'ERROR' app.log

-A, -B, and -C change output shape, so keep them out of machine-parsed data flows.

8. Preserve filename boundaries

When filenames are part of the workflow, let a filename-safe producer define the records.

find . -type f -name '*.conf' -print0 |
while IFS= read -r -d '' file; do
  if grep -qF -- 'deprecated_option=' "$file"; then
    printf 'deprecated setting in %q\n' "$file"
  fi
done

9. Hands-on lab: CI error gate

mkdir -p "$HOME/devops-academy/bash/chapter08/lesson01"
cd "$HOME/devops-academy/bash/chapter08/lesson01"

cat > app.log <<'EOF'
INFO api ready
WARN cache slow
INFO worker ready
ERROR payments failed
EOF

if grep -q '^ERROR' app.log; then
  printf 'gate=FAIL\n'
  grep -n '^ERROR' app.log
else
  status=$?
  if (( status == 1 )); then
    printf 'gate=PASS\n'
  else
    exit "$status"
  fi
fi

Verification checklist

10. Knowledge check

Question 1. What does grep status 1 normally mean?

Question 2. When should you prefer grep -F?

Question 3. What does -q do?

Question 4. Should recursive grep display output be treated as a stable data format?

11. Summary

grep is both a selector and a predicate. Use literal matching when possible, regular expressions when needed, interpret exit status correctly, and preserve data boundaries instead of parsing human-oriented decorations.

12. Further reading

  • GNU grep manual.
  • POSIX grep utility specification.
  • POSIX regular-expression definitions.
  • ShellCheck documentation on quoting and status checks.
Next lesson

cut, paste, tr, sort, uniq, and wc

Continue Chapter 8 by expanding the text-processing toolkit and its reliability rules.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.