正则表达式:是一种处理字符串的方法,以行为单位进行对字符串的处理行为,他通过一些特殊的符号辅助,以达到(搜寻,替代,删除)一列或多列字符串的目的。 不是工具,而是一种字符串处理的标准依据。与bash的global机制不是同一概念。
用途:对庞大的系统数据信息,可以透过正则表达式的功能,对信息进行优化处理。取出对使用者有用的信息,通过分析这些信息来管理庞大的系统。
分两类:基本正则表达式。扩展正则表达式。
基本正则表达式之grep:
常用选项:
1:--color=auto:对匹配到的文字进行着色。
2:-i :忽略字符的大小写, ignore case。
3:-o :只显示匹配到的文本本身。
4:-V ,--invert-match:反向匹配,也就是取反。
5:-E :支持扩展的正则表达。
6:-q :静默模式,运行时不产生反馈信息,不跟用户交互quite。
7: -f FILE --file=FILE FILE为每行包含了一个PATTERN了的文本文件,即为grep 的脚本。
8: -e 支持使用多模式机制, grep -e "pattern1" -e "pattern2" /etc
9: -A 打印匹配行的前n行
10: -B 打印匹配行的后n行
11:-C 打印匹配行的前后n行
基本正则表达式的字符分类:
基于字符匹配:
. :表示匹配任意的一个单一字符。
[] :匹配范围内的任意单个字符。
[^] :范围内的字符取反。表示取范围外的字符。
[:alnum:]代表英文大小写字符及数字集。亦即[0-9,a-z,A-Z]
[:alpha:]代表英文大小写集。亦即[a-z,A-Z]
[:digit:]代表数字集,亦即[0-9]
[:lower:]代表小写字符集,亦即[a-z],此处区分大小写。
[:upper:]代表大写字符集。亦即[A-Z]
[:space:]任何会产生空白的字符。 等等...
控制匹配次数的字符:在字符匹配的元字符后面,用于指定某字符匹配的次数。
* :重复前一个字符为0次或N次。
如 ‘123*',匹配12,123,123333.....。
. : 任意的单个字符,但不能包含空格符。
如 [.]\+ 除空格符外的所有字符
\+ :匹配前面字符至少1次。
如 '[[:lower:]]\+' 匹配所有的小写英文字符
\? :匹配前面的字符0次或1
如 ab\?c\? 可以匹配a, ab,ac,aa,aaabbb,abbbbbc,accc,acccb.
\{m,n\}:匹配其前面的字符最少m次,最多n次。
如 a\{1,3\} 匹配a,aa,aaa
\{m,\} :匹配其前面的字符最少m次,m为非负整数
如a\{1,\} 匹配a,aa,,aaa,aaa......。
\{0,n\}:其前面的字符最多出现n次。
如 a\{0,\} 等价于a*
\{m\}:前面的字符出现m次
如 A\{3\} 结果为AAA
位置锚定符:使用限制模式来搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置。
^:行首锚定符,用于模式的最左侧。^PATTERN
如“^grep ”,匹配所有以grep开头的头
$:行尾锚定符,用于模式的最右侧。 PATTERN$
如grep “grep$”,匹配所有grep结尾的行
^PATTERN$:要让PATTERN匹配一整行。
如“^t.*s$”。匹配所有以t开头以s结尾的行。
^[[:space:]]*$ 或^$都表示空行。注意^$中间不要有空格符,
\< 或\b :任意一组词的词首锚定符,用于这组词的左侧。\<PATTERN,\bPATTERN
“\<grep”。匹配所有以grep开头的字符。
\> 或\b:任意一组词的词尾锚地符,用于这组词的右侧。\<PATTERN,\bPATTERN
“grep\>”,匹配所有以grep结尾的字符。
\<PATTERN\>:基于这组词锚定。
“\<grep\> ,匹配所有包含grep字符的行
分组引用:
\(PATTERN\):将此PATTERN匹配到的字符当作一个不可分割的整体进行处理,此PATTERN匹配到的值会保存在正则表达式的内部变量中,记录为\1,\2,\3,...\n
例如:pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)中
\1表示引用pat2所匹配到的字符串:
\2表示引用pat4pat5pat6匹配到的字符串:
\3表示引用pat5匹配到的字符串:
后项引用:引用前面括号中的pattern中所匹配到的字符串。
egrep 扩展正则表达式的元字符:
字符匹配:
.:任意单个字符
[ ]:范围内的任意单个字符
[^ ]:范围外的任意单个字符
匹配次数:
*:任意次;
?:0次或1次;
+:1次或多次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{ 0,n}:最多n次
{m,} :最少M次
位置锚定:
^:行首锚定;
$:行尾锚定;
\<, \b:词首锚定;
\>, \b:词尾锚定;
分组及引用:
(pattern):分组,括号中的模式匹配到的字符会被记录于正则表达式引擎内部的变量中;
后向引用:\1, \2, ...\n
或者:
(C|c)at:表示Cat或cat
例题
1,显示/etc/passwd文件中不以bash结尾的行;
egrep -V “bash$” /etc/passwd -V表示取反。
2,找出/etc/passwd文件中的三位或五位数;
egrep -e "[[:digit:]]{3}" -e "[[:digit:]]{5}" /etc/passwd
-e表示支持多模式机制,但只能表示逻辑或。
3, 找出/etc/grub2.cfg文件中,以至少一个空白字符开头,后面又跟了非空白字符的行。
egrep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4,找出"netstat -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行
netstat -tan | egrep "LISTEN[[:space:]]*$"
5 找出"fdisk -l“命令的结果中,包含以/dev/后跟sd或hd及一个小字母的行
fdisk -l | egrep '/dev/(s|h)d[[:lower:]]{1}’
6 找出”ldd /usr/bin/diff“命令的结果中文件路径;
ldd /usr/bin/diff | egrep -o "/[^[:space]]*" -o表示只显示匹配本身。
7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;
egrep "^(s|S)" /PATH/basename grep "^[s|S]" /PATH/basename
grep -i ‘^s' /PATH/basename -i 表示忽略大小写
echo -e "^s \n^S " > filetest -e启用转义符
grep -f filetest /PATH/basename -f指定运行的脚本。
8、显示当前系统上root、centos或slackware用户的相关信息;
egrep "^(root|centos|slackware)\>" /etc/passwd
9、echo输出一个绝对路径,使用egrep取出其基名;
echo /etc/passwd | egrep -o "[^/]\{1,\}/?$"
10、找出ifconfig命令结果中的1-255之间的整数;
ifcofig | egrep "\<([1-9]|[1-9][0-9]|2[0-4][0-9]|25[0-5])\>"
11、添加用户bash、testbash、basher及nologin,要求前三个用户的默认shell为/bin/bash, nologin的默认shell为/sbin/nologin,而后找出其用户名与shell名相同的用户;
grep "\(^[[:alnum:]]\+\).*\1$”/etc/passwd
https://blog.51cto.com/3426079/1749802