首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >grep命令

grep命令

原创
作者头像
@锐
发布2025-11-26 17:15:06
发布2025-11-26 17:15:06
1410
举报
文章被收录于专栏:linuxlinux

1. 格式(文本搜索工具)

grep [选项] 模式 [文件…] #文本搜索工具

2. 选项

2.1 匹配选项

2.1.1 选项

  • -E —extended-regexp: 匹配扩展的正则表达式
  • -F —fixed-strings: 固定字符串(不解析正则)
  • -G —basic-regexp: 匹配基础的正则表达式
  • -P —perl-regexp: 匹配perl正则表达式
  • -e —regexp=PATTERNS: 指定匹配模式
  • -f —file=FILE: 从文件中读取搜索模式
  • -i —ignore-case: 忽略大小写
  • —no-ignore-case:默认不忽略大小写
  • -w —word-regexp: 匹配完整的单词
  • -x —line-regexp: 匹配完整行
  • -z —null-data: 数据遇到空字符换行\0,而不是换行符\n
  • -s —no-messages: 抑制错误消息
  • -v —invert-match: 查询没有输出的行

2.1.2 ex

代码语言:javascript
复制
# -E  匹配扩展的正则表达式
$ vim log.txt
$ grep "error\|warning\|critical" log.txt
print error info
print warning info
print critical info
$ grep -E "error\|warning\|critical" log.txt
$ grep -E "error|warning|critical" log.txt
print error info
print warning info
print critical info
$ cat log.txt 
print error info
print warning info
print critical info
代码语言:javascript
复制
# -F  固定字符串
$ cat log.txt
print error info
print warning info
print critical info
$ grep -F "print" log.txt
print error info
print warning info
print critical info
$ grep -F "print error" log.txt
print error info
$ cat log.txt
print error info
print warning info
print critical info
代码语言:javascript
复制
# -G  匹配基础的正则表达式
grep -G "error\|warning\|critical" log.txt
$ cat log.txt
print error info
print warning info
print critical info
$ grep -G "error\|warning\|critical" log.txt
print error info
print warning info
print critical info
$ grep -G "error\|warning" log.txt
print error info
print warning info
代码语言:javascript
复制
# -f  从文件中读取搜索模式
$ cat log.txt
print error info
print warning info
print critical info
$ cat log1.txt
print error info
print warning info
print critical info
print interest info
$ grep -f log.txt log1.txt
print error info
print warning info
print critical info
代码语言:javascript
复制
# -i —ignore-case: 忽略大小写
$ grep -i "PRINT" log.txt 
Print error info
PRINT warning info
print critical info
$ cat log.txt 
Print error info
PRINT warning info
print critical info
代码语言:javascript
复制
# —no-ignore-case:默认不忽略大小写 
$ grep --no-ignore-case "PRINT" log.txt 
PRINT warning info
$ cat log.txt 
Print error info
PRINT warning info
print critical info

# 默认情况下也是区分大小写的
$ grep "PRINT" log.txt
PRINT warning info
$ cat log.txt 
Print error info
PRINT warning info
print critical info
代码语言:javascript
复制
# -w —word-regexp: 匹配完整的单词
$ grep -w "prin" log.txt  # 非完整单词,什么都没匹配到 
$ grep -w "print" log.txt # 完整单词可以匹配
print critical info
$ cat log.txt
Print error info
PRINT warning info
print critical info
代码语言:javascript
复制
# -x —line-regexp: 匹配完整行
$ grep -x "print critical" log.txt          # 行信息不完整,匹配不到 
$ grep -x "print critical info" log.txt   # 完整行信息,可以匹配
print critical info
$ cat log.txt 
Print error info
PRINT warning info
print critical info
代码语言:javascript
复制
# -z —null-data: 数据遇到空字符换行\0,而不是换行符\n
$ echo -e "print info\0print warning info\0print error info\0" > log.txt   #将带有\0的文本重定向到log.txt里
$ cat log.txt 
print infoprint warning infoprint error info
$ grep -z "print.*info" log.txt                             #搜索print.*info的信息,匹配到三行,都全部打出来了
print infoprint warning infoprint error info
$ 
#搜索print warning info的信息,只匹配到一行,直接打出来了,由于这里是划分成三行,所以在搜索时只打印出print warning info这一行, 如果默认所有的都是一行,则会全部打出来
#print info
#print warning info
#print error info
$ grep -z "print warning info" log.txt    
print warning info
$ grep -z "print error info" log.txt   #搜索print error info的信息,只匹配到一行
print error info
代码语言:javascript
复制
# -v —invert-match: 查询没有输出的行
$cat log.txt 
print info
print warning info
print error info
$ grep -v "print error info" log.txt  # 排除了 print error info的信息
print info
print warning info

2.2 输出控制选项

  • -m —max-count=NUM : 最大查询num行,超过则停止
  • -b —byte-offset: 打印输出信息的字节偏移量
  • -n —line-number: 打印输出信息的行号
  • —line-buffered: 刷新输出的所有行
  • -H —with--filename: 打印输出信息的文件名
  • -h —no-filename: 抑制输出信息的文件名前缀
  • —label=LABEL: 使用标签作为标准输入的文件名前缀
  • -o —only-matching: 仅显示非空的行
  • -q —quiet, —silent: 抑制所有的普通输出
  • —binary-files=TYPE: 设置二进制文件的类型 type可以是binary,text,或 wothout-match
  • -a —text: 等同于 —binary-files=text
  • -I : 等同于 —binary-files=without-match
  • -d —directories=ACTION: 如何处理路径, action是read,recurse或skip
  • -D —devices=ACTION: 如何处理设备,FIFOS 和 sockets, 活动是读或者跳过
  • -r —recursive: 类似于 —directories=recurse
  • -R —解引用递归
代码语言:javascript
复制
# -m —max-count=NUM : 最大查询num行,超过则停止
$ cat log.txt 
print info
print warning info
print error info
$ grep -m 0 "print error info" log.txt   #打印0行 
$ grep -m 1 "print error info" log.txt   #打印1行 
print error info
$ grep -m 1 "print.*info" log.txt  #打印1行 
print info
$ grep -m 3 "print.*info" log.txt #打印3行 
print info
print warning info
print error info
$ grep -m 3 "print error info" log.txt  # 打印3行,由于没有匹配3行数据,故只打印了仅有的一行
print error info
代码语言:javascript
复制
# -b —byte-offset: 打印输出信息的字节偏移量
$ grep -b "print error" log.txt 
30:print error info
$ grep -b "print.*info" log.txt 
0:print info
11:print warning info
30:print error info
代码语言:javascript
复制
# -n —line-number: 打印输出信息的行号
$ grep -n "print.*info" log.txt 
1:print info
2:print warning info
3:print error info
代码语言:javascript
复制
# -H —with--filename: 打印输出信息的文件名
$ grep -H "print.*info" log.txt 
log.txt:print info
log.txt:print warning info
log.txt:print error info
代码语言:javascript
复制
# -o —only-matching: 仅显示非空的行
$ cat log.txt   # log.txt中存在空行
print info

print warning info
print error info
$ grep -o "print.*info" log.txt  #去掉空行输出 
print info
print warning info
print error info
代码语言:javascript
复制
# -r —recursive: 类似于 —directories=recurse 
$ grep -r "print.*info" yr   # 递归遍历查找yr目录下符合print.*info的文本
yr/log.txt:print info
yr/log.txt:print warning info
yr/log.txt:print error info
yr/.bash_history:echo -e "print info\0print warning info\0print error info\0"
yr/.bash_history:echo -e "print info\0print warning info\0print error info\0" > log.txt
yr/.bash_history:grep -z "print.*info" log.txt 
yr/.bash_history:grep -z "print warning info" log.txt 
yr/.bash_history:grep -z "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -m 0 "print error info" log.txt 
yr/.bash_history:grep -m 1 "print error info" log.txt 
yr/.bash_history:grep -m 1 "print.*info" log.txt 
yr/.bash_history:grep -m 3 "print.*info" log.txt 
yr/.bash_history:grep -m 3 "print error info" log.txt
代码语言:javascript
复制
# -q —quiet, —silent: 抑制所有的普通输出
$ grep -r -q "print.*info" yr   # 抑制输出
$ grep -r "print.*info" yr   # 正常输出 
yr/dir/log.txt:print info
yr/dir/log.txt:print warning info
yr/dir/log.txt:print error info
yr/.bash_history:echo -e "print info\0print warning info\0print error info\0"
yr/.bash_history:echo -e "print info\0print warning info\0print error info\0" > log.txt
yr/.bash_history:grep -z "print.*info" log.txt 
yr/.bash_history:grep -z "print warning info" log.txt 
yr/.bash_history:grep -z "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -v "print error info" log.txt 
yr/.bash_history:grep -m 0 "print error info" log.txt 
yr/.bash_history:grep -m 1 "print error info" log.txt 
yr/.bash_history:grep -m 1 "print.*info" log.txt 
yr/.bash_history:grep -m 3 "print.*info" log.txt 
yr/.bash_history:grep -m 3 "print error info" log.txt 

2.3 上下文显示选项

  • -A —after-context=NUM : 打印匹配行后的n行
  • -B —after-context=NUM: 打印匹配行前的n行
  • -C —context=NUM: 打印匹配行前后各n行

3. 正则规则

3.1 正则表达式 (BRE)

3.1.1 字符匹配
  • . = 匹配任意单个字符 (换行符除外)
  • [] = 字符组,匹配其中任一字符
  • [^] = 匹配不在其中的任一字符
  • [[:digit:]] = 数字
  • [[:alpha:]] = 字母
  • [[:alnum:]] = 字母数字
  • [[:space:]] = 空白字符
  • [[:lower:]] = 小写字母
  • [[:upper:]] = 大写字母
代码语言:javascript
复制
# .  = 匹配任意单个字符 (换行符除外)
$ grep "a." log.txt   匹配a和任意字符
print aaaaaa info
print warning info
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
代码语言:javascript
复制
# []  = 字符组,匹配其中任一字符
$ grep "[e]" log.txt   # 匹配带e的字符
print error infoinfo
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
代码语言:javascript
复制
# [^]  = 匹配不在其中的任一字符
$ grep "[^e]" log.txt  #匹配不存在e字符
print aaaaaa info
print warning info
print error infoinfo
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
e                                   #犹豫这一行只有e,故匹配不到
代码语言:javascript
复制
# [[:alnum:]]  = 字母数字
$ grep "[[:alnum:]]" log.txt 
print aaaaaa info
print warning info
print error infoinfo
e
$ grep "[[:digit:]]" log.txt    # [[:digit:]]  = 数字 ,  由于log.txt中没有数字,所有全部匹配不到
yr@yrserver:~$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
e
3.1.2 量词 (需要转义,特别标注的以标注为准)
  • ? = 匹配前面的元素0次或1次
  • * = 匹配前面的字符零次或多次(元字符使用不需要转义,字面量需要转义
  • + = 匹配前面的元素1次或多次
  • {m} = 匹配前边的元素m次
  • {m,} = 匹配前边的元素至少m次
  • {m,n} = 匹配前边的元素m到n次, 包含m和n
代码语言:javascript
复制
# ?  = 匹配前面的元素0次或1次
$ grep "aaaaaa\?" log.txt
print aaaaaa info
$ grep "aaaaa\?" log.txt
print aaaaaa info
代码语言:javascript
复制
# *  = 匹配前面的字符零次或多次
$ grep "aa*" log.txt  #因为可以匹配0次,故可以匹配aaaaaa 和 warning
print aaaaaa info
print warning info
$ grep "aaa*" log.txt  #可以匹配aa到aaaaaa...
print aaaaaa info
代码语言:javascript
复制
# +  = 匹配前面的元素1次或多次
$ grep "aa\+" log.txt  #至少匹配一次,也就是最少两个a
print aaaaaa info
$ grep "a\+" log.txt # 最少匹配1个a
print aaaaaa info
print warning info
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
e
代码语言:javascript
复制
# {m}  = 匹配前边的元素m次
# {m,}  = 匹配前边的元素至少m次
# {m,n}  = 匹配前边的元素m到n次, 包含m和n
$ grep "a\{1\}" log.txt   # 匹配a 1次
print aaaaaa info
print warning info
$ grep "a\{2,\}" log.txt  # 匹配a 至少2次
print aaaaaa info
$ grep "a\{2,6\}" log.txt  #匹配a 2到6次
print aaaaaa info
$ grep "a\{7,\}" log.txt #匹配a 至少7次,匹配不到
$ cat log.txt
print aaaaaa info
print warning info
print error infoinfo
e
3.1.3 位置锚点
  • ^ = 匹配行的开始
  • $ = 匹配行的结束
  • < = 匹配单词的开始(需要\进行转义)
  • > = 匹配单词的结束(需要\进行转义)
代码语言:javascript
复制
#  ^  = 匹配行的开始
# $  = 匹配行的结束
$ grep "^a" log.txt   #匹配a开头的,未匹配到 
$ grep "^p" log.txt   #匹配p开头的
print aaaaaa info
print warning info
print error infoinfo
$ grep "^e" log.txt     #匹配e开头的
e
$ grep "^p$infoinfo" log.txt     #匹配p开头infoinfo结尾的 
print aaaaaa info
print warning info
print error infoinfo
代码语言:javascript
复制
# <  = 匹配单词的开始(需要\进行转义)
# >  = 匹配单词的结束(需要\进行转义)
$ grep "\<h.*o\>" log.txt    # 匹配h开头,o结尾,中间不计  
hello
$ grep "\<d.*y\>" log.txt  # 匹配a开头,y结尾,中间不计  
day
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
e
hello
happy
day
day1
3.1.4 分组和引用 (加转义符)
  • ( ) = 分组
  • | = 或
  • 1 = 引用组1
代码语言:javascript
复制
# \( \)  = 分组 
# \1  = 引用组1
$ grep "\(happy\|error\|day\).*" log.txt    #匹配happy.* ,error.* , day.*中的任意一个
print error infoinfo
happy
day
day1
$ grep "\(a\)\1" log.txt   #匹配a,然后取组1, 也就是aa
print aaaaaa info
$ cat log.txt 
print aaaaaa info
print warning info
print error infoinfo
e
hello
happy
day
day1
3.1.5 特殊序列
  • \w = 单词字符
  • \W = 非单词字符
  • \b = 单词边界
  • \s = 匹配空白字符
    • 空格
    • 制表符 \t
    • 换行符 \n
    • 回车符 \r
    • 换页符 \f
    • 垂直制表符 \v
  • \s- = 匹配非空白字符
代码语言:javascript
复制
# \w  =  单词字符
# \b =  单词边界
# \s = 匹配空白字符
# \b\b表示单词的前后边界  (\w+) 表示匹配前边的单词1次 \s+匹配各种空白字符 \1就是和(\w+)取一样的值
$ grep -E "\b(\w+)\s+\1\b" log.txt 
print error info info
$ cat log.txt 
print aaaaaa info
print warning info
print error info info
e
hello
happy
day
day1
aa

3.2 扩展正则表达式 (ERE)

  • ERE 必须使用-E选项来用,不带选项默认是BRE
  • ERE 的操作无需转义
  • ERE 其他大部分命令和BRE一致,只是无需加转义符

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 格式(文本搜索工具)
  • 2. 选项
    • 2.1 匹配选项
      • 2.1.1 选项
      • 2.1.2 ex
    • 2.2 输出控制选项
    • 2.3 上下文显示选项
  • 3. 正则规则
    • 3.1 正则表达式 (BRE)
    • 3.2 扩展正则表达式 (ERE)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档