正则表达式及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文本检查工具的主要内容,如果未能解决你的问题,请参考以下文章