linux菜鸟入门之正则表达式

来源:互联网 发布:淘宝手机如何发布宝贝 编辑:程序博客网 时间:2024/06/06 04:22

正则表达式

正则表达式是一个不可不学的的好东西,有了正则表达式,就可以从成千上万条信息去匹配出自己想要的那一条信息。有了正则还可以对一个文本文件用一条命令就删除或替代一个不想要的字符。想要学好shell和更加快捷的管理我们的系统就必须学好正则表达式。


最开始接触正则应该都是grep命令开始的,这个命令是用来查找的。文本查找工具(根据模式来搜索文本,并将符合模式的文本行显示出来)。除了grep,他的家族还有egrep,fgrep。

这里就涉及单引号' 和双引号“ 。' 和 ”  都是为了让shell不去翻译某些元字符。只是单引号的强度更强,双引号的强度弱一点。在以后的使用中就可以感受到他们的不同。将/etc/passwd这个文件复制到家目录下来做一下练习来体验一下grep的用法。


grep 还有一些选项如跟上-i 忽视大小写,跟上-v 显示没被匹配到的。跟上-o只显示被匹配到的字符串


通配符:

*:任意长度的任意字符

?:任意单个字符

[]:字符集内的

[^]:字符集外的

字符集

[[:digit:]]              数字

[[:lower:]] 小写字母

[[:uper:]]             大写字母

[[:punct:]]            标点

[[:space:]]           空格

[[:alpha:]]            字母

[[:alnum:]]           数字和字母

[root@localhost test_xuexi]# grep '[[:digit:]]$'  /etc/inittab# multi-user.target: analogous to runlevel 3# graphical.target: analogous to runlevel 5[root@localhost test_xuexi]# grep '[[:alnum:]]$'  /etc/inittab# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target# multi-user.target: analogous to runlevel 3# graphical.target: analogous to runlevel 5# systemctl get-default# systemctl set-default TARGET.target




正则表达式:Regular Expression

由一些元字符指定


.  :匹配任意单个字符

[root@localhost wjx]# grep "r..t" passwd root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

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


a*b   可以匹配a  .   b.   aab,    aaab,  而不能匹配aaacb

a.*b   可以匹配a开头的,b结尾的


.*   可以匹配任意长度的任意字符


这里注意。点虽然是匹配一个字符。但如果光写一个点的话是匹配全文的!!



.*是匹配任意字符任意次数的意思


这里因为是前一个字母有0次或者任意多次,所以将b也匹配出来了,因为a出现了0次。其实就是匹配了b前有a或者无a的字符。


?:匹配前面的字符一次或者0次 (就是可有可无的意思)


为了使用?来匹配,这里就用到了单引号,还需要将?前加一个反斜杠才能起作用


\{m,n\} :匹配其前面的字符至少m次,至多n次

\{1,\}至少1次

\{,3\}至少3次



这里发现必须也得有一对单引号将其括起来才能生效。这里就匹配了a至少出现一次。


位置定位:

^: 定位出现的字符必须在最前面。

$:定位出现的字符必须在最后面。

^$:空白行


[root@localhost test_xuexi]# clear[root@localhost test_xuexi]# history |grep $aUsage: grep [OPTION]... PATTERN [FILE]...Try 'grep --help' for more information.[root@localhost test_xuexi]# history |grep '$a' 1104  history |grep $a 1105  history |grep '$a'
由上可知,最好加单引号!!!!


\<:其后面的任意字符必须作为单词首部出现

\>:其前面的任意字符必须作为单词尾部出现


\<root\>  就是查找root的这个单词

[root@localhost test_xuexi]# clear[root@localhost test_xuexi]# clear[root@localhost test_xuexi]# grep '\<root\>'  passwd root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[root@localhost test_xuexi]# grep '\<ro\>'  passwd [root@localhost test_xuexi]# 

也可以加\b加以限定。\b与\<     \>一模一样。当然如果这些正则用在grep的话是 -w 就可以了,一个效果


分组:

\(\)

\(ab*\)* 将ab作为一个整体来将ab出现0次或者1次。

[root@localhost test_xuexi]# grep '\(ab\)*' test ababcaaabaaaabcd

因为ab可以出现0次,所以全行都出来了。

tips:分组之后可以引用grep ‘\(l..e\).*\l’    这里就是说,如果前面的分组\(l..e\)匹配到love了 那后面的\l必须也得是love,也就是说一行得有一个love 和以love结尾的行才能被匹配。


正则表达式有几种

有基本正则表达式,扩展正则表达式。


 如grep 的-E 就支持扩展的正则表达式== egrep

 -A n 当某一行被匹配后,其后的n行也被匹配。

 -B n 同上,只不过是其前n行也被匹配。

 -C n 同上,只不过是其前n行和后n行被匹配。

扩展的正则表达式

匹配字符:

.

[]

[^]


匹配次数

*

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

{m,n}


分组

():分组真正的实现了分组。

\1,\2......


或者

a|b   :a或者b   如 (C|c)at  是Cat或者cat  而  C|cat是匹配Cat 或cat 或含C的行,或含有cat的行。


做一些练习吧

1.匹配以任意个空格开头的行

[root@localhost test_xuexi]# grep -E '^[[:space:]]+' /boot/grub2/grub.cfg   load_env   set default="${next_entry}"   set next_entry=   save_env next_entry   set boot_once=true   set default="${saved_entry}"  menuentry_id_option="--id"  menuentry_id_option=""  set saved_entry="${prev_saved_entry}"  save_env saved_entry  set prev_saved_entry=  save_env prev_saved_entry  set boot_once=true  if [ -z "${boot_once}" ]; then    saved_entry="${chosen}"    save_env saved_entry  fi  if [ x$feature_all_video_module = xy ]; then    insmod all_video  else    insmod efi_gop

2.匹配出一个ip地址









0 0
原创粉丝点击