shell文本三剑客(grep、awk、sed)

grepsedawk被称为Linux三剑客,是因为它们在文本处理和数据操作方面极其强大且常用。

Linux三剑客在文件处理中的作用:

  • grep(数据查找定位):文本搜索工具,在文件中搜索符合正则表达式的文本内容,并打印匹配的行。

  • awk(数据切片):文本处理工具,主要用于对结构化数据进行格式化和拆分处理,进行数据统计和报告生成;

  • sed(数据修改):流编辑器,对文本进行插入、删除、替换、提取等操作;

一、grep

grep是一个用于文本搜索的工具,可以在文件中搜索符合正则表达式的文本内容,并打印匹配的行。它简单、快速,是进行文本搜索和过滤的首选工具。

1.1 基本语法

grep [选项参数] pattern [file...]

参数说明:

1)pattern:过滤条件,可以是正则表达式;

2)file:要搜索的文件(一个或多个),若不指定文件,grep 会从标准输入读取。

1.2 grep中正则表达式常用字符

符号功能示例
.匹配除换行符\n之外的任意单个字符a.c可以匹配abc、a1c、a$c 等
^匹配字符串的开头^hello匹配以hello开头的字符串
*匹配前面的字符或子表达式0次或多次ab*c可以匹配ac、abc、abbc等
+匹配前面的字符或子表达式1次或多次ab+c可以匹配abc、abbc、abbbc等,但不匹配ac
?匹配前面的字符或子表达式0次或1次colou?r可以匹配color或colour
[]字符集,匹配方括号中的任意一个字符[abc]匹配a、b或c;[a-Z]匹配任意小写字母
()分组,将括号内的表达式视为一个整体(ab)+匹配一个或多个连续的ab
|选择符,匹配左边或右边的表达式(a|b)c匹配ac或 bc
\转义字符,用于取消特殊字符的含义.匹配.字符本身;\匹配\字符本身
<词首定位符<love
>词尾定位符love>
\ (\)匹配后的标签(love)able\1er
a|b匹配a或blove|hate
x{m}匹配前面的字符恰好m次a{3}b匹配aaab
x{m,}匹配前面的字符至少m次a{2,}b
x{m,n}匹配前面的字符至少m次,但不超过n次a{2,4}b

1.3 grep常用命令 

1)基本搜索

# 搜索文件 file.txt 中包含 karry 的行
grep "Karry" file.txt

2)忽略大小写

# 搜索文件 file.txt 中包含 karry(不区分大小写)的行。
grep -i "karry" file.txt

3)递归搜索目录

# 递归搜索目录 /opt中所有文件,查找包含 pattern 的行
grep -r "pattern"  /opt/

4)显示匹配行号

# 搜索文件 file.txt 中包含 karry 的行,并显示匹配行号
grep -n "Karry" file.txt

5)仅显示匹配文件名

# 搜索当前目录下所有 `.txt` 文件,显示包含 `pattern` 的文件名。
grep -l "pattern" *.txt

6)反向匹配

# 搜索文件 `file.txt` 中不包含 `pattern` 的行。
grep -v "pattern" file.txt

7)显示匹配行及之后的行

# 搜索文件 `file.txt` 中包含 `pattern` 的行,并显示匹配行及之后的 3 行。
grep -A 3 "pattern" file.txt

二、awk

awk是一个强大的文本处理工具,主要用于对结构化数据进行模式扫描和处理,有着强大的文本格式化能力。它支持复杂的操作和脚本编写,能够进行模式匹配、文本处理、数据报告生成等。

awk功能:

  • 字符串处理和替换;

  • 数据统计和报告生成;

  • 复杂的条件判断和循环处理;

  • 数据格式转换。

2.1 基本语法

awk [选项参数] 'pattern { action }' file

参数说明:

1)pattern:匹配的模式,支持正则表达式。

2)action:在匹配模式的行上执行的操作。

2.2 常见的内置变量

内置变量说明
$0表示完整的输入记录
$n表示指定分隔符后,当前指定的第n个字段
FS表示字段输入分隔符,默认以空格为分隔符
OFS表示字段输出分隔符
NF表示字段的个数,即以分隔符分割后,当前行一共有多少个字段
NR表示当前记录数,即行数

2.3 awk常用命令举例

1)基本示例

# 打印文件file.txt的每一行
awk '{ print }' file.txt

2)指定字段分隔符

假设文件内容用逗号分隔,打印第1、第3个字段。(其中  -F  ',' 可以直接简写成-F,)

awk -F ',' '{ print $1, $3 }' file.txt

3)按条件过滤

# 打印第2列字段(age)大于30的人的姓名
awk -F ',' '$2 > 30 { print $1 }' file.txt

三、sed

sed是一个流编辑器,主要用于对文本进行非交互式编辑。它可以进行插入、删除、替换、提取等操作,是文本处理和转换的利器。

功能

  • 文本替换和删除;

  • 模式匹配和文本插入;

  • 支持脚本编写进行复杂的文本处理;

  • 数据流操作。

3.1 基本格式

sed [选项参数] 'script' [file]

参数说明:

1)script:sed 内置的命令字符。主要是用于对文件进行增删改查等操作。

2)file:要处理的输入文件。若不指定文件,sed会从标准输入读取。

3.2 常用选项参数:

常见选项参数说明
-n表示取消默认的sed输出,通常与sed内置命令p一起使用
-e script直接在命令行上添加要执行的sed脚本
-f script-file从脚本文件中读取sed命令
-i 直接修改文件内容,而不是输出到标准输出。如果不加-i,sed修改的是内存数据。
-r使用扩展正则表达式
s将文件视为独立的文件,而不是单一的流

3.3 常用命令举例

1)文本替换

# 基本替换:将`file.txt`中的第一个匹配`Karry`的字符串替换为`Bob`
sed 's/Karry/Bob/' file.txt
# 忽略大小写替换:将`file.txt`中的所有匹配`Karry`的字符串替换为`Bob`
sed 's/Karry/Bob/Ig' file.txt
# 全局替换:将`file.txt`中的所有匹配`Lily`的字符串替换为`karry`
sed 's/Lily/karry/g' file.txt
# 指定行替换:将`file.txt`中的第4行中匹配`Joan`的字符串替换为`Carol`
sed '4s/Joan/Carol/' file.txt
# 行号范围替换:将`file.txt`中的第3到第6行中匹配`KARRY`的字符串替换为`karry`
sed '3,6s/KARRY/karry/Ig' file.txt

使用 sed 进行文本替换时,默认情况下,sed 只是将替换后的文本输出到标准输出(通常是终端),而不会直接修改源文件。只有使用-i参数进行替换,会修改源文件。

# 替换源文件内容:直接在`file.txt`中替换所有匹配`Karry`的字符串为`Bob`,并保存修改(修改源文件)
sed -i 's/Karry/Bob/g' file.txt

#备份原始文件,使用`-i`参数加上备份扩展名来实现,进行替换操作之前会创建一个`file.txt.bak`备份文件
sed -i.bak 's/Karry/Bob/g' file.txt

2)文本删除

# 删除某行:删除`file.txt`中的第5行
sed '3d' file.txt

# 行号范围删除:删除`file.txt`中的第2到第4行。
sed '3,4d' file.txt 

3)文本插入

# 插入行:在`file.txt`中的第2行之前插入`This is a new line.`
sed '2i\This is a new line.' file.txt

# 追加行:在`file.txt`中的第3行之后追加`This is a new line.`
sed '3a\This is a new line.' file.txt 

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值