📖 Scenario: You work in a small IT team that manages server logs. You want to extract specific parts of log entries to analyze them quickly.
🎯 Goal: Build a Bash script that uses capture groups with regular expressions to extract the date and error message from a log entry.
📋 What You'll Learn
Create a variable with a sample log entry string
Create a regular expression pattern with capture groups for date and error message
Use Bash's regex matching to extract the date and error message
Print the extracted date and error message
💡 Why This Matters
🌍 Real World
Extracting parts of log files helps IT teams quickly analyze errors and events.
💼 Career
Many system administrators and DevOps engineers use Bash scripts with regex to automate log analysis.
Progress0 / 4 steps
1
Create a log entry variable
Create a variable called log_entry and set it to the string "2024-06-15 ERROR Disk space is low".
Bash Scripting
Hint
Use double quotes to assign the string to log_entry.
2
Create a regex pattern with capture groups
Create a variable called pattern and set it to the regex string '([0-9]{4}-[0-9]{2}-[0-9]{2}) ERROR (.+)' which captures the date and error message.
Bash Scripting
Hint
The pattern uses parentheses to capture the date and the error message separately.
3
Use regex matching to extract capture groups
Use an if statement with [[ $log_entry =~ $pattern ]] to match the pattern. Inside the if, assign date=${BASH_REMATCH[1]} and error_msg=${BASH_REMATCH[2]} to get the captured groups.
Bash Scripting
Hint
Use BASH_REMATCH array to access capture groups after matching.
4
Print the extracted date and error message
Use echo to print the date and error_msg variables on separate lines.
Bash Scripting
Hint
Use two echo commands to print each variable on its own line.
Practice
(1/5)
1. What does the BASH_REMATCH array hold after a successful regex match in Bash?
easy
A. The full matched string at index 0 and captured groups from index 1 onwards
B. Only the captured groups without the full match
C. The regex pattern used for matching
D. The exit status of the last command
Solution
Step 1: Understand BASH_REMATCH usage
When using [[ string =~ regex ]], Bash stores the full matched text in BASH_REMATCH[0].
Step 2: Identify captured groups storage
Captured groups from parentheses in the regex are stored starting at BASH_REMATCH[1] onwards.
Final Answer:
The full matched string at index 0 and captured groups from index 1 onwards -> Option A
Quick Check:
BASH_REMATCH = full match + groups [OK]
Hint: Remember index 0 is full match, groups start at 1 [OK]
Common Mistakes:
Thinking BASH_REMATCH holds only groups
Confusing BASH_REMATCH with exit status
Expecting regex pattern in BASH_REMATCH
2. Which of the following is the correct syntax to test if a string matches a regex and capture groups in Bash?
easy
A. match $string $regex
B. if ($string =~ $regex); then
C. [[ $string =~ $regex ]]
D. test $string =~ $regex
Solution
Step 1: Recall Bash regex match syntax
Bash uses the conditional expression [[ string =~ regex ]] to test regex matches.
Step 2: Identify correct syntax among options
Only [[ $string =~ $regex ]] uses the correct Bash syntax with double brackets and the =~ operator.
Final Answer:
[[ $string =~ $regex ]] -> Option C
Quick Check:
Use [[ ]] with =~ for regex match [OK]
Hint: Use double brackets [[ ]] with =~ for regex matching [OK]
Common Mistakes:
Using single brackets [ ] which don't support =~
Using parentheses () like in other languages
Using commands like test or match incorrectly
3. What will be the output of this Bash script?
string="user:1234" if [[ $string =~ ([a-z]+):([0-9]+) ]]; then echo "Name=${BASH_REMATCH[1]}, ID=${BASH_REMATCH[2]}" fi
medium
A. Name=user, ID=1234
B. Name=user:1234, ID=
C. Name=, ID=
D. Syntax error
Solution
Step 1: Analyze regex and string
The regex ([a-z]+):([0-9]+) matches letters before colon and digits after colon in the string "user:1234".
Step 2: Check captured groups in BASH_REMATCH
BASH_REMATCH[1] captures "user" and BASH_REMATCH[2] captures "1234".
Final Answer:
Name=user, ID=1234 -> Option A
Quick Check:
Captured groups print correct values [OK]
Hint: Captured groups appear in BASH_REMATCH starting at index 1 [OK]
Common Mistakes:
Expecting full string in BASH_REMATCH[1]
Forgetting to use double brackets [[ ]]
Misreading regex pattern
4. Identify the error in this Bash snippet:
string="abc123" if [[$string =~ ([a-z]+)([0-9]+)]]; then echo "${BASH_REMATCH[1]} and ${BASH_REMATCH[2]}" fi
medium
A. Regex pattern is invalid
B. Missing spaces inside [[ and ]]
C. BASH_REMATCH is not set by =~ operator
D. Using single brackets instead of double brackets
Solution
Step 1: Check syntax of conditional expression
The conditional expression [[ ... ]] requires spaces after [[ and before ]]. The snippet misses spaces.
Step 2: Confirm regex and BASH_REMATCH usage
The regex is valid and BASH_REMATCH is set correctly when using =~ inside [[ ]].
Final Answer:
Missing spaces inside [[ and ]] -> Option B
Quick Check:
Spaces needed inside [[ and ]] [OK]
Hint: Always put spaces after [[ and before ]] [OK]
Common Mistakes:
Omitting spaces inside [[ ]]
Confusing single [ ] with [[ ]]
Assuming regex pattern is wrong
5. You want to extract the domain and path from a URL string in Bash using capture groups. Which regex and code snippet correctly captures domain and path?
url="https://example.com/path/to/page" if [[ $url =~ https://([^/]+)(/.*) ]]; then echo "Domain: ${BASH_REMATCH[1]}" echo "Path: ${BASH_REMATCH[2]}" fi
hard
A. Captures domain and path but misses https:// prefix
B. BASH_REMATCH does not support multiple groups
C. Fails because regex does not escape dots
D. Correctly captures domain as example.com and path as /path/to/page
Solution
Step 1: Analyze regex pattern
The regex https://([^/]+)(/.*) matches 'https://' literally, then captures domain (any chars except '/') and path (slash followed by anything).
Step 2: Check BASH_REMATCH usage
BASH_REMATCH[1] holds domain, BASH_REMATCH[2] holds path, correctly extracted from the URL.
Final Answer:
Correctly captures domain as example.com and path as /path/to/page -> Option D
Quick Check:
Regex groups extract domain and path correctly [OK]
Hint: Use ([^/]+) for domain and (/.*) for path [OK]
Common Mistakes:
Not escaping dots in regex (not needed inside character class)
Assuming BASH_REMATCH can't hold multiple groups
Missing literal https:// in regex
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.