Linux文本处理三剑客(grep/sed/awk):30 个实用 grep 示例大全
Linux文本处理三剑客(grep/sed/awk):30 个实用 grep 示例大全
ZhangCurryLinux文本处理三剑客(grep/sed/awk):30 个实用 grep 示例大全
| 工具 | 核心功能 | 适用场景 |
|---|---|---|
| grep | 文本搜索、过滤 | 快速查找关键词、日志分析 |
| sed | 批量替换、删除、插入 | 配置文件修改、数据清洗 |
| awk | 结构化数据处理、统计计算 | 报表生成、列操作、数值分析 |
grep(Global Regular Expression Print)用于在文件中搜索匹配特定模式的行,支持正则表达式,是快速定位信息的利器。
# grep命令语法速查表
| 语法类型 | 命令格式 | 功能说明 | 注意事项 |
|---|---|---|---|
| 基础搜索 | grep 搜索字符串 文件名 |
在单个文件中搜索指定字符串 | 区分大小写 |
| 多文件搜索 | grep 搜索字符串 文件1 文件2 文件3 |
在多个文件中同时搜索 | 文件列表以空格分隔 |
| 多关键词搜索 | grep '关键词1 关键词2' 文件名 |
搜索同时包含多个关键词的行 | 必须用引号包裹含空格的字符串 |
| 带选项搜索 | grep [选项] 搜索字符串 文件名 |
通过选项控制搜索行为 | 常用选项: -i忽略大小写 -v反向匹配 -n显示行号 |
| 正则表达式搜索 | grep 正则表达式 文件名``grep [选项] 正则表达式 文件名 |
使用正则模式进行高级搜索 | 基础正则(BRE)与扩展正则(ERE)语法不同 |
| 多模式匹配 | `grep ‘模式1 | 模式2’ 文件名` | 匹配满足任一模式的文本行 |
| 管道搜索 | ps aux |
grep -E 正则表达式` | 对其他命令的输出结果进行过滤 |
# 30个示例分别如下:
*1.搜索匹配字符串*
grep命令最基础的用法是在文件中查找特定字符串,新建一个名为customers.txt的文本文件,内容如下(后续示例演示):
1 | [root@localhost ~]# cat customers.txt |
以下的grep命令将在customers.txt文件中搜索字符串“Zhang”。如果搜索的字符串存在于文件中,那么包含该字符串的行将被打印出来。
1 | [root@localhost ~]# grep Zhang customers.txt |
以下的grep命令将在customers.txt文件中搜索文本“Snei Ali”,如果搜索的文本存在于文件中,那么包含该文本的行将被打印出来。
1 | [root@localhost ~]# grep 'Snei Ali' customers.txt |
*2.仅搜索不匹配的字符串*
grep命令的-v选项用于从文件中搜索不匹配的字符串。在本例中,使用带有-v选项的grep命令从在第一个示例中创建的“customers.txt”文件中搜索不匹配的字符串。
下面搜索“customers.txt”文件中不包含字符串“Shadow”的那些行,并打印出来:
1 | [root@localhost ~]# grep -v Shadow customers.txt |
*3.不区分大小写的字符串搜索*
grep命令默认以区分大小写的方式从文件中搜索字符串。使用grep命令的-i选项可以以不区分大小写的方式从文件中搜索字符串。
以下带有-i选项的grep命令将搜索“customers.txt”文件中包含字符串“nodles”的那些行。如果文件中存在一行或多行包含该字符串(其中字母可以是大写或小写),那么该行将被打印出来:
1 | [root@localhost ~]# grep -i nodles customers.txt |
*4.仅搜索整个单词*
grep命令的-w选项用于以区分大小写的方式从文件中搜索整个单词。在本例中,带有-w选项的grep命令被用于从在第一个示例中创建的“customers.txt”文件中搜索整个单词。
以下grep命令将搜索文本文件中包含字符串“Sn”的那些行。如果文件的任何一行包含字符串“Sn”,那么该行将被打印出来:
1 | [root@localhost ~]# grep Sn customers.txt |
*5.在当前目录中搜索多个文件*
grep命令用于在文件中搜索特定内容,并且可以根据搜索字符串或模式在当前目录中搜索多个文件。在本例中,展示了如何使用“*”通配符在当前目录中搜索多个文件,以“customers.txt”文件为例。
以下grep命令将搜索当前目录中包含单词“test”的文件。当前目录中包含单词“test”的文件名及其包含该单词的行将被打印出来:
1 | [root@localhost myapp]# grep -w test * |
*6.在目录中递归搜索*
grep命令的-r选项用于在目录中递归搜索特定的字符串或模式。在本例中,展示了如何使用grep命令在当前目录及其子目录中递归搜索包含单词“test”的文件,以“customers.txt”文件为例。
以下命令将显示当前目录中的所有文件和文件夹:
下面grep命令将递归搜索当前目录及其子目录中包含单词“test”的文件。所有包含单词“test”的文件及其包含该单词的行将被打印出来:
1 | [root@localhost myapp]# grep -r test * |
*7.不使用文件名搜索*
-h或--no-filename选项与grep命令一起使用,用于在不使用文件名的情况下搜索特定的字符串或模式。如果当前目录中只有一个文件,这个选项非常有用。本例展示了如何使用grep命令在不使用文件名的情况下进行搜索。先查看当前目录和文件内容:
1 | [root@localhost temp]# ls |
然后用grep命令搜索“products.txt”文件中包含单词“Laptop”的那些行,并打印这些行:
1 | [root@localhost temp]# grep -h Laptop * |
*8.在输出中添加行号*
grep命令的-n选项用于在搜索结果中打印文件的行号。在本例中,带有-n选项的grep命令被用于显示在第一个示例中创建的“customers.txt”文件的搜索结果,并附带行号。
比如,用grep命令将搜索并打印包含字符串“ow”的那些行,并附带行号,这样,文件中包含字符串“ow”的行将被打印出来:
1 | [root@localhost myapp]# grep -n 'ow' customers.txt |
*9.使用通配符匹配单个字符*
在正则表达式中,. 通配符用于匹配任意单个字符。当需要搜索的单词部分字符未知时,可用该符号构建匹配模式。以下示例演示如何在 customers.txt 文件中使用此通配符。
用grep命令将搜索并打印文件中包含 5 个字符且以Sn开头的单词customers.txt行。此处,模式中使用了两个点 (.) 来表示两个单个字符:
1 | [root@localhost myapp]# grep -w 'Sn..' customers.txt |
当改成三个点时,没有匹配到:
1 | [root@localhost myapp]# grep -w 'Sn...' customers.txt |
*10.使用通配符匹配零次或多次*
在grep命令中,*(星号)通配符用于匹配字符串或模式零次或多次。本例展示了如何在“customers.txt”文件中使用该通配符来匹配任意字符串零次或多次。
这里先修改一下”customers.txt”文件内容:
1 | [root@localhost myapp]# cat customers.txt |
下面用grep命令将搜索文本文件中包含字符串“+8613”的行,以及该字符串后以“9”开头的任何字符串,匹配可以出现零次或多次。结果打印如下:
1 | [root@localhost myapp]# grep '+8613*9' customers.txt |
*11.使用通配符匹配一次或多次*
在grep命令中,+(加号)通配符用于匹配字符串或模式零次或多次。
如下:
1 | # 需启用扩展正则(-E),匹配至少一个 "o" |
- 匹配:
god,good - 不匹配:
gd(无o)
*12.使用通配符匹配确切的次数*
在模式中使用大括号{}并指定数字n,可以用来在文件中精确匹配某个特定字符串出现的次数。本例展示了如何在“customers.txt”文件中使用带数字的大括号{}来精确匹配模式。
使用通配符精确匹配指定次数:
在模式中使用大括号{}并指定数字n,可以用来在文件中精确匹配某个特定字符串出现的次数。本例展示了如何在“customers.txt”文件中使用带数字的大括号{}来精确匹配模式。
下面用grep命令将搜索文本文件中恰好包含三个数字(且这两个数字在1到3之间)的行。符合该模式的文件行将被打印出来:
1 | [root@localhost myapp]# grep -E '[1-3]{3}' customers.txt |
*13.在匹配行之后打印特定数量的行*
grep命令的-A或--after-context选项与数字值一起使用,可以打印文件中匹配字符串或模式之后的特定行数。
下面grep命令将显示“customers.txt”文件中包含字符串“yoyo”的行,以及匹配行之后的两行。如果文件中没有任何一行与字符串“yoyo”匹配,则不会生成任何输出:
1 | [root@localhost myapp]# grep -i -A 2 'yoyo' customers.txt |
*14.在匹配行之前打印特定数量的行*
带有数值的 -B 或 –before-context 用于打印文件中找到的匹配字符串或模式之前的特定行数。
以下grep命令将显示包含字符串 ‘yoyo‘ 的行和匹配行前的一行。如果文件的任何行都与字符串 ‘yoyo‘ 匹配,则不会生成任何输出:
1 | [root@localhost myapp]# grep -i -B 1 'yoyo' customers.txt |
*15.在匹配行之后和之前打印特定数量的行*
带有数值的 -C 选项用于打印文件中找到的匹配字符串或模式前后的特定行数。
下面的grep 命令将显示包含字符串 ‘Zhang‘ 的行,在匹配行之前一行,在匹配行之后一行。如果文件的任何行都与字符串 ‘Zhang‘ 匹配,则不会生成任何输出。
1 | [root@localhost myapp]# grep -i -C 1 'Zhang' customers.txt |
*16.使用中括号 [] 匹配特定数字*
可以在 “grep” 命令的正则表达式模式中使用中括号 [] 来定义特定数字的范围。
用grep命令将搜索文本文件中包含 3 到 5 范围数字的行,将打印与模式匹配的文件行:
1 | [root@localhost myapp]# grep '[3-5]' customers.txt |
用grep 命令将搜索文本文件中包含 3 到 5 范围内的两位数字的那些行。将打印与模式匹配的文件行:
1 | [root@localhost myapp]# grep -E '[3-5]{2}' customers.txt |
*17.使用中括号 [] 匹配具有特定字符的模式*
通过中括号[]可以灵活匹配特定字符或字符范围。在正则表达式中,使用中括号可以:
- 匹配指定范围内的任意单个字符
- 精准匹配括号内列出的特定字符
下面用grep命令匹配以 yo 开头,第三个字符为 a 到 y 之间的任意字母的所有满足条件的行:
1 | [root@localhost myapp]# grep 'yo[a-y]' customers.txt |
下面用grep命令搜索包含’S’或’s’的行:
1 | [root@localhost myapp]# grep '[Ss]' customers.txt |
下面用grep命令搜索包含字符串SN或Sn或sN或sn的行:
1 | [root@localhost myapp]# grep '[Ss][Nn]' customers.txt |
*18.使用[:alnum:]字符类匹配字母和数字*
[:alnum:]是正则表达式中的预定义字符类,用于匹配所有字母(大小写)和数字(0-9),其功能等同于[A-Za-z0-9]。
下面命令将匹配文件中所有包含连续3个字母或数字字符的行(需配合-E启用扩展正则):
1 | [root@localhost myapp]# grep -E '[[:alnum:]]{3}' customers.txt |
*19.使用[:alpha:]字符类匹配纯字母字符*
[:alpha:]是正则表达式中的预定义字符类,专门用于匹配所有字母字符(包括大小写),功能等同于[A-Za-z]。
以下命令将匹配文件中所有包含连续5个字母字符的行(需配合-E启用扩展正则):
1 | grep -E '[[:alpha:]]{5}' customers.txt |
假设customers.txt内容为:
1 | Alice Engineer |
运行命令后输出:
1 | Alice Engineer |
Bob123因含数字、Dave@因含符号被排除。
*20.使用[:digit:]字符类匹配纯数字字符*
[:digit:]是正则表达式中的预定义字符类,专门用于匹配所有数字字符(0-9),功能等同于[0-9]。
以下命令将匹配文件中所有包含至少1个数字字符的行(需配合-E启用扩展正则):
1 | grep -E '[[:digit:]]' customers.txt |
假设customers.txt内容为:
1 | 用户A 电话: 13800138000 |
运行命令后输出:
1 | 用户A 电话: 13800138000 |
仅包含纯文本的行被自动过滤。
*21.使用[:lower:]字符类匹配小写字母*
[:lower:] 是正则表达式预定义的字符类,专门用于匹配所有小写字母(a-z),功能等同于 [a-z]。
以下命令将匹配文件中所有包含至少1个小写字母的行(需配合 -E 启用扩展正则):
1 | grep -E '[[:lower:]]' customers.txt |
假设 customers.txt 内容为:
1 | USER ADMIN |
运行命令后输出:
1 | user guest |
仅包含纯大写字母、数字或中文的行被过滤。
*22.使用[:print:]字符类匹配可打印字符*
[:print:] 是正则表达式中的预定义字符类,用于匹配所有可打印字符(包括字母、数字、空格、标点符号等,但不包含控制字符)。
下面命令将匹配文件中所有包含至少1个可打印字符的行(需配合 -E 启用扩展正则):
1 | grep -E '[[:print:]]' customers.txt |
假设 customers.txt 内容包含控制字符(如^M、\t等不可见字符):
1 | 正常文本行 |
运行命令后输出:
1 | 正常文本行 |
控制字符^M所在行被过滤。
*23.使用[:space:]字符类匹配空白字符*
[:space:] 是正则表达式预定义的字符类,专门用于匹配所有空白字符(包括空格、制表符\t、换行符\n等)。
先新建 demo.txt 文件,内容如下:
1 | WelcomeToHaopython |
下面命令将匹配文件中所有含空白字符的行:
1 | [root@localhost myapp]# grep -E '[[:space:]]' demo.txt |
*24.从行首开始匹配*
在正则表达式中,脱字符(^) 用于用于匹配行首的特定字符或字符串。
以下命令将精确匹配以数字4开头的行:
1 | [root@localhost myapp]# grep '^4' customers.txt |
*25.匹配到行尾*
在正则表达式中,美元符号($) 用于精确匹配行尾的特定字符或字符串。
下面的 “grep” 命令将搜索文件中以字符串 ‘99‘ 结尾customers.txt行。
1 | [root@localhost myapp]# grep '99$' customers.txt |
*26.使用正则表达式模式拼接(Concatenation)进行匹配*
在正则表达式中,可以通过**点号(.)**拼接多个模式,实现更灵活的匹配。
下面用grep命令搜索文件中以字母 N 或 S 开头,中间包含任意字符(. 匹配除换行符外的任意字符),以字母 Y 或 y 结尾的行:
1 | [root@localhost myapp]# grep -e '[NS].*[Yy]' customers.txt |
*27.交替匹配*
grep 支持通过 交替符(|) 实现逻辑”或”匹配,允许在单次搜索中查找多个指定模式。
下面用 grep 命令将在 customers.txt 文件中搜索字符串 ‘yoyo‘ 或 ‘Snow‘。在这里,反斜杠 (\) 与竖线 (|) 一起使用以执行交替任务。
1 | [root@localhost myapp]# grep 'yoyo\|Snow' customers.txt |
*28.使用反向引用*
grep 支持通过 反向引用 功能匹配重复出现的模式。该功能通过 \( \) 捕获分组,并用 \1、\2 等引用已匹配的内容。
下面grep命令将在 customers.txt 文件中搜索 0 到 5 范围内的任何数字。如果找到任何匹配项,它将保留引用,并使用反向引用与文件的其余部分匹配。
1 | [root@localhost myapp]# grep '\([0-5]\)\1' customers.txt |
*29.通过管道组合 ps 与 grep 命令*
在 Linux 系统中,ps(process status)命令用于查看运行中的进程状态,而通过管道符 | 将其输出传递给 grep,可以快速过滤目标进程。
先查看所有运行中的进程:
1 | [root@localhost ~]# ps |
过滤以 bash 结尾的进程
1 | [root@localhost ~]# ps | grep -E 'bash$' |
*30.结合 grep 与 awk 提取特定字段*
grep 擅长文本搜索,而 awk 擅长结构化文本处理。通过管道组合二者,可实现「精准搜索+字段提取」的高效操作。
下面grep命令将在 customers.txt 文件中搜索字符串 ‘Ali‘,并将输出发送到 “awk” 命令,该命令将从匹配的行打印格式化的输出(字段以Tab分隔):
1 | [root@localhost myapp]# cat customers.txt |



