bash正则表达式基础

基础篇

基础正则表达式:

          ^ 作用:匹配开头的行

          例:#匹配以bin开头的行

          grep  '^bin' /ect/passwd

          $作用:匹配以bash结尾的行

          例:#匹配以shutdown结尾的行

          grep  'shutdown$'  /etc/passwd

          * 作用:前一个字符匹配0或任意多次

          例:#匹配全部内容,包含空白行

          grep  'o*' /etc/passwd

              # 匹配至少包含一个o的行

           grep  'oo*'  /etc/passwd

          . 作用匹配出换行符外的任意一个字符

          例:#匹配h和m这两个字母之间一定有两个字符的单词的行

          grep  ‘h..m’ /etc/passwd

          [] 作用:匹配中括号中指定的任意一个字符,只匹配一个字符烦人行

          例:#匹配任意一位数字的行

          grep [0-9] /etc、passwd

          \ 作用:转义符。用于取消讲特殊符号的含义取消

          例:查找含有单引号的行

          grep \' /etc/init.d/iptables

          [^]作用: 匹配除中括号的字符以外的任意一个字符

          例:[^0-9] 匹配任意一位非数字字符

          grep [^0-9] /etc/passwd

          \{n\} 作用:表示其前面的字符恰好出现n次

          例:#匹配有3个w开头的行

          grep 'w\{3\}' /etc.passwd

          \{n,\}作用:表示其前面的字符出现不小于n次

          例:# 匹配最少用连续三个数字开头的行

          grep ‘^[0-9]\{3,\}’ /ect/passwd

          \{n,m\} 作用:表示其前面的字符至少出现n次,最多出现m次

          匹配r和t之间最少一个o最多两个o的单词的行

          grep 'ro\{1,2}t' /etc/passwd

           \(\) 作用:分组 小括号有特殊意义要用反斜线

          注意:分组中的模式,在每次匹配过程中所匹配到的字符,(匹配的 字符可以被grep记忆保存到变量中,这些变量是\1,\2   "\1 ,\2 引用表示每个分组中的变量 ")

单词牟定:有非特殊字符组成的连续的字符串:

             \< :牟定词首 ,也可用\b

                   grep "\<ro" /etc/passwd
              \>:锚定词尾,也可用\b
                    grep "\>ro" /etc/passwd
              锚定整个次词  grep "\>root\>" /etc/passwd
扩展正则表达式:
    

+ 意义:重复『一个或一个以上』的前一个 RE 字符
范例:搜寻 (god) (good) (goood)... 等等的字串。 那个 o+ 代表『一个以上的 o 』所以,底下的运行成果会将第 1, 9, 13 行列出来。
egrep -n 'go+d' regular_express.txt
? 意义:『零个或一个』的前一个 RE 字符
范例:搜寻 (gd) (god) 这两个字串。 那个 o? 代表『空的或 1 个 o 』所以,上面的运行成果会将第 13, 14 行列出来。 有没有发现到,这两个案例( 'go+d' 与 'go?d' )的结果集合与 'go*d' 相同? 想想看,这是为什么喔! ^_^
egrep -n 'go?d' regular_express.txt
| 意义:用或( or )的方式找出数个字串
范例:搜寻 gd 或 good 这两个字串,注意,是『或』! 所以,第 1,9,14 这三行都可以被列印出来喔!那如果还想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
() 意义:找出『群组』字串
范例:搜寻 (glad) 或 (good) 这两个字串,因为 g 与 d 是重复的,所以, 我就可以将 la 与 oo 列於 ( ) 当中,并以 | 来分隔开来,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+ 意义:多个重复群组的判别
范例:将『AxyzxyzxyzxyzC』用 echo 叫出,然后再使用如下的方法搜寻一下!
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是说,我要找开头是 A 结尾是 C ,中间有一个以上的 "xyz" 字串的意思~

 

 

 

 练习:
   1、显示/proc/meminfo文件中以大写或小写S开头的行;用三种方式;
   # grep -E "^[sS]" /proc/meminfo
   # grep -E "^(s|S)" /proc/meminfo
   # egrep -i "^s" /proc/meminfo
 
   2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
   # egrep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
 
   3、显示/etc/passwd文件中其默认shell为/bin/bash的用户;
   # egrep "/bin/bash$" /etc/passwd | cut -d: -f1
 
   4、找出/etc/passwd文件中的一位数或两位数;
   # egrep --color=auto "\<[0-9]{1,2}\>" /etc/passwd
 
   5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
   # egrep "^[[:space:]]+" /boot/grub/grub.conf
 
   6、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
   # egrep "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit
 
 
   7、打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
   # netstat -tan | egrep "LISTEN[[:space:]]*$"
 
   8、添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
   # egrep "^([[:alnum:]]+\>).*\1$" /etc/passwd
 
   9、显示当前系统上root、fedora或user1用户的默认shell;
   # grep -E "^(root|fedora|user1)\>" /etc/passwd | cut -d: -f7
 
   10、找出/etc/rc.d/init.d/functions文件中某单词后面跟一组小括号的行,形如:hello();
   # grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
 
   11、使用echo命令输出一个绝对路径,使用grep取出其基名;
    扩展:取出其路径名
 
    # echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1
 
   12、找出ifconfig命令结果中的1-255之间数字;
   # ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"

 

        

转载于:https://www.cnblogs.com/boxs/p/4388457.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值