正则表达式基础

特殊字符转义

使用反斜杠 ``` 转义特殊字符:”.*?+[]{}()\ $ ^”`

字符匹配

  • []:匹配方括号中的任一字符

  • [^]:匹配不在方括号中的任一字符

  • [-]:匹配指定范围内的字符,如 [0-9][a-z]

量词

  • *:匹配前一个元素零次或多次

  • +:匹配一次或多次

  • ?:匹配零次或一次

  • {n}:恰好 n 次

  • {n,}:至少 n 次

  • {n,m}:n 到 m 次

分组和选择

  • ():分组和捕获

  • |:选择符,匹配左边或右边的模式


grep 命令

常用选项

  • -r:递归查找

  • -i:忽略大小写

  • -n:显示行号

  • -E:使用扩展正则表达式

  • -v:反向匹配(不包含模式的行)

基本语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
grep [选项] "模式" 文件名

# 基本查找
grep "hello" file.txt

# 递归查找
grep -r 'ens33' /etc

# 忽略大小写
grep -ir 'ens33' /etc

# 显示行号
grep -irn 'ens33' /etc

# 正则匹配(以ens33结尾)
grep -Er 'ens33$' /etc

# 排除空行和注释行
grep -Ev "^$|^#" file

sed 命令

基本语法

常用操作:替换文本 删除文本 插入和追加文本

1
2
3
4
5
6
sed [选项] '命令' 文件名
# 简单替换
sed 's/old-string/new-string/g' input.txt > output.txt

# 使用正则表达式替换
sed -r '/pattern/s/old_string/new_string/g' input.txt > output.txt
1
2
3
4
5
# 删除包含特定字符串的行
sed '/old-string/d' input.txt > output.txt

# 删除空行
sed '/^$/d' input.txt
1
2
3
4
5
# 在第2行前插入
sed '2i\This is a new line.' input.txt

# 在第2行后追加
sed '2a\This is a new line.' input.txt

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 文件内容示例
cat sed-examp.txt
# hello Jobs
# hello Pony
# hello Jack, hi Jack
# Hi Mike

# 替换Jack为Mark(仅第一个)
sed 's/Jack/Mark/' sed-examp.txt

# 全局替换
sed 's/Jack/Mark/g' sed-examp.txt

# 指定行范围替换
sed '2,3s/hello/Hey/g' sed-examp.txt

# 条件替换
sed '/Pony/s/hello/Hi/g' sed-examp.txt

高级用法

1
2
3
4
5
6
7
8
9
10
# 交换两列内容
echo "Alice 30" | sed 's/\(.*\) \(.*\)/\2 \1/'

# 多条件操作
sed -e '/^$/d' -e '/Pony/d' sed-examp.txt
# 或
sed '/^$/d;/Pony/d' sed-examp.txt

# 直接修改源文件(备份原文件)
sed -i.bak '/^$/d;/Pony/d' sed-examp.txt

awk 命令

基本语法

1
2
3
4
5
# 格式1
awk [选项] '[条件]{指令}' 文件

# 格式2
前置指令 | awk [选项] '[条件]{指令}'

内置变量

  • $0:当前行的全部内容

  • $1, $2, $3...:第1, 2, 3…列

  • NR:当前行号

  • NF:当前行的列数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 测试数据
head /etc/passwd > user

# 基本匹配
awk '/^bin/{print}' user

# 指定分隔符
awk -F: '/^bin/{print $6}' user

# 使用多个变量
awk -F: '/^bin/{print $6, NR, NF}' user

# 条件匹配
awk -F: '/nologin$/{print $1}' user

# 复合分隔符
awk -F '[:/]' '/nologin$/{print $1, $10}' user
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 包含匹配
awk -F: '$6 ~ /root/{print}' user

# 不包含匹配
awk -F: '$6 !~ /root/{print}' user


# 用户ID小于3
awk -F: '$3 < 3{print}' user

# 用户ID大于等于3
awk -F: '$3 >= 3{print}' user

# 用户ID不等于3
awk -F: '$3 != 3{print}' user
1
2
3
4
5
6
7
8
# 与条件
awk -F: 'NR > 3 && $3 > 5{print}' user

# 或条件
awk -F: '$7 ~ /bash/ || NR <= 3' user

# 数学条件(偶数行)
awk -F: 'NR % 2 == 0{print NR, $0}' user

文本处理三剑客各有专长:

  • ​grep​​:适合快速文本搜索和过滤

  • ​sed​​:适合流式文本编辑和转换

  • ​awk​​:适合复杂的文本分析和格式化输出