一、正则表达式
正则表达式是一种用于描述字符串模式的强大工具,是文本过滤和处理的灵魂。
1. 普通正则表达式
| 元字符 | 功能与说明 | 示例 |
|---|---|---|
^ | 行首锚定 | ^hello 匹配以 hello 开头的行 |
$ | 行尾锚定 | world$ 匹配以 world 结尾的行 |
. | 匹配任意一个字符(除换行符) | h.llo 匹配 hello, hallo 等 |
* | 匹配前一个字符0次或多次 | go*d 匹配 gd, god, good 等 |
.* | 匹配任意长度的任意字符(贪婪模式) | h.*d 匹配 h 和 d 之间的任何内容 |
[] | 字符集合,匹配集合中的任意一个字符 | [abc] 匹配 a, b, 或 c |
[^] | 反向字符集合,匹配不在集合中的任意一个字符 | [^0-9] 匹配任意非数字字符 |
\ | 转义字符,使特殊字符失去特殊意义 | \. 匹配字面意义的点号 . |
\< \> | 词首、词尾锚定 | \<the\> 精确匹配单词 the |
\{n,m\} | 区间表达式,匹配前一个字符n到m次 | o\{2,3\} 匹配 oo 或 ooo |
注意:在普通正则中,{ }, ( ), +, ?, | 这些字符都被视为普通字符,要使用其特殊功能需要加 \ 转义。
2. 扩展正则表达式
扩展正则表达式增加了更多元字符,功能更强,书写更简洁。使用 grep -E 或 egrep。
| 元字符 | 功能与说明 | 示例 |
|---|---|---|
+ | 匹配前一个字符1次或多次 | go+d 匹配 god, good 等,但不匹配 gd |
? | 匹配前一个字符0次或1次 | colou?r 匹配 color 和 colour |
| | 或,匹配其中之一的分支 | (grep|sed|awk) 匹配 grep, sed 或 awk |
() | 分组,将一个或多个字符视为一个整体 | (abc)+ 匹配 abc, abcabc 等 |
{} | 区间表达式,用法同普通正则,但无需转义 | o{2,3} 匹配 oo 或 ooo |
核心区别:在扩展正则中,+, ?, |, (), {} 可以直接使用,无需再加 \ 转义。
二、文本处理三剑客
1. grep - 全局搜索正则表达式并打印
功能:在文件中搜索匹配模式的文本行。
基本语法:grep [选项] "模式" 文件...
常用选项:
-i:忽略大小写-v:反向选择,显示不匹配的行-n:显示匹配行的行号-c:只统计匹配行的数量-E:使用扩展正则表达式(等同于egrep)-r或-R:递归搜索目录下的文件-l:只列出包含匹配模式的文件名-w:匹配整个单词-A n:显示匹配行及其后n行 (After)-B n:显示匹配行及其前n行 (Before)-C n:显示匹配行及其前后各n行 (Context)
示例:
# 在文件中搜索包含 "root" 的行
grep "root" /etc/passwd
# 忽略大小写搜索 "linux"
grep -i "linux" file.txt
# 使用扩展正则,搜索 "error" 或 "fail"
grep -E "(error|fail)" /var/log/syslog
# 统计包含 "GET" 请求的日志行数
grep -c "GET" access.log
# 显示匹配行及之后2行
grep -A 2 "panic" system.log
2. sed - 流编辑器
功能:用于对输入流(文件或管道)执行基本的文本转换(查找、替换、删除、插入等)。它是按行处理的。
基本语法:sed [选项] '地址命令 [参数]' 文件...
常用选项:
-n:静默模式,仅显示处理后的行(常与p命令连用)-i:直接修改原文件(危险操作,务必先测试)-e:指定多个编辑命令
常用命令:
s:替换,最常用的命令。s/旧模式/新模式/标志p:打印d:删除a:在指定行后追加文本i:在指定行前插入文本
地址(定址):
n:第n行$:最后一行n,m:从第n行到第m行/模式/:匹配该模式的行- 不指定地址则默认处理所有行
示例:
# 将文件中的 "apple" 全部替换为 "orange" (只输出到屏幕,不修改文件)
sed 's/apple/orange/g' file.txt
# 直接修改原文件(-i)
sed -i 's/apple/orange/g' file.txt
# 只替换每行中第一个 "apple"
sed 's/apple/orange/' file.txt
# 删除所有空白行
sed '/^$/d' file.txt
# 删除第3到5行
sed '3,5d' file.txt
# 仅打印包含 "world" 的行(-n 抑制默认输出,p 命令打印匹配行)
sed -n '/world/p' file.txt
# 在第2行后插入一行 "This is inserted"
sed '2a This is inserted' file.txt
# 多个操作:替换并删除空行
sed -e 's/foo/bar/g' -e '/^$/d' file.txt
3. awk - 模式扫描与处理语言
功能:一个强大的文本分析工具和编程语言,尤其适合处理结构化文本(如CSV、日志等)。它按字段处理数据。
基本语法:awk '模式 { 动作 }' 文件...
核心概念:
- 记录:默认一行就是一条记录 (
RS)。 - 字段:默认以空格或制表符分隔的每一列 (
FS)。字段名:$1,$2, …$NF。$0代表整行。
内置变量:
FS:输入字段分隔符,默认为空格OFS:输出字段分隔符,默认为空格RS:输入记录分隔符,默认为换行符ORS:输出记录分隔符,默认为换行符NF:当前记录的字段数量NR:当前处理的行号(记录号)FNR:当前文件的记录号(处理多个文件时与NR不同)
示例:
# 打印文件每一行的第一列和第三列
awk '{print $1, $3}' file.txt
# 打印文件的行数
awk 'END {print NR}' file.txt
# 打印包含 "bash" 的行
awk '/bash/ {print $0}' /etc/passwd
# 使用冒号作为分隔符,打印 /etc/passwd 的用户名和UID
awk -F: '{print $1, $3}' /etc/passwd
# 打印字段数大于2的行
awk 'NF > 2' file.txt
# 打印第一列的总和(假设第一列是数字)
awk '{sum += $1} END {print "Sum:", sum}' data.txt
# 使用 BEGIN 和 END 块
awk 'BEGIN {FS=":"; OFS="--"} {print $1, $3} END {print "Processing Complete"}' /etc/passwd
# 条件判断:如果第三列大于1000,则打印整行
awk -F: '$3 > 1000 {print $0}' /etc/passwd
总结与对比
| 工具 | 主要功能 | 处理单位 | 核心用途 | 类比 |
|---|---|---|---|---|
grep | 查找 | 行 | 快速过滤出包含特定模式的行 | 搜索 |
sed | 编辑 | 行 | 对文本进行查找替换、删除、插入等编辑 | 替换/编辑 |
awk | 分析 | 行和字段 | 处理结构化文本,报告生成,数据计算 | 编程/分析 |
黄金法则:
- 简单的查找用
grep。 - 对文本进行直接的替换、删除用
sed。 - 文本有清晰的结构(列),需要报告、计算、重组用
awk。 - 它们可以完美地通过管道
|组合使用,例如grep ... | sed ... | awk ...。
Comments NOTHING