成航先森 成航先森

成都航院计算机系一个学生的个人博客

 

脚本编程

  • 没有分类目录

最新文章

脚本编程
当前位置: 首页 » 脚本编程 » Linux grep正则表达式的用法,学好即可旁通其他语言正则表达式

Linux grep正则表达式的用法,学好即可旁通其他语言正则表达式

编辑:狂族晨曦 来源:脚本编程系统运维经验杂笔 日期:2016-05-15 阅读: 3,765 次 9 条评论 » 百度已收录

最后更新时间:2022-04-02

先森培训红帽Linux之前,得知要也会教正则表达式,先森是感到非常高兴的。因为在先森的印象中,正则表达式是非常难懂难学的,既然有教,一定要学好。本来已经做好面对困难的决心,直到老师教grep正则表达式的时候才发现,原来这么简单。而且老师也说了,只要学会了用grep正则表达式,学习java等其他语言的正则表达式也就简单了。

redhat_linux_grep

redhat linux grep

下面先森对自己的学习做一个总结,毕竟代码总是易忘的。本文叙述的是用grep来使用正则表达式,实际上Linux使用正则表达式的命令工具不止于此。

Linux grep命令

grep是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep很有使用价值,先森在学习之后就在《用Linux分析日志查看产生大量404的IP》一文中有过应用。

grep按下述方式接受选项和参数:

grep [options] regex [files]

其中options是以下的选项,regex是正则表达式,files是需要进行搜索的文本文件。gerp支持的选项如下:

  • -a 不要忽略二进制数据。

  • -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。

  • -b 在显示符合范本样式的那一行之外,并显示该行之前的内容。

  • -c 计算符合范本样式的列数。

  • -C<显示列数>或-<显示列数> 除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

  • -d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。

  • -e<范本样式> 指定字符串作为查找文件内容的范本样式。

  • -E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。

  • -f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。

  • -F 将范本样式视为固定字符串的列表。

  • -G 将范本样式视为普通的表示法来使用。

  • -h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。

  • -H 在显示符合范本样式的那一列之前,标示该列的文件名称。

  • -i 忽略字符大小写的差别。 -l 列出文件内容符合指定的范本样式的文件名称。

  • -L 列出文件内容不符合指定的范本样式的文件名称。

  • -n 在显示符合范本样式的那一列之前,标示出该列的编号。

  • -q 不显示任何信息。

  • -R/-r 此参数的效果和指定“-d recurse”参数相同。

  • -s 不显示错误信息。

  • -v 反转查找。

  • -w 只显示全字符合的列。

  • -x 只显示全列符合的列。

  • -y 此参数效果跟“-i”相同。

  • -o 只输出文件中匹配到的部分。

  • --color:以特定颜色高亮显示匹配关键字

--color选项可以让搜索匹配结果高亮,是个很有用的选项。

需要注意的是,grep命令使用正则表达式分为基本正则表达式和扩展正则表达式。我们一般使用"grep -E"或者"egrep"来使用扩展正则表达式。扩展正则表达式的功能更加强大。

命令中加入正则表达式时,最好使用引号将表达式括起来,以避免shell的元字符对正则表达式的影响。

基本正则表达式

正则表达式的学习,主要就是对各种字符的作用进行学习,使用中则主要是将各种功能的字符进行组合,以达到我们的目标匹配。虽然grep正则表达式分为基本正则表达式和扩展表达式,但基本表达式已经能满足我们的基本需求了。下面来介绍一下各种正则表达式字符:

符号 含义 举例
^ 开始标记 "^abc"满足的例子abc、abcd
^ 非(在[]内) "[^abc]"满足的例子:ddd、mpd
$ 结束标记 "abc$"满足的例子abc、mmabc
\< 匹配单词开始 "\<abc"满足的例子abc、abcd
\> 匹配单词结束 "abc\>"满足的例子abc、pmrabc
. 任意一个字符 "a.c"满足的例子abc、fapcc
* 匹配前一个字符≥0次 "abc*"满足的例子abbb(c出现0次)、abcdk
\ 转义字符 "\."满足的例子192.168
[] 匹配一系列字符中的一个 "[abc]"满足的例子any、boy、ico
- 连字符,用在[]中,规定匹配范围 [a-z]匹配小写字母,[0-9]匹配数字,[0-9a-zA-Z]匹配数字与字母
{} {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次

"abc\{3,5\}"满足的例子abcccc、abcccccc

注意,由于{ }在SHELL中有特殊意义,因此作为正则表达式用的时候要用\转义一下(若用egrep则不转义)。 

扩展正则表达式

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

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

符号 含义 举例
+ 匹配前一个字符≥1次 "abc+"满足的例子abcd、abcccdd
? 匹配前一个字符0或1次 "abc?"满足的例子ab、mabcd
| "AAA|BBB"满足的例子AAA、BBBpp
()

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

"g(oo|la)d"满足的例子good、glad
() 反向引用,最多使用9次,用\*调用(*代表1-9),以左括号确定编号 "([a-z]+)([0-9]+)\1\2\1"(\1引用第一个括号内的匹配结果,\2引用第二个括号的匹配结果)满足的例子abc12abc12abc、a1a1a(注:a1a2c则不满足)

最后

相对而言,grep正则表达式还是非常简单的。需要注意的是,花括号{}在grep中使用需要加反斜杠\转义,而在grep -E或egrep中则不用转义。

标签:
除特别注明外,本站所有文章均为成航先森 www.capjsj.cn 原创,本文共2351个字
转载请注明出处来自https://www.capjsj.cn/linux_grep_zzbds.html
已有 9 位"计工"发布了激烈的评论,还有N多人围观笑而不语评论
的头像
欢迎发表评论
取消评论

表情
疑问调皮伤心抠鼻黑线微笑可爱奸笑震惊吓到了撇嘴大兵忍不住笑笑狂骂狂怒噢?鼓掌酷⊙﹏⊙b汗鄙视大哭嘿嘿

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. 的头像

    正则表达式万变不离其宗

    2016-05-15 18:11 回复
  2. 的头像

    你们这做技术的太牛了,写的这些完全看不懂啊!

    2016-05-15 19:16 回复
  3. 的头像

    最烦的就是这些东西呀

    2016-05-15 22:52 回复
  4. 的头像

    正则参数这么多,看着都晕0.0

    2016-05-16 14:32 回复
  5. 的头像

    一直不是很懂正则表达式。看很多时候都会用到的。

    2016-05-16 17:33 回复
  6. 的头像

    太难掌握了~~

    2016-05-16 20:56 回复
  7. 的头像

    以前学Java时用过,现在都还给老师了。

    2016-05-17 00:28 回复
  8. 的头像

    正则的确很强大~

    2016-05-19 08:33 回复
官方微信
发表评论 返回顶部