linux文本处理三剑客之grep命令详解

Posted sunan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux文本处理三剑客之grep命令详解相关的知识,希望对你有一定的参考价值。

Linux文本处理三剑客之grep

grep:文本过滤(模式:pattern)工具

        grep, egrep, fgrep(不支持正则表达式搜索)

sed:stream editor,文本编辑工具

awk:Linux上的实现gawk,文本报告生成器

grep

  • grep: Global search REgularexpression and Print out the line

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

  • grep [OPTIONS] PATTERN [FILE...]

grep root /etc/passwd

grep "$USER" /etc/passwd

grep ‘$USER‘ /etc/passwd

grep `whoami` /etc/passwd

  • grep命令选项

--color=auto: 对匹配到的文本着色显示(centos6默认没加,7默认加)

-v: 显示不被pattern匹配到的行

-i: 忽略字符大小写

-n:显示匹配的行号

-c: 统计匹配的行数

-o: 仅显示匹配到的字符串

-q: 静默模式,不输出任何信息

-A #: after, 后#行

-B #: before, 前#行

-C #:context, 前后各#行

-e:实现多个选项间的逻辑or关系

grep –e ‘cat ’ -e ‘dog’ file

-w:匹配整个单词

 单词数字下划线不能作为单词的分隔符,其他可以

-E:使用ERE

-F:相当于fgrep,不支持正则表达式

正则表达式

  匹配文件中字符串

  • REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能
  • 程序支持:grep,sed,awk,vim, less,nginx,varnish等
  • 分两类:
  1. 基本正则表达式:BRE
  2. 扩展正则表达式:ERE

grep -E, egrep

  • 正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

PCRE(Perl Compatible Regular Expressions)

  • 元字符分类:字符匹配、匹配次数、位置锚定、分组
  • man 7 regex

基本正则表达式元字符(不同于通配符)

  • 字符匹配:

. 匹配任意单个字符

[] 匹配指定范围内的任意单个字符

[^] 匹配指定范围外的任意单个字符

^放在[]里面和外面是不同的概念

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即A-Z, a-z

[:lower:] 小写字母[:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:]水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

[:digit:] 十进制数字[:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

  • 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

* 匹配前面的字符任意次,包括0次

贪婪模式:尽可能长的匹配

.*任意长度的任意字符

\?匹配其前面的字符0或1次

\+匹配其前面的字符至少1次

\{n\}匹配前面的字符n次

\{m,n\}匹配前面的字符至少m次,至多n次

\{,n\}匹配前面的字符至多n次

\{n,\}匹配前面的字符至少n次

a\|bcd=a或者bcd

\(a\|b\)cd=acd或bcd

  • 位置锚定:定位出现的位置

^ 行首锚定,用于模式的最左侧

$ 行尾锚定,用于模式的最右侧

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< 或\b词首锚定,用于单词模式的左侧

\> 或\b词尾锚定;用于单词模式的右侧

\<PATTERN\>匹配整个单词=-w

  • 分组:\(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+
  • 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
  • \1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
  • 示例:\(string1\+\(string2\)*\)

\1 :string1\+\(string2\)*

\2 :string2

  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
  • 或者:\|

示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat

egrep及扩展的正则表达式

  • egrep= grep -E
  • egrep[OPTIONS] PATTERN [FILE...]
  • 扩展正则表达式的元字符:
  • 字符匹配:

. 任意单个字符

[] 指定范围的字符

[^] 不在指定范围的字符

扩展正则表达式

  • 次数匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

  • 位置锚定:

^ :行首

$ :行尾

\<, \b :语首

\>, \b :语尾

  • 分组:

()

后向引用:\1, \2, ...

  • 或者:

a|b: a或b

C|cat: C或cat

(C|c)at:Cat或cat

  • 附录:

~]#ls | grep a*

进入ls列出a开头的文件,将其中有a行出来,默认不进入目录。需要将正则表达式加上”a*”

以上是关于linux文本处理三剑客之grep命令详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理三剑客grepsedawk用法详解

linux文本三剑客之sed命令详解

性能工具之linux三剑客awkgrepsed详解

linux文本处理三剑客之grep家族及其相应的正则表达式使用详解

Linux三剑客之grep命令详解

Linux之sed详解