Linux正则表达式与文本处理工具笔记

一、正则表达式基础

1. 核心概念

正则表达式是一种用于描述字符串模式的规则语言,通过组合普通字符和元字符来定义”模板”,用于文本的模式匹配、查找和替换操作。

2. 元字符分类

元字符功能说明示例
.匹配任意单个字符(除换行符)a.b匹配 “axb”、”a1b”
*匹配前一个字符0次或多次go*d匹配 “gd”、”good”
+匹配前一个字符1次或多次go+d匹配 “god”、”good”
?匹配前一个字符0次或1次go?d匹配 “gd”、”god”
{n}匹配前一个字符恰好n次a{3}匹配 “aaa”
{n,m}匹配前一个字符n到m次a{2,3}匹配 “aa”、”aaa”
^匹配行首^root匹配以root开头的行
$匹配行尾bash$匹配以bash结尾的行
[]字符集合[abc]匹配a、b、c任意一个
[^]排除字符集合[^0-9]匹配非数字字符
``逻辑或
()分组捕获(ab)+匹配多个连续的ab

3. BRE与ERE的区别

基础正则表达式(BRE):默认由grep使用,部分元字符需转义(如+需写为\+扩展正则表达式(ERE):通过grep -Eegrep启用,元字符无需转义,功能更丰富

二、文本处理三剑客

1. grep – 文本搜索工具

基本语法grep [选项] "模式" 文件名常用选项

  • -i:忽略大小写
  • -v:反向匹配(排除指定内容)
  • -n:显示行号
  • -c:统计匹配行数
  • -o:仅输出匹配内容
  • -E:启用扩展正则表达式
  • -A n:显示匹配行及后n行
  • -B n:显示匹配行及前n行
  • -C n:显示匹配行前后各n行

示例

# 查找包含root的行并显示行号
grep -n "root" /etc/passwd

# 统计错误日志中的错误数量
grep -c "error" log.txt

# 忽略大小写查找
grep -i "ERROR" log.txt

2. sed – 流编辑器

基本语法sed [选项] '编辑命令' 文件名常用选项

  • -n:禁止默认输出
  • -i:直接修改文件(慎用)
  • -e:执行多个编辑命令
  • -r:支持扩展正则表达式

核心操作符

  • s:替换文本(最常用)
  • d:删除行
  • p:打印行
  • a:行后追加
  • i:行前插入
  • c:整行替换

示例

# 全局替换old为new
sed 's/old/new/g' file.txt

# 删除空行
sed '/^$/d' file.txt

# 打印第2-5行
sed -n '2,5p' file.txt

# 直接修改文件(备份原文件)
sed -i.bak 's/old/new/g' file.txt

3. awk – 文本分析工具

基本语法awk '条件 {动作}' 文件名内置变量

  • $0:整行内容
  • $1,$2...:第1、2…列字段
  • NF:当前行的字段数
  • NR:当前行号
  • FS:输入字段分隔符(默认空格)
  • OFS:输出字段分隔符

常用选项

  • -F:指定字段分隔符
  • -v:向awk脚本传递变量

示例

# 以冒号分隔,打印第1和第3列
awk -F: '{print $1,$3}' /etc/passwd

# 打印第3列大于1000的行
awk -F: '$3>1000 {print $1}' /etc/passwd

# 统计行数
awk 'END {print NR}' file.txt

# 按列求和
awk '{sum += $1} END {print sum}' file.txt

三、实战案例

案例1:提取网卡IP地址

方法1:grep + awk

ifconfig eth0 | grep "inet addr" | awk -F '[ :]+' '{print $4}'

方法2:awk按行处理

ifconfig eth0 | awk -F '[ :]+' 'NR==2 {print $4}'

方法3:sed多步替换

ifconfig eth0 | sed -n '2p' | sed 's#^.*addr:##g' | sed 's#Bcast.*$##g'

方法4:sed分组提取

ifconfig eth0 | sed -n 's#^.*addr:\(.*\) Bcast.*$#\1#gp'

案例2:提取目录权限数字

方法1:sed + cut

stat /etc | sed -n '4p' | cut -d "(" -f2 | cut -d "/" -f1

方法2:cut按字符截取

stat /etc | sed -n '4p' | cut -d "(" -f2 | cut -c 2-4

方法3:awk多分隔符

stat /etc | awk -F '[(/]' 'NR==4 {print $2}'

方法4:stat直接输出

stat -c %a /etc  # 直接获取数字权限

四、学习建议

  1. 从简单开始:先掌握基础元字符和单个工具的基本用法
  2. 多实践:通过实际案例加深理解,尝试用不同方法解决同一问题
  3. 查阅文档:使用man grepman sedman awk查看详细参数说明
  4. 组合使用:学会将三个工具通过管道|组合使用,发挥最大威力
  5. 注意转义:在BRE模式下注意特殊字符的转义问题

作 者:南烛
链 接:https://www.itnotes.top/archives/1102
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇