正则表达式在本周学习中是个难点和重点,其中难免会有很多坑,也难免会不停的往里跳,当跳的比较多了也就长记性了,通过很多次练习慢慢也就能发现其中暗藏玄机,成功的避开大坑选择往小坑里跳了,我相信在以后的学习中会不断进步、勤加练习终究会跳出来的。好了,以下是本人对正则表达式的一点理解,如有错误之处请联系我,会修改和学习的。
一、正则表达式之grep.
正则表达式是一种符号表示法,用于识别文本模式。Linux处理正则表达式的主要程序是grep。grep搜索与正则表达式匹配的行,并将结果输送至标准输出。
(1)正则表达式之匹配模式。
①格式
grep按下述方式接受选项和参数(其中,REGEXP表示正则表达式)
grep [option] REGEXP file
②具体选项
选项 | 含义 | 功能描述 |
-i | ignore case | 忽略大小写 |
-v | invert match | 不匹配匹配的 |
-l | file-with-match | 输出匹配的文件名 |
-L | file-without-match | 输出不匹配的文件名 |
-c | count | 输出匹配的数目(行数) |
-n | number | 输出匹配行的同时在前面加上文件名及在文件名中的行数 |
-h | no-filename | 抑制文件名的输出 |
③举例说明
1、 显示/proc/meminfo文件中以大小s开头的行
2、显示/proc/meminfo文件中不以s开头的行
3、显示/proc/meminfo文件中大s开头的行数
4、显示/proc/meminfo文件中大s开头的行数并且在文件名上加上行数
华丽的分割线
二、元字符的列表以及它们在正则表达式上下文中的行为
(1)字符匹配和次数匹配。
字符 |
说明 |
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 |
$ | 匹配输入字符串结束的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 |
* | 匹配前面的字符任意次,包括0次 贪婪模式:尽可能长的匹配 |
\+ |
匹配其前面的字符至少1次 |
\? | 匹配其前面的字符0或1次 |
\{n\} | 匹配前面的字符n次 |
\{n,\} | 匹配前面的字符至少n次 |
\{n,m\} | 匹配前面的字符至少n次,最多m次。 |
| | 或的意思。例如:"AAA|BBB"满足的例子AAA、BBBpp |
. | 任意字符。例如:"a.c"满足的例子abc、fapccdeng |
.* | 任意长度的任意字符 |
() | 将候选的所有元素放在()内,用|隔开。例如:"a(1|2|3)bc"满足的例子a1bc、mba3bcd |
[:alnum:] | 字母和数字,与[A-Za-z0-9]等价 |
[:alphp:] | 字母,与[A-Za-z]等价 |
[:digit:] | 数字,与[0-9]等价 |
[:xdigit:] | 十六进制字符,与[0-9A-Fa-f等价] |
[:blank:] | 空格和制表符 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:punct:] | 标点符号 |
定位出现的位置
字符 | 说明 |
^ | 行首锚定,用于模式的最左侧 |
$ | 行尾锚定,用于模式的最右侧 |
^PATTERN$ | 用于模式匹配整行 |
^$ | 空行 |
^[[:space:]]*$ | 空白行 |
\< 或 \b | 词首锚定,用于单词模式的左侧 |
\> 或 \b | 词尾锚定;用于单词模式的右侧 |
\<PATTERN\> | 匹配整个单词 |
三、元字符在正则表达式的具体应用
1、找出ifconfig命令结果中的0-255之间的数字。
ifconfig|grep -E "\<([0-9]|[1-9][0-9]|1[0-9][0-9]|25[0-5])\>"
2、找出/etc/passwd中的两位或三位数
cat /etc/passwd|grep "\<[0-9]\{2,3\}\>"
3、统计last命令中以root登录的每个主机IP地址登录次数
last|grep -o "^root\>.*[0-9]\.[0-9]\{1,3\}"|tr -s " "|cut -d" " -f3|uniq -c|sort -n
4、将此字符串:welcome to magedu linux 中的每个字符去重并排序,重复次数多的排到前面
echo 'welcome to magedu linux'|grep -o "."|sort|uniq -c|sort -nr
5、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo /etc/rc.d/init.d/funtions|egrep -o "[^/]+/?$"
6、使用egrep取出上面路径的目录名
echo '/etc/rc.d/init.d/functions'|grep -Eo "^/.*/"
7、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
cat /etc/rc.d/init.d/functions|grep -Eo "^[[:alnum:]_].*\(\)"
8、显示ifconfig命令结果中所有IPv4地址
ifconfig|egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"
9、利用df和grep,取出磁盘各分区利用率,并从大到小排序
df |grep /dev/sd |grep -o "\<[0-9]\{1,2\}\>"|sort -nr
10、添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行
cat /etc/passwd|grep -o "^\(.*\)\>.*\<\1$"
11、显示CentOS7上所有系统用户的用户名和UID
cat /etc/passwd |cut -d: -f1,3|grep "\<[0-9]\{1,3\}\>$"
12、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
netstat -tan|grep "LISTEN[[:space:]]\+$"
13、显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
cat /etc/grub2.cfg|grep "^[[:space:]]\+[^[:space:]]"
14、找出/etc/passwd中的两位或三位数
cat /etc/passwd|grep "[0-9]\{2,3\}"
本文转自 LUksl 51CTO博客,原文链接:http://blog.51cto.com/19940919/1952021