[shell] 学习shell之使用grep在输入流或文件中搜索文本

本文详细介绍了Linuxgrep命令及其常用选项,包括基本用法、正则表达式、搜索范围、大小写忽略、多文件搜索、匹配模式组合和统计功能等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

       grep命令作为Linux中常用的命令,是文本搜索的重要工具。它可以接受正则表达式,生成各种格式的输出。

常用命令

grep命令常用的选项
选项含义
-E

              grep命令可以使用扩展正则表达式搜索

-o只输出匹配到的内容
-v打印出不包含特定匹配模式的文本行
-c统计包含特定匹配模式的文本行数
-n打印出匹配字符串所在行的行号
-r或-R在多级目录中递归搜索
-i在搜索时不考虑字符的大小写
-e指定多个匹配模式
-f

可以将匹配模式保存在文件中(一行一个模式),grep搜索时使用

-f读取文件中的匹配模式

细节

命令1:在stdin中搜索包含特定的模式的文本行(stdin表示标准输入)

$ echo -e "this is a word\nnext line" | grep word

输出结果为:

this is a word

命令解析:①要想在echo显示的字符串中使用转义字符(例如\n  \t等),需要加上参数“-e”才能解析带有转义字符的字符串。故

$  echo -e "this is a word\nnext line"

输出结果为: this is a word
                       next line

②“|” 为管道运算符,用于多条命令的通信。

cmd1 | cmd2 | cmd3

这里,使用管道运算符连接了三个命令,其中cmd1的输出传递给cmd2,cmd2对cmd1进行操作的结果传递给cmd3,cmd3再对传递过来的内容做处理,最终输出到终端或是文件中。

③命令1中的例子是想在echo显示的字符串中查找关键词word ,会显示包含关键字“word”的一行文本。

命令2:在文件中搜索包含特定模式的文本行

$  grep pattern filename
#"pattern"表示想要搜索的特定模式
#“filename”是文件名(在哪一文件中搜索),即搜索范围

例如:grep hello hello_world.txt #表示在hello_world.txt中搜索关键词“hello”

输出结果:包含关键词的那一行文本

命令3:在多个文件中搜索包含特定模式的文本行

$  grep pattern filename1 filename2 filename3

命令4:grep默认使用基础正则表达式,选项“-E”可以使grep使用扩展正则表达式

$ cat args.txt
#输出结果为以下三行
ARG1
arg2
arg3

#使用正则表达式在文件中搜索,查找包含一个或多个小写字母的文本行

$ grep "[a-z]+" args.txt  #由于grep默认使用基础正则表达式,不能解析本命令的正则表达式

 正确的为:

$ grep -E "[a-z]+" args.txt 
#或者使用egrep
$ egrep "[a-z]+" args.txt

输出结果为:

arg2
arg3

 命令5:命令1-4中都是输出包含特定匹配模式的文本行,如果只输出匹配到的文本,就需要添加选项“-o”.

$ echo this is a line. | grep -oE "[a-z]+\."

输出结果:line.

命令解析:①正则表达式中  [a-z] 表示匹配任意单个小写字母,“+”表示匹配之前的项一次或多次,“\.”使转义字符,表示匹配“.”,故该正则表达式是查找一个或多个小写字母,并且以“.”结尾的文本。

②命令中的正则表达式不是基础正则表达式,所以grep命令加上“-E”选项。

命令6:选项-v可以打印出不匹配match_pattern的所有行。

$  grep -v match_pattern file
#"match_pattern"表示想要搜索的特定模式

例如:

args.txt文本内容如下:

ARG1

arg2
arg3

$  grep -v "arg2" args.txt

 该命令输出不包含arg2的文本行:

结果:

ARG1
arg3

命令7:选项-c可以统计出包含特定匹配模式的文本行数。

$  echo -e "1 2 3 4\nhello\n5 6" | grep -c "[0-9]"

 命令解析:①echo输出的字符串为:

1 2 3 4
hello
5 6

②grep命令想要查找包含单个数字的文本行数。

结果:

2  #虽然共有6个数字,但是分布在2行中 

命令8:想要统计搜索出多少个匹配项,可以借助-o 选项(输出搜索到的匹配模式)。

echo -e "1 2 3 4\nhello\n5 6" | grep -o "[0-9]" | wc -l

命令解析:①上面命令中grep -o的输出结果为:

1
2
3
4
5
6

 ②“wc”是一个用于统计行、单词和字符数量的实用工具,它是Word Count(单词计数)的缩写,"wc -l"用于统计行数。

结果:

6

命令 9:选项-n可以打印出匹配字符串所在行的行号。

$  echo -e "1 2 3 4\nhello\n5 6" | grep -n 3 
#打印出数字3所在的行数

结果:

1:1 2 3 4  #其中开头的1表示查找的内容在第一行

 注:如果涉及到多个文件中查找,使用-n选项时也会打印出文件名。

命令10:选项-i可以在匹配模式时不考虑字符的大小写。

$  echo hello world | grep -i "HELLO"

结果:

hello world

命令11:选项-e可以指定多个匹配模式

$ grep -e "pattern1" -e "pattern2"
#"pattern1"和"pattern2"对应两个查找内容

例如:

$  echo this is a line of text | grep -o -e "this" -e "line"
#其中-o选项表示只输出匹配的内容

 结果:

this
line

命令12:除了使用-e指定多个匹配模式,还乐意将多个匹配模式保存在文件(一个模式一行)中,例如:

pat_file.txt内容如下:

hello

cool

#两个匹配模式是在两行中

$ echo hello this is cool | grep -f pat_file.txt

结果:

hello this is cool

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值