正则表达式基础
特殊字符转义
使用反斜杠 ``` 转义特殊字符:”.*?+[]{}()\ $ ^”`
字符匹配
量词
*:匹配前一个元素零次或多次
+:匹配一次或多次
?:匹配零次或一次
{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
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
| sed '2i\This is a new line.' input.txt
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
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
| awk [选项] '[条件]{指令}' 文件
前置指令 | 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
awk -F: '$3 < 3{print}' user
awk -F: '$3 >= 3{print}' user
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:适合复杂的文本分析和格式化输出