正则表达式及linux文本检查工具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式及linux文本检查工具相关的知识,希望对你有一定的参考价值。

一、linux正则表达式之前的三个文本查找命

  • grep:(global search regular RE )全面搜索正则表达式并把行打印出来)

相关解释:最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本

    名称:print lines matching a pattern是一种强大的文本搜索工具,它只能使用基本的正则表达式来搜索文本,并把匹配的行打印出来

[[email protected] ~]# grep ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[[email protected] ~]#

    格式

       1)grep [OPTIONS] PATTERN [FILE...]

         2)grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

     描述:grep会根据标准输入的“PATTERN”或者被命名的文件搜索相应的行,默认情况下会打印匹配的行

常用选项

  -E: 相当于egrep,是由POSIX指定,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来

[[email protected] ~]# grep -E ‘^(a|J)‘ /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
Jason:x:1000:1000::/home/Jason:/bin/bash

-F: 相当于fgrep,是由Posix指定,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快

[[email protected] ~]# grep -F ‘root‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

--color=auto/nerver/always:对匹配到的文本着色后高亮显示,一般在alias中定义;

[[email protected] ~]# alias
alias cp=‘cp -i‘
alias egrep=‘egrep --color=auto‘
alias fgrep=‘fgrep --color=auto‘
alias grep=‘grep --color=auto‘
alias l.=‘ls -d .* --color=auto‘
alias ll=‘ls -l --color=auto‘
alias ls=‘ls --color=auto‘
alias mv=‘mv -i‘
alias rm=‘rm -i‘
alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde‘
[[email protected] ~]#
[[email protected] ~]# grep ‘home‘ --color=auto /etc/passwd
Jason:x:1000:1000::/home/Jason:/bin/bash
[[email protected] ~]# grep ‘home‘ --color=never /etc/passwd
Jason:x:1000:1000::/home/Jason:/bin/bash
[[email protected] ~]# grep ‘home‘ --color=always /etc/passwd
Jason:x:1000:1000::/home/Jason:/bin/bash
[[email protected] ~]#

-i:忽略字符大小写;

[[email protected] ~]# cat test.txt
Good morning,zhang An!
[[email protected] ~]# grep -i ‘a‘ test.txt
Good morning,zhang An!

-o:仅显示匹配到的文本自身;

[[email protected] ~]# cat test.txt
Good morning,zhang An!
[[email protected] ~]# grep -o ‘zhang‘ test.txt
zhang
[[email protected] ~]#

-v: --invert-match:反向匹配

[[email protected] ~]# cat test.txt
Good morning,zhang An!
nihao
[[email protected] ~]# grep -v ‘Good‘ test.txt
nihao
[[email protected] ~]#
#在这里可以看出反向匹配是打印出来不包含‘Good‘的行

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

[[email protected] ~]# grep -v ‘Good‘ test.txt
nihao
[[email protected] ~]# grep -qv ‘Good‘ test.txt
[[email protected] ~]#

-n:显示匹配到行,并且显示行号

[[email protected] ~]# grep -n ‘o‘ test.txt
1:Good morning,zhang An!
2:nihao
[[email protected] ~]# grep ‘o‘ test.txt | cat -n 
     1	Good morning,zhang An!
     2	nihao
[[email protected] ~]# 
#grep的n选项是有颜色的与cat的n选项有一些差别

  -c: 计算找到‘PATTERN’的次数

[[email protected] ~]# grep -c ‘o‘ test.txt
2
[[email protected] ~]#

  -A:显示匹配到字符那行的后面n行

[[email protected] ~]# cat test.txt
gegVDFwer34fs43dfwerFG4g
gegVDFweSDFGertgg
23ere67fgSD5436fe
nihao,zhandge
[[email protected] ~]# grep -A1 ‘23‘ test.txt
23ere67fgSD5436fe
nihao,zhandge
[[email protected] ~]#

 -B:显示匹配到字符那行的前面n行

[[email protected] ~]# cat test.txt
gegVDFwer34fs43dfwerFG4g
gegVDFweSDFGertgg
23ere67fgSD5436fe
nihao,zhandge
[[email protected] ~]# grep -B2 ‘23‘ test.txt
gegVDFwer34fs43dfwerFG4g
gegVDFweSDFGertgg
23ere67fgSD5436fe
[[email protected] ~]#

-C:显示匹配到字符那行的前后n行

[[email protected] ~]# grep -C1 ‘23‘ test.txt
gegVDFweSDFGertgg
23ere67fgSD5436fe
nihao,zhandge
[[email protected] ~]#


-G:--basic-regexp:支持使用基本正则表达式;

-P:--perl-regexp:支持使用pcre正则表达式;

-e: PATTERN, --regexp=PATTERN:多模式机制;

-f: FILE, --file=FILE:FILE为每行包含了一个pattern的文本文件,即grep script;

  • egrep:扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。

egrep命令等同于grep -E,利用此命令可以使用扩展的正则表达式对文本进行搜索,并把符合用户需求的字符串打印出来。

  • fgrep:快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可以并行匹配多个字符串的版本。

fgrep命令等同于grep -F,它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。

二、基本正则表达式:

基本意义:由一些基本字符以及某些特殊字符搭配,组合成一段具有某种语法规则的能轻松搜索并匹配文本的字符串

     分类:基本正则表达式与扩展正则表达式

    1)基本正则表达式

  1)字符匹配

字符描述
.匹配任意单个字符
[ ]匹配范围内的任意单个字符
[^ ]匹配范围外的任意单个字符
[:alnum:]数字与字母大小写字符-->"A-Za-z0-9"
[:digit:]数字字符-------------->"0-9"
[:punct:]标点符号字符---------->"?.,"
[:alpha:]字母字符-------------->"A-Za-z"
[:space:]代表的是空白字符,包括空格键[Tab]等
[:blank:]代表的是空格键与[Tab]按键
[:lower:]

小写字母字符---------->"a-z"

[:upper:]大写字母字符---------->"A-Z"
[:cntrl:]表示键盘上面的控制按键即包括"CR,LF,Tab,Del"
[:print:] 代表可以打印出来的字符
[:xdigit:]代表十六进制的数字类型->"0-9,A-F,a-f"

跟着习题看一看效果:

[[email protected] ~]# grep ‘g.d‘ muli.txt 
good god goood food foolish gooooooooooogle
gad
[[email protected] ~]# cat text0.txt
zhan zan jiang lia nian
[[email protected] ~]# grep ‘z[ha]‘ text0.txt
zhan zan jiang lia nian
#[]匹配其中的任意单个字符
[[email protected] ~]# grep ‘z[^123]‘ text0.txt
zhan zan jiang lia nian
# [^]匹配其外的任意单个字符
[[email protected] ~]# grep ‘[[:digit:]]‘ muli.txt
Asdd234FDSD
[[email protected] ~]#

2)匹配次数

用法:用在指定重复出现字符的后面

功能:限制前面的支付要出现的次数

注意: 默认工作处于贪婪模式

 贪婪 与 非贪婪(惰性) 两者的前提都是需要匹配成功,区别在于:

 贪婪 是在匹配成功的前提下,尽可能多的去匹配

 非贪婪(惰性)是在匹配成功的前提下,尽可能少的去匹配

字符
描述
*匹配前面的任意次
\+匹配前面的字符至少一次
\?匹配前面的0次或1次,即前面的字符可有可无
\{m\}其前面的字符出现m次,m为非负整数;
\{m,n\}其前面的字符最少出现m次,最多出现n次(m<n)m为非负整数;[m,n]
\{0,n\}至多n次;
\{m,\}至少m次;

 3)位置锚定

   说明:限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的个位置;

字符描述
^行首锚定;用于模式的最左侧,^PATTERN
$行尾锚定;用于模式的最右侧,PATTERN$
^PATTERN$要让PATTERN完全匹配一整行
^$没有任何字符包括空格的行
^[[:space:]]*$没有任何字符但是包括空格的行

  单词:由非特殊字符组成的连续字符(字符串)都称为单词;

\<或\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN, \bPATTERN

[[email protected] ~]# grep "\<[0-9]\{3,4\}\>" /etc/passwd
games:x:12:100:games:/usr/games:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
polkitd:x:997:995:User for polkitd:/:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin
libstoragemgmt:x:995:992:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin
geoclue:x:992:989:User for geoclue:/var/lib/geoclue:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
Jason:x:1000:1000::/home/Jason:/bin/bash
[[email protected] ~]#


\>或\b:词尾锚定,用于单词模式的右侧,格式为PATTERN\>, PATTERN\b

[[email protected] ~]# fdisk -l | grep "/dev/[sh]d[a-z]\>"
Disk /dev/sda: 128.8 GB, 128849018880 bytes, 251658240 sectors
[[email protected] ~]#


\<PATTERN\>:单词锚定;

2)扩展正则表达式

  1) 字符匹配的命令和用法与基本正则表达式的用法相同,这里不再重复阐述。

        2) 次数匹配:

* :匹配其前面字符的任意次

[[email protected] ~]# cat muli.txt
good god goood food foolish gooooooooooogle
[[email protected] ~]# egrep ‘o*‘ muli.txt
good god goood food foolish gooooooooooogle
[[email protected] ~]#

.* :表示匹配任意字符

[[email protected] ~]# cat muli.txt
good god goood food foolish gooooooooooogle
[[email protected] ~]# egrep ‘l.*‘ muli.txt
good god goood food foolish gooooooooooogle
[[email protected] ~]#

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

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

{m,n} :匹配其前面字符m到n次


        3) 位置锚定的用法和基本正则表达式的用法相同,在此不再阐述。

           分组及引用:

 (pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;

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

或者:

  a|b:a或者b

[[email protected] ~]# egrep ‘C|is‘ test3.txt
Cat is not cat!
[[email protected] ~]#

 C|cat:表示C或cat

[[email protected] ~]# cat test3.txt
Cat is not cat!
[[email protected] ~]# egrep ‘C|cat‘ test3.txt
Cat is not cat!
[[email protected] ~]#

(C|c)at:表示Cat或cat

[[email protected] ~]# cat test3.txt
Cat is not cat!
[[email protected] ~]# egrep ‘(C|c)at‘ test3.txt
Cat is not cat!
[[email protected] ~]#



本文出自 “企鹅之逆袭风暴” 博客,请务必保留此出处http://xuelong.blog.51cto.com/10573089/1748866

以上是关于正则表达式及linux文本检查工具的主要内容,如果未能解决你的问题,请参考以下文章

linux文本处理工具及正则表达式

Linux之三剑客

Linux相识相知文本处理工具之grepegrepfgrep及正则表达式

Linux篇 | 文本处理工具和正则表达式

Linux学习第七课-文本处理工具及正则表达式

正则表达式及Linux三大文本处理工具