文本处理三剑客之GREP

文本过滤工具:glob 用于实现bash中的文件名通配

  • 通配符:

    *:任意长度的任意字符
    ?:任意单个字符
    [ ]:明确指明匹配范围内的单个字符

    • [abc]:abc中的任意一个

    注:要匹配通配符本身,需要使用%转义

  • 常用的字符集合表示法:
    • [:alpha:]:任意字母
    • [:alnum:]:任意数字和字母
    • [:blank:]:任意空白字符
    • [:cntrl:]:任意控制字符
    • [:digit:]:任意数字
    • [:lower:]:任意小写字母
    • [:upper:]:任意大写字母
    • [:space:]:任意空格

    例如:显示/var目录下,以l开头,以小写字母结尾,且中间至少出现一位数字的文件或目录

    • ls -d /var/l*[[:digit:]]*[[:lower:]]

grep:全局搜索正则表达式并显示出来(文本过滤工具)

grep:基本正则表达式
egrep:扩展正则表达式

作用:文本搜索,根据用户指定的内容,对目标文件进行逐行匹配检查,打印匹配到的行

  • 内容(模式):由正则表达式字符和文本符所编写的过滤条件
  • 正则表达式:由一类特殊字符所编写的模式,有些字符不表示字符本身的含义,而表示控制或通配
  • 元字符:表示特殊含义的字符

grep的使用方法:

  • 格式:grep [选项] 模式 目录或文件
    • --color=auth:对匹配到的内容加颜色显示
    • -m #:匹配#次后停止
    • -n:显示匹配的行行数
    • -c:统计匹配到的行的行号
    • -v:显示不能匹配到的行
    • -i:匹配时忽略字符大小写
    • -o:仅显示匹配到的字符
    • -q:静默模式
    • -A#:显示匹配到的行和后#行
    • -B#:显示匹配到的行和前#行
    • -C#:显示匹配到的行和前后各#行
    • -w:匹配整个单词
    • -E:使用扩展正则表达式
    • -F:使用fgrep
    • -f file:根据模式文件中的内容去匹配

基本正则表达式的元字符:使用引号引起来

  • 字符匹配:

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

  • 次数匹配:

:匹配前面的字符任意次数
.
:匹配任意长度的任意字符
\?:匹配前面的字符0次或1次,即前面的字符可有可无
\+:匹配前面的字符至少出现一次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符m到n次
\{m,\}:匹配前面的字符至少出现m次
\{,m\}:匹配前面的字符至多出现m次

  • 位置锚定:

^:匹配的字符出现在行首
$:匹配的字符出现在行尾
^pattern$:用于整行匹配
^$:空行
^[[:space:]]$:空白行
\<或\b:词首锚定,用于单词模式左侧
\>或\b:词尾锚定,用于单词模式的右侧
\<pattern\>:匹配整个单词

  • 分组:

\(\):把括号中的内容分组
\(xy\)*ab:匹配ab前面的xy出现任意次数

  • 后向引用:引用前面分组括号中的模式所匹配到的内容
    • 分组括号中的模式所匹配到的内容,会被正则表达式引擎记录在内部变量中,这些变量被命名为\1,\2,\3……
      • -n:把左侧起第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符
      • 例:(str1+(str2)*)

      \1:str1+(str2)*
      \2:str2

  • 或者:

\|:

  • 实例:

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

扩展正则表达式:egrep

选项与基本正则表达式相同

egrp的元字符:

  • 字符匹配:同grep
  • 次数匹配:同grep,但是不需要转义
  • 位置锚定:同grep
  • 分组:小括号不需要转义
  • 后向引用
  • 或者:| 不需要转义

fgrep:不支持正则表达式,仅仅找给定的字符串

练习:

  1. 显示/proc/meminfo文件中以大小写s开头的行

grep -i '^s.' /proc/meminfo
grep '[Ss].
' /proc/meminfo

  1. 显示/etc/passwd文件中不以bash结尾的行

grep -v '.*bash$' /etc/passwd

  1. 显示CentOS7中的/etc/grub2.cfg文件中,至少以一个空白字符开头,且后面有非空白字符的行

grep -E "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg