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|ARGV[n]:获取命令的参数个数|参数内容

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)。
相关推荐
我一定会有钱1 小时前
Linux爆音问题解决方法(隔一会会有奇怪噪音)
linux·运维·服务器
Dobby_053 小时前
【Ansible】变量与敏感数据管理:Vault加密与Facts采集详解
linux·运维·云原生·ansible
l_tian_tian_4 小时前
SpringClound——网关、服务保护和分布式事务
linux·服务器·前端
准女婿_4 小时前
优考试局域网系统V6.0.0版
linux·windows·用户运营
我的收藏手册4 小时前
Linux 网络命令大全
linux·服务器·网络
xx.ii5 小时前
28.Linux :通过源代码编译安装lamp
linux·运维·服务器
焊锡与代码齐飞5 小时前
嵌入式第三十五课!!Linux下的网络编程
linux·运维·服务器·开发语言·网络·学习·算法
2501_927773076 小时前
Linux操作系统编程——网络
linux·运维·网络
jiunian_cn6 小时前
【Linux】线程
android·linux·运维·c语言·c++·后端