Linux文本三剑客的使用及常见重点操作

文本三剑客指 Linux环境下的 grep(搜索)sed(编辑) 、**awk(分析)**三款用于文本处理的核心命令,三者分工明确、功能互补,是处理日志、配置文件、结构化数据等场景的 "刚需工具"。

一、grep(文本搜索)

grep命令的核心定位是文本搜索,可以按照"关键词"或"正则表达式"在数据源中进行行过滤,从而检索到相匹配的行。该命令不修改文本内容,只负责查找内容。

1、命令格式

grep 参数 '<匹配内容>' 文件名

2、常见参数

  • -i: 不区分大小写
  • -n: 显示行号
  • -r: 逐层遍历目录查找
  • -v: 查找不包含指定内容的行,反向选择
  • -E:使用扩展正则匹配
  • ^key:以关键字开头
  • key$:以关键字结尾
  • ^$:匹配空行
  • -w: 按单词搜索
  • -o: 打印匹配关键字
  • -c: 统计匹配到的次数
  • -A: 显示匹配行及后面多少行
  • -B: 显示匹配行及前面多少行
  • -C: 显示匹配行前后多少行
  • -l:只列出匹配的文件名
  • -L:列出不匹配的文件名
  • -e: 使用正则匹配

3、应用示例

bash 复制代码
#忽略大小写匹配包含Error的行
grep -i Error catalog.out

#精确匹配Error单词
grep -w Error catalog.out

#打印匹配到的关键字Error
grep -wo Error catalog.out

#打印匹配到Error关键字的行号
grep -n Error catalog.out

#忽略大小写匹配统计包含关键字Error的行
grep -ni Error catalog.out

#忽略大小写匹配统计包含关键字Error的行数
grep -nic Error catalog.out

#忽略大小写匹配以Error开头的行
grep -i ^Error catalog.out

#匹配以bash结尾的行
grep bash$ /etc/passwd

#匹配空行并打印行号
grep -n ^$ /etc/passwd

#匹配以#号开头的行
grep ^# nginx.conf

#匹配不以#号开头的行
grep -v ^# nginx.conf

#匹配包含Cause关键字及其后5行
grep -A 5 Cause catalog.out

#匹配包含Cause关键字及其前5行
grep -B 5 Cause catalog.out

#匹配包含Cause关键字及其前后5行
grep -C 5 Cause catalog.out

二、sed(文本编辑)

sed是一种流文本编辑工具,专注于按照指定规则批量修改文本(如替换字符、删除、插入等)。编辑文件的时候,会在内存中开辟一块模式空间(缓存空间),以行为单位将文件内容加载到该空间,并在其中进行内容编辑。编辑完成后会默认在当前终端界面打印内容,然后清空缓存 空间里的内容,再来读取第二行内容,依次循环。通过制定选项,才会修改原文件。

1、命令格式

sed 参数 '<匹配条件> 动作' 文件名

sed -i 替换格式 文件名

源数据 | sed -i 替换格式

2、常见参数

  • 空:只展示sed的操作效果,实际上不对文件进行编辑
  • -n:不自动打印所有内容
  • -e:基于命令实现对文件的多点编辑操作
  • -f:从指定文件中读取编辑文件的"匹配条件+动作"
  • -r:支持使用扩展正则表达式
  • -i:表示对文件进行编辑
  • -i.bak:复制文件原内容到备份文件,然后对原文件编辑

3、常见匹配条件

匹配条件分为两种:数字行号或者关键字匹配

数字行号:

  • 空:表示所有行
  • n:表示第n行
  • $:表示末尾行
  • n,m:表示第n到m行内容
  • n,+m: 表示第n到n+m行
  • ~步进:1~2 表示奇数行,2~2 表示偶数行

关键字匹配:

  • '/关键字/'

4、常见动作

  • -a\\text:在匹配到的内容下一行增加内容,支持\n实现多行追加
  • -i\\text:在匹配到的内容当前行增加内容
  • -c\\text:在匹配到的内容替换内容
  • -d|p:删除|打印匹配到的内容
  • -s:替换匹配到的内容
  • W /path/somefile:保存模式匹配的行至指定文件
  • r /path/somefile:读取指定文件的文本至模式空间中
  • =:为模式空间中的行打印行号
  • ! :模式空间中匹配行取反处理

5、常见替换格式

  • '行号s/原内容/替换后内容/列号':替换指定匹配的内容
  • 's/原内容/替换后内容/':替换每行首个匹配内容
  • 's/原内容/替换后内容/g':替换所有匹配的内容
  • '行号s/原内容/&新增内容/列号':替换指定的内容(&符号代表源内容,实现的效果是 '原内容+新内容')
  • '行号a\新增内容':在指定行号的下一行增加内容
  • '行号i\新增内容':在指定行号的当行增加内容
  • '行号d':删除指定行
  • '行号c\内容':替换指定行整行内容
  • '行号r 文件名':替换文件内容到指定行
  • '行号w 文件名':将指定行内容保存到指定文件

6、应用示例

bash 复制代码
#只打印第2行
sed -n '2p' nginx.log

#只打印第1行和第3行
sed -n '1p;3p' nginx.log

#只打印包含Error的行
sed -n '/Error/p' nginx.log

#只打印奇数行
sed -n '1~2p' nginx.log

#只打印偶数行
sed -n '2~2p' nginx.log

#只打印第1行和第3行,-e实现多次文件编辑动作
sed -n -e '1p' -e '3p' nginx.log

#使用sed_cmd.list文件里的匹配条件和动作去编辑文件
sed -n -f sed_cmd.list nginx.log

#取反显示,输出除了第2行以外的其他所有行
sed -n '2!p' nginx.log

#查看内容属于第几行
sed -n '/Error/=' nginx.log

#替换每行的第一个匹配上的xmx为Xmx
sed -i 's/xmx/Xmx/' jvm.conf

#替换文件中所有的xmx为Xmx
sed -i 's/xmx/Xmx/g' jvm.conf

#替换第2行的首个xmx为Xmx
sed -i '2s/xmx/Xmx/#' jvm.conf

#替换每行的第2个xmx为Xmx
sed -i 's/xmx/Xmx/2' jvm.conf

#替换第3行的第2个xmx为Xmx
sed -i '3s/xmx/Xmx/2' jvm.conf

#指定第2行的下一行新增内容test
sed -i '2a\test' jvm.conf

#指定1~3行,每行的下一行都增加内容test
sed -i '1,3a\test' jvm.conf

#指定第2行新增内容test
sed -i '2i\test' jvm.conf

#指定1~3行都增加内容test
sed -i '1,3i\test' jvm.conf

#删除第2行
sed -i '2d' jvm.conf

#删除第1~3行
sed -i '1,3d' jvm.conf

#替换第2行内容为test
sed -i '2c\test' jvm.conf

#替换第1~3行为1行,内容为test
sed -i '1,3c\test' jvm.conf

#将第2行替换为1.txt的文件内容
sed -i '2r 1.txt' jvm.conf

#将第2行内容保存到1.txt中
sed -i '2w 1.txt' jvm.conf

#将第1~3行内容保存到1.txt中
sed -i '1,4w 1.txt' jvm.conf

#查看匹配的内容
sed -n '/send/p' nginx.conf

#查看匹配内容到第8行的内容
sed -n '/send/,8p' nginx.conf

#查看第1行到匹配行的内容
sed -n '1,/send/p' nginx.conf

#查看匹配内容和后三行的内容
sed -n '/send/,+3p' nginx.conf

#通过!p去除空行匹配
sed -n '/^$/!p' nginx.conf

三、awk(文本分析)

awk认为文件中的每一行是一条记录,记录与记录的分隔符为换行符,每一列是一个字段,字段与字段的分隔符默认是一个或多个空格或tab制表符。它的工作方式是逐行读取文本数据,将每一行数据视为一条记录(record),每条记录以字段分隔符分成若干字段,然后输出各个字段的值。然后以查找匹配某个特定模式的文本行,并对这些文本执行制定动作。

简单来说就是按 "行" 和 "字段" 分割文本(默认空格 / 制表符为分隔符),支持条件判断、计算、统计,适合处理日志、CSV 等结构化数据。

1、命令格式

awk 参数 '动作' 文件名

awk 参数 --f 动作文件 var=value 文件名

awk 参数 'BEGIN段 动作 END段' 文件名

  • BEGIN: 在开始处理数据流之前执行,可选项
  • 动作: 如何处理数据流,必选项
  • END: 处理完数据流后执行,可选项

2、常见参数

  • -F:指定列的分隔符,默认一行数据的列分隔符是空格
  • -f:file 指定读取程序的文件名
  • -v:var=value 自定义变量

3、常见动作

  • print:显示内容
  • $0:显示当前行所有内容
  • n:显示当前行的第n列内容,如果存在多个n,它们之间使用逗号隔开

4、常见内置变量

  • FILENAME:当前输入文件的文件名,该变量是只读的
  • NR:指定显示行的行号
  • FNR:多文件时候,分别计数
  • NF:表示字段数量
  • OFS:输出格式的列分隔符,缺省是空格
  • FS:输入文件的列分隔符,缺省是连续的空格和Tab
  • RS:输入记录分隔符,指定输入时的换行符,原换行符($)仍有效
  • ORS:输出记录分隔符,输出时用指定符号代替换行符
  • ARGC|ARGVn:获取命令的参数个数|参数内容

5、应用示例

bash 复制代码
#打印第1列的内容
awk '{print $1}' info.csv

#打印第3列内容
awk '{print $3}' info.csv

#打印最后一列信息
awk '{print $NF}' info.csv

#打印所有内容
awk '{print $0}' info.csv

#打印第列和第3列内容
awk '{print $1,$3}' info.csv

#打印信息时候,合并信息
awk '{print $1$3}' info.csv

#使用\t实现内容的分割,需要用""扩住
awk '{print $1"\t"$3}' info.csv

#打印指定的内容
awk '{print "hello awk"}' info.csv

#打印每列的行号
awk '{print NR,$0}' info.csv

#按照行号打印对应列的内容
awk '{print NR, $NR}' info.csv

#指定行号打印信息
awk 'NR==1 {print NR,$1,$3}' info.csv

#以逗号为列分隔符,打印第2列
awk -F ',' '{print $2}' info.csv
awk -v FS="," '{print $2}' info.csv

#以冒号为列分隔符,打印第1列和第2列
awk -F ',' -v OFS=":" '{print $1,$2}' info.csv
awk -F"," 'BEGIN{OFS=":"} {print $1,$7}' info.csv

#在BEGIN内部同时实现多个环境变量
awk 'BEGIN{-F",";OFS=":"} {print $1,$7}' info.csv

#设置变量,字符串赋值并输出变量值
awk 'BEGIN{name="test";print name}'

#设置变量,数字赋值并输出变量值
awk 'BEGIN{i=10;print i+=1}'

#数值运算
awk 'BEGIN{print 100+3}'
awk 'BEGIN{print 100*3}'
awk 'BEGIN{print 100/3}'

#逻辑运算(输出真假,即1、0)
awk 'BEGIN{print 100>=2 && 100>=3 }'
awk 'BEGIN{print 100>=2 && 1>=100 }'
awk 'BEGIN{print 100>=2 || 1>=100 }'
awk 'BEGIN{print 100>=200 || 1>=100 }'

#文件参与的逻辑运算,输出uid为0或大于1000的用户名
awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

附:正则表达式

在 Linux 中,正则表达式(Regular Expression,简称 regex)是一种用于 模式匹配与文本过滤 的工具,广泛结合 grep、sed、awk 等文本处理命令使用,用于精准查找、替换或提取符合规则的字符串。

1、正则表达式的分类(Linux 中核心两类)

Linux 工具对正则表达式的支持分为 基础正则表达式(BRE) 和 扩展正则表达式(ERE),主要区别在于对部分元字符的支持是否需要转义:

  • 基础正则(BRE):grep(默认)、sed(默认)等工具支持,部分元字符(如 +、?、|)需要用 \ 转义才能生效。
  • 扩展正则(ERE):grep -E(或 egrep)、sed -r、awk 等工具支持,元字符无需转义,直接使用。

2、常用基础元字符与示例(BRE 和 ERE 通用,无需转义)

|--------|-----------------------|-------------------------------------------------------------------------------------|
| 元字符 | 作用 | 示例 |
| ^ | 匹配行首(以指定字符开头的行) | grep "^root" /etc/passwd → 匹配以 root 开头的行 |
| | 匹配行尾(以指定字符结尾的行) | grep "bash" /etc/passwd → 匹配以 bash 结尾的行 |
| . | 匹配任意单个字符(除换行符) | grep "r..t" /etc/passwd → 匹配 r 开头、t 结尾,中间 2 个任意字符的字符串(如 root、rxtt) |
| * | 匹配前面的字符 0 次或多次 | grep "ro*ot" test.txt → 匹配 r 后接任意个 o 再跟 ot(如 rot、root、rooot) |
| \[\] | 匹配字符集中的任意一个字符 | grep "0-9" test.txt → 匹配包含数字的行;grep "a-zA-Z" → 匹配包含字母的行 |
| \^ | 匹配 不在 字符集中的任意一个字符(取反) | grep "\^0-9" test.txt → 匹配不包含数字的行;grep "^\^#" config.conf → 匹配非注释行(非 # 开头) |
| \ | 转义字符(将特殊字符视为普通字符) | grep "a\*b" test.txt → 匹配字符串 a*b(* 被转义为普通字符) |

3、常用扩展元字符(ERE 直接用,BRE 需转义为 \+\? 等)

|------|------------------|---------------------------------------------------------------------------|
| 元字符 | 作用 | 示例(以 ERE 为例) |
| + | 匹配前面的字符 1 次或多次 | grep -E "ro+ot" test.txt → 匹配 r 后接至少 1 个 o 再跟 ot(如 root、rooot,不匹配 rot) |
| ? | 匹配前面的字符 0 次或 1 次 | grep -E "ro?ot" test.txt → 匹配 r 后接 0 个或 1 个 o 再跟 ot(如 rot、root,不匹配 rooot) |
| () | 分组(将多个字符视为一个整体) | grep -E "(ab)+" test.txt → 匹配 ab 连续出现 1 次或多次(如 ab、abab) |
| ` | ` | 逻辑 "或"(匹配多个模式中的一个) |
| {n} | 匹配前面的字符 恰好 n 次 | grep -E "o{2}" test.txt → 匹配包含连续 2 个 o 的字符串(如 oo、root 中的 oo) |
| {n,} | 匹配前面的字符 至少 n 次 | grep -E "o{2,}" test.txt → 匹配包含连续 2 个及以上 o 的字符串(如 oo、ooo) |

4、不同工具中的正则使用差异

  • grep:默认使用 BRE,扩展元字符需转义(如 grep "ro\+ot"),加 -E 选项启用 ERE(如 grep -E "ro+ot"),无需转义。
  • sed:默认使用 BRE(如 sed 's/ro\+ot/xxx/'),加 -r 选项启用 ERE(如 sed -r 's/ro+ot/xxx/')。
  • awk:本身支持 ERE,无需转义(如 awk '/ro+ot/' test.txt)。
相关推荐
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室10 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy13 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕13 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫15 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1116 小时前
linux基础IO
linux·运维·服务器
BelongPanda18 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯18 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983419 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器