grep中使用正则表达式

前端之家收集整理的这篇文章主要介绍了grep中使用正则表达式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1. intruduction

GREP 全称Global search Regular Expression and Print out the line,用于搜索文件并将匹配的行打印出来,它可以使用regex 搜索文本。它在一个或多个文件搜索字符串pattern。如果pattern包括空格,则必须被引用(建议引用所有内容)pattern后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作

sysopsis

grep [option] [pattern] [file... ]

pattern 实际上是正则表达式regex,可用单引号' ' pattern括起来以避免shell通配的影响。

2. option

-# 同时显示匹配行上下的#行,如:grep -2 pattern filename同时显示匹配行的上下2行。选项-C的简写方式

-C grep -C 5 foo file 显示foo及前后各5

-B before grep -B 5 foo file 显示foo及前5

-A after grep -A 5 foo file 显示foo及后5

-i--ignore-case 忽略大小写差别。

-n--line-number 在匹配的行前面打印行号,需要修改相应配置文件内容时相当有用

-c,--count 只打印匹配的行数,不显示匹配的内容

-v--revert-match 反检索,只显示不匹配的行。

-V --version

-q--quiet 取消显示,只返回退出状态。0则表示找到了匹配的行;找不到返回1搜索文件不存在返回2

-w 只匹配整个单词

-r/ -R/ -d --recursive #此参数的效果和指定“-d recurse”参数相同,遍历目录下的所有文件

-L输出时只显示不包含匹配项的文件名,通常与-r选项连用来查找带指定内容文件

-l输出时只显示包含匹配项的文件名。

-h --no-filename #显示符合样式的那一列之前,不标示该列所属的文件名称

-H --with-filename #显示符合样式的那一列之前,表示该列所属的文件名称(默认方式)

-s--silent 不显示关于不存在或者无法读取文件错误信息。

-o输出时每行只显示匹配项内容

-E 相当于egrep支持扩展的正则表达式

-F 相当于fgrep

--color 高亮显示匹配项内容,如经常使用的命令别名alias grep='grep --color=auto'

3. grep 中应用正则表达式

Linux中的命令grep,find,128);font-family:Calibri;">sed,128);font-family:Calibri;">awk 支持regex

正则表达式分为基本正则表达式(grep -e)和扩展正则表达式(grep -E)。下面分别简单总结一下。

基本正则表达式base-regex

元数据

意义和范例

^word

搜寻以word开头的行。

grep -vn ^# regular.txt #过滤掉以#开头的行。

word$

搜寻以word结束的行

grep -n .$ regular.txt

^$

匹配空行

\

转义字符,忽略正则表达式中特殊字符的原有含义

grep -n \$ regular.txt 搜索包含$的行。

.

匹配任意一个字符。

grep -n e.e regular.txt #可以匹配eeeeaeeve等,但不匹配ee

*

匹配任意字符串,长度可为0

grep -n go*gle regular.txt #可以匹配glgle,gogle,google.....

.*

匹配所有字符

[list]

匹配一系列字符中的一个。

grep -n g[lf] regular.txt 可以匹配gl,gf

[n1-n2]

匹配一个字符范围中的一个字符。

grep -n [0-9] regular.txt #匹配数字字符

grep -n '[a-z]' regular.txt #匹配a-z中的任意一个字符

更多示例[a-z],[0-9],[A-Z],[a-zA-Z0-9]

[^list]

匹配字符集以外的字符

例如:grep n [^o] regular.txt

匹配非o字符

\<word

匹配以work开头的单词。

grep -n \<g regular.txt #匹配以g开头的单词

word\>

匹配以word结尾的单词

grep -n tion\> regular.txt #匹配以tion结尾的单词

\{n,m\}

匹配前面的字符重复次数nm之间,包括nm

grep -n go\{2,3\}gle regular.txt #可以匹配google,gooogle

grep 要对{}转义

\{n\}

匹配前面的字符重复n次。

\}

匹配前面的字符n次或n次以上。

扩展正则表达式

grep一般情况下支持基本正则表达式,可以通过参数-E支持扩展正则表达式,另外grep单独提供了一个扩展命令叫做egrep用来支持扩展正则表达式,这条命令和grep -E等价。虽然一般情况下,基本正则表达式就够用了。特殊情况下,复杂的扩展表达式,可以简化字符串的匹配。

扩展正则表达式就是在基本正则表达式的基础上,增加了一些元字符。

+

重复前面字符1到多次。

grep -nE go+d regular.txt,等价于 grep -n 'go\{1,\}' regular.txt

匹配godgoodgoood等等字符串

?

匹配01次前面的字符

grep -nE go?d regular.txt 等价于grep -n 'go\{0,1\}d' regular.txt

匹配gdgod

|

或(or)的方式匹配多个字串

df -h | grep -nE '/var$|/opt/IBM/db2|/tmp$|/var$'

查看指定的多个文件系统的信息

()

匹配整个括号内的字符串,原来都是匹配单个字符

grep -nE g(oo|la) regular.txt

匹配good或者glad

4. 如何对grep中的pattern加引号

事实上,对字符串的解析是由shell完成再传递给grep,所以参考shell的特殊字符,以正确使用引号来确保表达正确,在此仍作简单说明。

' ' 单引号,字符串保持原样输出

" " 双引号,字符串中的` `,$,\ 等特殊字符会被shell解释替换后,再传递给grep

对普通的字符串(没有特殊字符和空格的字符串)也可以不加引号,直接搜索

[ade@h test]$ grep -n $HOME regular.txt

2:/home/ade

[ade@h test]$ grep -n "$HOME" regular.txt

2:/home/ade

[ade@h test]$ grep -n '$HOME' regular.txt

5:$HOME

[ade@h test]$ grep -n "\$HOME" regular.txt

5:$HOME

所以除非刻意要使用shell替换功能,否则一直使用单引号来搜索你想要的内容是比较好的习惯。

5. eg

grep -v '^#' file.conf 过滤以#开头的行

grep -v '^$' 过滤空行

grep -c 'HOME' file.conf 统计文件HOME的个数

crontab -l | grep grep -v '^#'

crontab -l | grep -n '* 0 /' 查找指定时间的任务

crontab -l | grep -B 2 "check_backup" 你仍需要对应cron job前的注释,以便清楚其含义。

grep -l 'mdadm' /var/log/* 搜索包含特定内容的日志文件

grep -2 "initdefault" /etc/inittab 想看看匹配前后两行的内容

df -g | grep -nE '/var$|/opt/IBM/db2$|/tmp$|/var$' 查询特定分区人信息。

ls -1 | grep 't[abc]ab' 传递给grep的字符串为t[abc]ab. 当然也可以直接让shell来解释来找到想要的文件ls -1 t[abc]ab 。所以使用正则表达时要清楚什么样的字符串传递给哪一个程序处理。

grep '\\' regular.txt 搜索文件中的\而不是\\.

related

egrep 相当于grep -E

fgrep 想当于grep -F

猜你在找的正则表达式相关文章