grep [选项] 模式 [文件…] #文本搜索工具
# -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# -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# -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# -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# -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# —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# -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# -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# -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# -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# -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# -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# -n —line-number: 打印输出信息的行号
$ grep -n "print.*info" log.txt
1:print info
2:print warning info
3:print error info# -H —with--filename: 打印输出信息的文件名
$ grep -H "print.*info" log.txt
log.txt:print info
log.txt:print warning info
log.txt:print error info# -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# -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# -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 # . = 匹配任意单个字符 (换行符除外)
$ grep "a." log.txt 匹配a和任意字符
print aaaaaa info
print warning info
$ cat log.txt
print aaaaaa info
print warning info
print error infoinfo# [] = 字符组,匹配其中任一字符
$ grep "[e]" log.txt # 匹配带e的字符
print error infoinfo
$ cat log.txt
print aaaaaa info
print warning info
print error infoinfo# [^] = 匹配不在其中的任一字符
$ 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,故匹配不到# [[: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# ? = 匹配前面的元素0次或1次
$ grep "aaaaaa\?" log.txt
print aaaaaa info
$ grep "aaaaa\?" log.txt
print aaaaaa info# * = 匹配前面的字符零次或多次
$ grep "aa*" log.txt #因为可以匹配0次,故可以匹配aaaaaa 和 warning
print aaaaaa info
print warning info
$ grep "aaa*" log.txt #可以匹配aa到aaaaaa...
print aaaaaa info# + = 匹配前面的元素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# {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# ^ = 匹配行的开始
# $ = 匹配行的结束
$ 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# < = 匹配单词的开始(需要\进行转义)
# > = 匹配单词的结束(需要\进行转义)
$ 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# \( \) = 分组
# \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# \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原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。