linux初级_正则表达式与三剑客

TJCcc 发布于 2025-11-16 23 次阅读


一、正则表达式

正则表达式是一种用于描述字符串模式的强大工具,是文本过滤和处理的灵魂。

1. 普通正则表达式

元字符功能与说明示例
^行首锚定^hello 匹配以 hello 开头的行
$行尾锚定world$ 匹配以 world 结尾的行
.匹配任意一个字符(除换行符)h.llo 匹配 hello, hallo
*匹配前一个字符0次或多次go*d 匹配 gd, god, good
.*匹配任意长度的任意字符(贪婪模式)h.*d 匹配 hd 之间的任何内容
[]字符集合,匹配集合中的任意一个字符[abc] 匹配 a, b, 或 c
[^]反向字符集合,匹配不在集合中的任意一个字符[^0-9] 匹配任意非数字字符
\转义字符,使特殊字符失去特殊意义\. 匹配字面意义的点号 .
\< \>词首、词尾锚定\<the\> 精确匹配单词 the
\{n,m\}区间表达式,匹配前一个字符n到m次o\{2,3\} 匹配 ooooo

注意:在普通正则中,{ }, ( ), +, ?, | 这些字符都被视为普通字符,要使用其特殊功能需要加 \ 转义。

2. 扩展正则表达式

扩展正则表达式增加了更多元字符,功能更强,书写更简洁。使用 grep -Eegrep

元字符功能与说明示例
+匹配前一个字符1次或多次go+d 匹配 god, good 等,但不匹配 gd
?匹配前一个字符0次或1次colou?r 匹配 colorcolour
|,匹配其中之一的分支(grep|sed|awk) 匹配 grep, sedawk
()分组,将一个或多个字符视为一个整体(abc)+ 匹配 abc, abcabc
{}区间表达式,用法同普通正则,但无需转义o{2,3} 匹配 ooooo

核心区别:在扩展正则中,+, ?, |, (), {} 可以直接使用,无需再加 \ 转义。


二、文本处理三剑客

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分析行和字段处理结构化文本,报告生成,数据计算编程/分析

黄金法则

  1. 简单的查找grep
  2. 对文本进行直接的替换、删除sed
  3. 文本有清晰的结构(列),需要报告、计算、重组awk
  4. 它们可以完美地通过管道 | 组合使用,例如 grep ... | sed ... | awk ...