Linux文本处理三剑客(grep/sed/awk):30 个实用 grep 示例大全

Linux文本处理三剑客(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
2
3
4
5
6
7
8
[root@localhost ~]# cat customers.txt
ID Name Email Phone
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost ~]#

以下的grep命令将在customers.txt文件中搜索字符串“Zhang”。如果搜索的字符串存在于文件中,那么包含该字符串的行将被打印出来。

1
2
3
[root@localhost ~]# grep Zhang customers.txt 
56 Snow Zhang snow@haopython.com +8613161582168
[root@localhost ~]#

以下的grep命令将在customers.txt文件中搜索文本“Snei Ali”,如果搜索的文本存在于文件中,那么包含该文本的行将被打印出来。

1
2
3
[root@localhost ~]# grep 'Snei Ali' customers.txt 
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost ~]#

*2.仅搜索不匹配的字符串*

grep命令的-v选项用于从文件中搜索不匹配的字符串。在本例中,使用带有-v选项的grep命令从在第一个示例中创建的“customers.txt”文件中搜索不匹配的字符串。

下面搜索“customers.txt”文件中不包含字符串“Shadow”的那些行,并打印出来:

1
2
3
4
5
6
7
[root@localhost ~]# grep -v Shadow customers.txt 
ID Name Email Phone
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost ~]#

*3.不区分大小写的字符串搜索*

grep命令默认以区分大小写的方式从文件中搜索字符串。使用grep命令的-i选项可以以不区分大小写的方式从文件中搜索字符串。

以下带有-i选项的grep命令将搜索“customers.txt”文件中包含字符串“nodles”的那些行。如果文件中存在一行或多行包含该字符串(其中字母可以是大写或小写),那么该行将被打印出来:

1
2
3
[root@localhost ~]# grep -i nodles customers.txt 
23 Nodles nodles@haopython.com +8613161582168
[root@localhost ~]#

*4.仅搜索整个单词*

grep命令的-w选项用于以区分大小写的方式从文件中搜索整个单词。在本例中,带有-w选项的grep命令被用于从在第一个示例中创建的“customers.txt”文件中搜索整个单词。

以下grep命令将搜索文本文件中包含字符串“Sn”的那些行。如果文件的任何一行包含字符串“Sn”,那么该行将被打印出来:

1
2
3
4
5
6
7
[root@localhost ~]# grep Sn customers.txt 
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost ~]# grep -w Sn customers.txt
[root@localhost ~]# grep -w Snei customers.txt
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost ~]#

*5.在当前目录中搜索多个文件*

grep命令用于在文件中搜索特定内容,并且可以根据搜索字符串或模式在当前目录中搜索多个文件。在本例中,展示了如何使用“*”通配符在当前目录中搜索多个文件,以“customers.txt”文件为例。

以下grep命令将搜索当前目录中包含单词“test”的文件。当前目录中包含单词“test”的文件名及其包含该单词的行将被打印出来:

1
2
3
4
5
6
7
[root@localhost myapp]# grep -w test *
test1.txt:This is a test file named test1
test2.txt:This is a test file named test2
test3.txt:This is a test file named test3
test4.txt:This is a test file named test4
test5.txt:This is a test file named test5
[root@localhost myapp]#

图片

*6.在目录中递归搜索*

grep命令的-r选项用于在目录中递归搜索特定的字符串或模式。在本例中,展示了如何使用grep命令在当前目录及其子目录中递归搜索包含单词“test”的文件,以“customers.txt”文件为例。

以下命令将显示当前目录中的所有文件和文件夹:

图片

下面grep命令将递归搜索当前目录及其子目录中包含单词“test”的文件。所有包含单词“test”的文件及其包含该单词的行将被打印出来:

1
2
3
4
5
6
7
8
9
10
[root@localhost myapp]# grep -r test *
myshell/mysh1.txt:This is a test file named mysh1
myshell/mysh2.txt:This is a test file named mysh2
myshell/mysh3.txt:This is a test file named mysh3
test1.txt:This is a test file named test1
test2.txt:This is a test file named test2
test3.txt:This is a test file named test3
test4.txt:This is a test file named test4
test5.txt:This is a test file named test5
[root@localhost myapp]#

图片

*7.不使用文件名搜索*

-h--no-filename选项与grep命令一起使用,用于在不使用文件名的情况下搜索特定的字符串或模式。如果当前目录中只有一个文件,这个选项非常有用。本例展示了如何使用grep命令在不使用文件名的情况下进行搜索。先查看当前目录和文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost temp]# ls
products.txt
[root@localhost temp]# cat products.txt
ID Name Price
p-1001 15" Dell Monitor 6000
p-1002 Logitech Wireless Mouse 999
p-1003 1TB Samsung HDD 329
p-1004 Apple Laptop 6049
p-1005 Laptop Table 299
p-1006 Logitec Keyboard 4599
p-1007 HP Pendrive 64GB 599
[root@localhost temp]#

然后用grep命令搜索“products.txt”文件中包含单词“Laptop”的那些行,并打印这些行:

1
2
3
4
[root@localhost temp]# grep -h Laptop *
p-1004 Apple Laptop 6049
p-1005 Laptop Table 299
[root@localhost temp]#

图片

*8.在输出中添加行号*

grep命令的-n选项用于在搜索结果中打印文件的行号。在本例中,带有-n选项的grep命令被用于显示在第一个示例中创建的“customers.txt”文件的搜索结果,并附带行号。

比如,用grep命令将搜索并打印包含字符串“ow”的那些行,并附带行号,这样,文件中包含字符串“ow”的行将被打印出来:

1
2
3
4
[root@localhost myapp]# grep -n 'ow' customers.txt 
2:11 Shadow shadow@haopython.com +8613161582168
5:56 Snow Zhang snow@haopython.com +8613161582168
[root@localhost myapp]#

图片

*9.使用通配符匹配单个字符*

在正则表达式中,. 通配符用于匹配任意单个字符。当需要搜索的单词部分字符未知时,可用该符号构建匹配模式。以下示例演示如何在 customers.txt 文件中使用此通配符。

grep命令将搜索并打印文件中包含 5 个字符且以Sn开头的单词customers.txt行。此处,模式中使用了两个点 (.) 来表示两个单个字符:

1
2
3
[root@localhost myapp]# grep -w 'Sn..' customers.txt 
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168

当改成三个点时,没有匹配到:

1
2
[root@localhost myapp]# grep -w 'Sn...' customers.txt 
[root@localhost myapp]#

图片

*10.使用通配符匹配零次或多次*

grep命令中,*(星号)通配符用于匹配字符串或模式零次或多次。本例展示了如何在“customers.txt”文件中使用该通配符来匹配任意字符串零次或多次。

这里先修改一下”customers.txt”文件内容:

1
2
3
4
5
6
7
8
9
[root@localhost myapp]# cat customers.txt 
ID Name Email Phone
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

下面用grep命令将搜索文本文件中包含字符串“+8613”的行,以及该字符串后以“9”开头的任何字符串,匹配可以出现零次或多次。结果打印如下:

1
2
3
[root@localhost myapp]# grep '+8613*9' customers.txt 
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

*11.使用通配符匹配一次或多次*

grep命令中,+(加号)通配符用于匹配字符串或模式零次或多次。

如下:

1
2
# 需启用扩展正则(-E),匹配至少一个 "o"
grep -E "go+d" file.txt
  • 匹配:god, good
  • 不匹配:gd(无 o

*12.使用通配符匹配确切的次数*

在模式中使用大括号{}并指定数字n,可以用来在文件中精确匹配某个特定字符串出现的次数。本例展示了如何在“customers.txt”文件中使用带数字的大括号{}来精确匹配模式。

使用通配符精确匹配指定次数:

在模式中使用大括号{}并指定数字n,可以用来在文件中精确匹配某个特定字符串出现的次数。本例展示了如何在“customers.txt”文件中使用带数字的大括号{}来精确匹配模式。

下面用grep命令将搜索文本文件中恰好包含三个数字(且这两个数字在1到3之间)的行。符合该模式的文件行将被打印出来:

1
2
3
4
5
6
7
[root@localhost myapp]# grep -E '[1-3]{3}' customers.txt
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost myapp]#

图片

*13.在匹配行之后打印特定数量的行*

grep命令的-A--after-context选项与数字值一起使用,可以打印文件中匹配字符串或模式之后的特定行数。

下面grep命令将显示“customers.txt”文件中包含字符串“yoyo”的行,以及匹配行之后的两行。如果文件中没有任何一行与字符串“yoyo”匹配,则不会生成任何输出:

1
2
3
4
5
6
[root@localhost myapp]# grep -i -A 2 'yoyo' customers.txt 
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*14.在匹配行之前打印特定数量的行*

带有数值的 -B–before-context 用于打印文件中找到的匹配字符串或模式之前的特定行数。

以下grep命令将显示包含字符串 ‘yoyo‘ 的行和匹配行前的一行。如果文件的任何行都与字符串 ‘yoyo‘ 匹配,则不会生成任何输出:

1
2
3
4
5
6
7
[root@localhost myapp]# grep -i -B 1 'yoyo' customers.txt 
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
--
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*15.在匹配行之后和之前打印特定数量的行*

带有数值的 -C 选项用于打印文件中找到的匹配字符串或模式前后的特定行数。

下面的grep 命令将显示包含字符串 ‘Zhang‘ 的行,在匹配行之前一行,在匹配行之后一行。如果文件的任何行都与字符串 ‘Zhang‘ 匹配,则不会生成任何输出。

1
2
3
4
5
[root@localhost myapp]# grep -i -C 1 'Zhang' customers.txt 
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost myapp]#

图片

*16.使用中括号 [] 匹配特定数字*

可以在 “grep” 命令的正则表达式模式中使用中括号 [] 来定义特定数字的范围。

grep命令将搜索文本文件中包含 3 到 5 范围数字的行,将打印与模式匹配的文件行:

1
2
3
4
5
6
7
8
[root@localhost myapp]# grep '[3-5]' customers.txt 
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

grep 命令将搜索文本文件中包含 3 到 5 范围内的两位数字的那些行。将打印与模式匹配的文件行:

1
2
3
4
[root@localhost myapp]#  grep -E '[3-5]{2}' customers.txt
45 yoyo yoyo@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*17.使用中括号 [] 匹配具有特定字符的模式*

通过中括号[]可以灵活匹配特定字符或字符范围。在正则表达式中,使用中括号可以:

  • 匹配指定范围内的任意单个字符
  • 精准匹配括号内列出的特定字符

下面用grep命令匹配以 yo 开头,第三个字符为 ay 之间的任意字母的所有满足条件的行:

1
2
3
4
[root@localhost myapp]# grep 'yo[a-y]' customers.txt 
45 yoyo yoyo@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

下面用grep命令搜索包含’S’或’s’的行:

1
2
3
4
5
6
[root@localhost myapp]# grep '[Ss]' customers.txt 
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost myapp]#

下面用grep命令搜索包含字符串SNSnsNsn的行:

1
2
3
4
[root@localhost myapp]# grep '[Ss][Nn]' customers.txt 
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost myapp]#

图片

*18.使用[:alnum:]字符类匹配字母和数字*

[:alnum:]是正则表达式中的预定义字符类,用于匹配所有字母(大小写)和数字(0-9),其功能等同于[A-Za-z0-9]

下面命令将匹配文件中所有包含连续3个字母或数字字符的行(需配合-E启用扩展正则):

1
2
3
4
5
6
7
8
9
[root@localhost myapp]# grep -E '[[:alnum:]]{3}' customers.txt
ID Name Email Phone
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*19.使用[:alpha:]字符类匹配纯字母字符*

[:alpha:]是正则表达式中的预定义字符类,专门用于匹配所有字母字符(包括大小写),功能等同于[A-Za-z]

以下命令将匹配文件中所有包含连续5个字母字符的行(需配合-E启用扩展正则):

1
grep -E '[[:alpha:]]{5}' customers.txt

假设customers.txt内容为:

1
2
3
4
5
Alice    Engineer
Bob123 Developer
Charlie Manager
Dave@ Analyst
Élève Intern

运行命令后输出:

1
2
3
Alice    Engineer
Charlie Manager
Élève Intern

Bob123因含数字、Dave@因含符号被排除。

*20.使用[:digit:]字符类匹配纯数字字符*

[:digit:]是正则表达式中的预定义字符类,专门用于匹配所有数字字符(0-9),功能等同于[0-9]

以下命令将匹配文件中所有包含至少1个数字字符的行(需配合-E启用扩展正则):

1
grep -E '[[:digit:]]' customers.txt

假设customers.txt内容为:

1
2
3
4
5
用户A 电话: 13800138000
用户B 电话: 未登记
订单ID: #2023-456
测试123
纯文本行

运行命令后输出:

1
2
3
用户A 电话: 13800138000
订单ID: #2023-456
测试123

仅包含纯文本的行被自动过滤。

*21.使用[:lower:]字符类匹配小写字母*

[:lower:] 是正则表达式预定义的字符类,专门用于匹配所有小写字母(a-z),功能等同于 [a-z]

以下命令将匹配文件中所有包含至少1个小写字母的行(需配合 -E 启用扩展正则):

1
grep -E '[[:lower:]]' customers.txt

假设 customers.txt 内容为:

1
2
3
4
5
USER ADMIN
user guest
User01 MixedCase
测试用户
12345

运行命令后输出:

1
2
user guest
User01 MixedCase

仅包含纯大写字母、数字或中文的行被过滤。

*22.使用[:print:]字符类匹配可打印字符*

[:print:] 是正则表达式中的预定义字符类,用于匹配所有可打印字符(包括字母、数字、空格、标点符号等,但不包含控制字符)。

下面命令将匹配文件中所有包含至少1个可打印字符的行(需配合 -E 启用扩展正则):

1
grep -E '[[:print:]]' customers.txt

假设 customers.txt 内容包含控制字符(如^M\t等不可见字符):

1
2
3
正常文本行
带^M控制字符的行
(含制表符的行)

运行命令后输出:

1
2
正常文本行
(含制表符的行)

控制字符^M所在行被过滤。

*23.使用[:space:]字符类匹配空白字符*

[:space:] 是正则表达式预定义的字符类,专门用于匹配所有空白字符(包括空格、制表符\t、换行符\n等)。

先新建 demo.txt 文件,内容如下:

1
2
WelcomeToHaopython
Welcome To Haopython

下面命令将匹配文件中所有含空白字符的行

1
2
3
[root@localhost myapp]# grep -E '[[:space:]]' demo.txt
Welcome To Haopython
[root@localhost myapp]#

图片

*24.从行首开始匹配*

在正则表达式中,脱字符(^) 用于用于匹配行首的特定字符或字符串。

以下命令将精确匹配以数字4开头的行:

1
2
3
[root@localhost myapp]# grep '^4' customers.txt
45 yoyo yoyo@haopython.com +8613161582168
[root@localhost myapp]#

*25.匹配到行尾*

在正则表达式中,美元符号($) 用于精确匹配行尾的特定字符或字符串。

下面的 “grep” 命令将搜索文件中以字符串 ‘99‘ 结尾customers.txt行。

1
2
3
[root@localhost myapp]# grep '99$' customers.txt 
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

*26.使用正则表达式模式拼接(Concatenation)进行匹配*

在正则表达式中,可以通过**点号(.)**拼接多个模式,实现更灵活的匹配。

下面用grep命令搜索文件中以字母 NS 开头,中间包含任意字符(. 匹配除换行符外的任意字符),以字母 Yy 结尾的行:

1
2
3
4
5
6
[root@localhost myapp]# grep -e '[NS].*[Yy]' customers.txt 
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
[root@localhost myapp]#

图片

*27.交替匹配*

grep 支持通过 交替符(|) 实现逻辑”或”匹配,允许在单次搜索中查找多个指定模式。

下面用 grep 命令将在 customers.txt 文件中搜索字符串 ‘yoyo‘ 或 ‘Snow‘。在这里,反斜杠 (\) 与竖线 (|) 一起使用以执行交替任务。

1
2
3
4
5
[root@localhost myapp]# grep 'yoyo\|Snow' customers.txt 
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*28.使用反向引用*

grep 支持通过 反向引用 功能匹配重复出现的模式。该功能通过 \( \) 捕获分组,并用 \1\2 等引用已匹配的内容。

下面grep命令将在 customers.txt 文件中搜索 0 到 5 范围内的任何数字。如果找到任何匹配项,它将保留引用,并使用反向引用与文件的其余部分匹配。

1
2
3
4
[root@localhost myapp]# grep '\([0-5]\)\1' customers.txt
11 Shadow shadow@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]#

图片

*29.通过管道组合 psgrep 命令*

在 Linux 系统中,ps(process status)命令用于查看运行中的进程状态,而通过管道符 | 将其输出传递给 grep,可以快速过滤目标进程。

先查看所有运行中的进程:

1
2
3
4
5
[root@localhost ~]# ps
PID TTY TIME CMD
2015368 pts/0 00:00:00 bash
2024634 pts/0 00:00:00 ps
[root@localhost ~]#

过滤以 bash 结尾的进程

1
2
3
[root@localhost ~]# ps | grep -E 'bash$'
2015368 pts/0 00:00:00 bash
[root@localhost ~]#

图片

*30.结合 grepawk 提取特定字段*

grep 擅长文本搜索,而 awk 擅长结构化文本处理。通过管道组合二者,可实现「精准搜索+字段提取」的高效操作。

下面grep命令将在 customers.txt 文件中搜索字符串 ‘Ali‘,并将输出发送到 “awk” 命令,该命令将从匹配的行打印格式化的输出(字段以Tab分隔):

1
2
3
4
5
6
7
8
9
10
11
[root@localhost myapp]# cat customers.txt 
ID Name Email Phone
11 Shadow shadow@haopython.com +8613161582168
23 Nodles nodles@haopython.com +8613161582168
45 yoyo yoyo@haopython.com +8613161582168
56 Snow Zhang snow@haopython.com +8613161582168
79 Snei Ali fei@haopython.com +8613161582168
99 yoyou yoyou@haopython.com +8613933669999
[root@localhost myapp]# grep 'Ali' customers.txt | awk -F '\t' '{ print "The email address of " $2 " is " $4 }'
The email address of Snei Ali is +8613161582168
[root@localhost myapp]#

图片