grep
、sed
和awk
被称为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或b | love|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)文本插入
标签:shell,匹配,sed,file,grep,txt,替换,三剑客 From: https://blog.csdn.net/weixin_43612842/article/details/141598598# 插入行:在`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