Filter Log Entries Using Extended Regex with grep -E
📖 Scenario: You have a system log file with various entries. You want to find all lines that mention either error or warning messages using a single command.
🎯 Goal: Build a bash script that uses grep -E with an extended regular expression to filter lines containing either error or warning from a log file.
📋 What You'll Learn
Create a variable logfile with the exact filename system.log
Create a variable pattern with the exact extended regex 'error|warning'
Use grep -E with $pattern and $logfile to filter matching lines
Print the filtered lines to the terminal
💡 Why This Matters
🌍 Real World
System administrators often need to scan log files for errors or warnings quickly. Using extended regex with grep helps filter relevant lines efficiently.
💼 Career
Knowing how to use grep with extended regex is a fundamental skill for troubleshooting and monitoring systems in IT and DevOps roles.
Progress0 / 4 steps
1
Create the log file variable
Create a variable called logfile and set it to the string system.log.
Bash Scripting
Hint
Use single quotes around the filename to assign it as a string.
2
Create the extended regex pattern variable
Create a variable called pattern and set it to the extended regex string 'error|warning'.
Bash Scripting
Hint
Use single quotes to keep the pipe character literal in the regex pattern.
3
Use grep -E with the pattern and logfile
Write a command using grep -E with the variables $pattern and $logfile to filter lines containing either 'error' or 'warning'.
Bash Scripting
Hint
Use double quotes around variables to preserve their values in the command.
4
Print the filtered lines
Run the command to print the filtered lines containing 'error' or 'warning' from system.log.
Bash Scripting
Hint
Make sure your system.log file contains lines with 'error' and 'warning' to see output.
Practice
(1/5)
1. What does the grep -E command do in bash scripting?
easy
A. Runs grep with extra debugging information
B. Enables extended regular expressions for more powerful pattern matching
C. Executes grep in encrypted mode
D. Searches only for exact string matches without regex
Solution
Step 1: Understand grep basic function
grep searches text for patterns. By default, it uses basic regex.
Step 2: Role of -E option
The -E option enables extended regex, allowing special characters like +, ?, | without backslashes.
Final Answer:
Enables extended regular expressions for more powerful pattern matching -> Option B
Quick Check:
grep -E = extended regex enabled [OK]
Hint: Remember: -E means extended regex, more pattern power [OK]
Common Mistakes:
Confusing -E with debugging or encryption
Thinking -E disables regex
Assuming -E is for exact string match only
2. Which of the following is the correct syntax to search for lines containing either "cat" or "dog" using grep -E?
easy
A. grep -E 'cat|dog' filename
B. grep -E 'cat&dog' filename
C. grep -E 'cat?dog' filename
D. grep -E 'cat+dog' filename
Solution
Step 1: Understand the OR operator in extended regex
The vertical bar | means OR, matching either pattern on left or right.
Step 2: Check each option's pattern
'cat|dog' matches lines with 'cat' or 'dog'. Others (&, ?, +) do not mean OR.
Final Answer:
grep -E 'cat|dog' filename -> Option A
Quick Check:
Use | for OR in grep -E [OK]
Hint: Use | inside quotes for OR patterns with grep -E [OK]
Common Mistakes:
Using & instead of | for OR
Confusing ? or + as OR
Not quoting the pattern
3. Given a file data.txt with the following lines:
apple apples applepie appl apply
What is the output of grep -E 'apple(s|pie)?' data.txt?
medium
A. applepie
B. apple
apples
applepie
appl
apply
C. apples
applepie
D. apple
apples
applepie
Solution
Step 1: Understand the regex pattern 'apple(s|pie)?'
This matches 'apple' followed optionally by either 's' or 'pie'. So it matches 'apple', 'apples', or 'applepie'.
Step 2: Check each line against the pattern
'apple' matches exactly. 'apples' matches 'apple' + 's'. 'applepie' matches 'apple' + 'pie'. 'appl' and 'apply' do not match because they lack the full 'apple' base.
Final Answer:
apple
apples
applepie -> Option D
Quick Check:
Optional group (s|pie)? matches these three lines [OK]
Hint: Remember ? means optional, (a|b) means either a or b [OK]
Common Mistakes:
Assuming partial matches like 'appl' count
Ignoring the optional group ?
Confusing | with + or ?
4. You run the command grep -E colou?r file.txt but it returns no matches, even though the file contains the word "color". What is the likely problem?
medium
A. The pattern is missing the optional character syntax
B. The file does not contain the word "color"
C. The regex should be quoted to prevent shell expansion
D. The pattern is correct but the file encoding is wrong
Solution
Step 1: Check the pattern and shell quoting
The pattern 'colou?r' uses ? to make 'u' optional, matching 'color' or 'colour'.
Step 2: Identify quoting issue
If the pattern is not quoted, the shell may interpret ?, causing grep to receive a wrong pattern and no matches.
Final Answer:
The regex should be quoted to prevent shell expansion -> Option C
Quick Check:
Always quote regex patterns to avoid shell issues [OK]
Hint: Always quote regex patterns to avoid shell interpreting special chars [OK]
Common Mistakes:
Not quoting regex patterns
Assuming file lacks the word
Blaming file encoding without checking
5. You want to find lines in log.txt that contain either "error", "fail", or "warning" using grep -E. Which command correctly matches these words as whole words only?
hard
A. grep -E '\b(error|fail|warning)\b' log.txt
B. grep -E '(error|fail|warning)' log.txt
C. grep -E '\<(error|fail|warning)\>' log.txt
D. grep -E '[error|fail|warning]' log.txt
Solution
Step 1: Understand word boundaries in extended regex
\b marks word boundaries, ensuring the pattern matches whole words only.
Step 2: Analyze each option
grep -E '\b(error|fail|warning)\b' log.txt uses \b around the group, correctly matching whole words. grep -E '(error|fail|warning)' log.txt matches substrings inside words. grep -E '\<(error|fail|warning)\>' log.txt uses \< and \> which are not standard in grep -E. grep -E '[error|fail|warning]' log.txt uses character class [] incorrectly, matching any single character from the set.
Final Answer:
grep -E '\b(error|fail|warning)\b' log.txt -> Option A
Quick Check:
Use \b for whole word matching in grep -E [OK]
Hint: Use \b to match whole words in grep -E patterns [OK]
Common Mistakes:
Using character classes [] instead of grouping ()
Not using word boundaries \b
Using non-standard boundary markers like \< or \>
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.