正则表达式(Regular Expression)是一种强大的文本模式匹配工具,用于在字符串中查找、替换符合特定模式的文本。在Linux Shell中,正则表达式常用于grep、sed、awk等工具。
.
- 匹配任意单个字符[abc]
- 匹配a、b或c中的任意一个字符[^abc]
- 匹配除了a、b、c之外的任意字符[a-z]
- 匹配a到z之间的任意小写字母[A-Z]
- 匹配A到Z之间的任意大写字母[0-9]
- 匹配0到9之间的任意数字^
- 匹配行首$
- 匹配行尾\
- 转义字符,用于匹配特殊字符本身*
- 匹配前一个字符0次或多次+
- 匹配前一个字符1次或多次(需使用-E选项)?
- 匹配前一个字符0次或1次(需使用-E选项){n}
- 匹配前一个字符恰好n次{n,}
- 匹配前一个字符至少n次{n,m}
- 匹配前一个字符n到m次基本语法:
grep [选项] "正则表达式" 文件名
常用选项:
- -i
忽略大小写
- -v
反向匹配(显示不匹配的行)
- -E
使用扩展正则表达式(支持+、?、|等)
- -o
只显示匹配的部分
示例:
# 查找包含"error"的行
grep "error" logfile.txt
# 查找以"start"开头的行
grep "^start" file.txt
# 查找包含数字的行
grep "[0-9]" data.txt
# 使用扩展正则表达式查找多个模式
grep -E "error|warning" logfile.txt
基本语法:
sed 's/正则表达式/替换文本/[标志]' 文件名
常用标志:
- g
全局替换
- i
忽略大小写
示例:
# 替换文件中的所有"old"为"new"
sed 's/old/new/g' file.txt
# 删除所有空白行
sed '/^$/d' file.txt
# 将每行开头的数字删除
sed 's/^[0-9]*//' data.txt
awk也支持正则表达式匹配:
# 打印包含"error"的行
awk '/error/ {print}' logfile.txt
# 打印第一个字段匹配模式的行
awk '$1 ~ /^[A-Z]/ {print}' data.txt
grep -E "error|fail|critical" /var/log/syslog
grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" access.log
echo "test@example.com" | grep -E '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$'
for file in *.txt; do mv "$file" "$(echo $file | sed 's/\.txt$/.bak/')"; done
记住,正则表达式需要多加练习才能熟练掌握。开始时可以从简单的模式开始,逐步增加复杂度。