Linux学习笔记(三)-正则表达式
Linux正则表达式
grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配文本。
fgrep :快速grep,这个版本匹配固定字符串而非正则表达式。并且是唯一可
grep:
作用:文本过滤,文本搜索工具,根据用户指定的模式对目标文本进行匹配检查,打印匹配结果
模式:由正则表达式字符及文本所填写的过滤条件,
正则表达式有两类:
基本正则表达式:BRE
扩展正则表达式:ERE
表达式:grep [OPTIONS] PATTERN [FILE...]
选项:
--color=auto:对匹配到的文本着色显示
-v: 显示不能够被pattern匹配到的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串
-s:不显示错误信息,通常与-q并用
-q:静默模式,不输出任何信息
-A #:after ,后#行
-B #:before,前#行
-C #:context,前后各#行
基本正则表达式介绍
正则表达式组成
一般字符:没有特殊意义的字符
元字符(meta字符):在正则表达式中有特殊意义
元字符匹配
.:匹配任意单个字符;
\:通常用于打开或关闭后续字符的特殊含义,如\(...\)与{...\}
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
*:匹配前面的字符任意次;
例如:grep "x*y"
abxy
xay
.*:任意长度的任意字符;
+ : 匹配前面正则表达式的一个或多个扩展
? : 匹配前面正则表达式的零个或一个扩展
| : 匹配|符号前或后的正则表达式
( ) : 匹配方括号括起来的正则表达式群
\?:匹配其前面的字符0或1次,即前面的可有可无;
例如:x\?y
xy,y,ay
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
例如:x\{2\}y
xy,xxy,y,xxxxy,xyy
\{m,n\}:匹配前面的字符至少m次,至多n次;
例如:x\{2,5\}y
xy,y,xxy
\{0,n\}:匹配前面的字符至多n次
\{m,\}:匹配前面的字符至少m次
字符集[::]
[:alnum:]:数字字符
[:digit:] : 数字字符
[:punct:] : 标点符号字符
[:alpha:] : 字母字符
[:graph:] : 非空格字符
[:space:] : 空格字符
[:blank:] : 空格与定位字符
[:lower:] : 小写字母字符
[:upper:] : 大写字母字符
[:cntrl:] : 控制字符
[:print:] : 可显示的字符
[:xdigit:] : 16进制数字
位置锚定
位置锚定:
^: 行首锚定;
写在模式最左侧
$: 行尾锚定:
写在模式最右侧
^$: 空白行
不包含特殊字符的连续字符组成的串叫单词:
\<或\b: 词首,出现于单词左侧,
\>或\b: 词尾,出现于单词右侧,
\:匹配整个单词:
分组
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理;
例如:\(ab\)*
分组中的模式匹配到的内容,可由正则表达式引擎记忆在内存中,之后可被引用
引用
例如\(ab\(x\)y\).*\(mn\)
有编号:自左而后的左括号,以及与其匹配右括号
\(a\(b\(c\)\)mn\(x\)\).*\1
\#: 引用第n个括号所匹配到的内容,而非模式本身
例如:
\(ab\?c\).*\1
abcmnaaa
abcmnabc
abcmnac
acxyac
练习(1)
1、显示/proc/meminfo文件中以大写或小写S开头的行;
grep -i '^s' /proc/meninfo
grep '^[Ss]' /proc/meninfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行;
grep -v '/bin/bash$' /etc/passwd
3、显示/etc/passwd文件中ID号最大的用户名;
sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4、如果用户root存在,显示其默认的shell程序;
id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的两位或三位数;
grep "\<[0-9]\{2,3\}\>" /etc/passwd
6、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存在空白字符的行;
grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
7、找出”netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
netstat -tan | grep "[LISTEN[[:space:]]*$"
8、添加用户bash、testbash、basher以及nologin(其shell为sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行,
useradd bash
useradd basher
useradd testbash
useradd -s /sbin/nologin nologin
grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
练习(2)
1、写一个脚本,实现如下功能
如果user1用户存在,就显示其存在,否则加之;
显示添加的用户的id号等信息;
#!/bin/bash
id user1 &> /dev/null && echo "user1 exists." || useradd user1
id user1
2、写一个脚本,完成如下功能
如果root用户登陆了当前系统,就显示root用户在线;否则说明其未登陆
w | grep "^root\>" &> /dev/null && echo "root logged" || echo "root not logged."
egrep及扩展的正则表达式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
扩展正则表达式的元字符:
字符匹配:
.
[]
[^]
次数匹配:
*
?:0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
锚定:
^
$
\<,\b
\>,\b
分组:
()
后向引用:\1,\2.....
或者:
a|b
(C|c)at:C或cat
练习(3)
1、显示当前系统root、centos或user1用户的默认shell和UID
grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
2、找出/etc/rc.d/init.d/funtions文件(centos)中某单词后面跟一个小括号的行
grep -E -o "^[_[:alpha:]]+(\)" /etc/rc.d/init.d/funtions
3、使用echo输出一绝对路径,使用egrep取出其基名
echo "/mmt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
进一步使用egrep取出路径的目录名,类似于dirname命令的结果
fgrep :不支持正则表达式搜索
|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/20
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
作者:废权
链接:https://blog.yjscloud.com/archives/20
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
0
二维码

Linux学习笔记(三)-正则表达式
Linux正则表达式
grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。
egrep : 扩展式grep,其使用扩展式正规表达式(ERE)来匹配……

文章目录
关闭
共有 0 条评论