Linux 正则表达式一些题目的详解

学习Linux 也快一个月了,这两天学习了正则表达式,对于我这个新手来说确实有些吃力,但是通过这几天的学习还是掌握了一定得正则表达式的知识,下面给大家分享几道我做过的觉得还不错的题目,我会在给出答案的同时加上尽可能详细的解释。

1.显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行

   [root@centos7 ~]#grep "^[[:space:]].\+[^[:space:]]" /etc/grub2.cfg

这道题要求显示指定目录文件中的以至少一个空白字符开头并且后面存在非空白字符的行。那么看到这句话我们首先想到的应该是至少一个+空白字符[:space:]开头^非空白^[:space:]好了接下来要做的事情就是把他们合理的组合在一起就可以了,先打上^[[:space:]]代表只要空白字符开头的行,然后是.表示匹配前面的空白字符,.后面的+代表匹配至少一次前面的空白字符,也就是说前面需要的行的开头的空白字符最少一个最多不限,[^[:space:]]表示需要的行的后面存在非空白字符,由于题目没有说明后面存在多少非空白字符,也就不匹配了,最后在两边加上英文的双引号,最后在后面加上匹配的文件目录就OK了。(注意:[:space:]外的中括号并不是代表筛选单一字符,而是空白符的表示形式,因此引用[:space:]的时候外面还要再加上中括号)

2.显示CentOS7上所有系统用户的用户名和UID

[root@centos7 ~]#cut -d: -f1,3 /etc/passwd |grep "\<[[:digit:]]\{1,3\}\>"

系统用户在CentOS7中的UID号是0-999,而用户名位于/etc/passwd 的第一列,UID位于第三列,因此我们首先做的就是把passwd文件中的第一列和第三列分离出来,这里就用到了cut指令,-d指的是引用后面的分隔符,:而就是我们引用的分隔符,用它将passwd文件看成由:分割开来的多个列,-f指的是选择第几列,若是选择多列,就加上逗号,后面跟上需要的第几列的号。分离完成后,需要做的就是排除非系统用户即UID大于1000以上的用户,[[:digit:]]代表匹配一个单一的数字,{1,3}则说明对于前面的数字最多匹配三次最少一次,也就是最多三位数,最少一位数,这样也就规定了匹配到的用户仅限于UID0-999的范围内,但是如果就这样打上去你会发现非系统用户还是显示了,这是为什么呢,因为我们只是选择了三位数,但是当四位数字出现的时候,计算机依然会我们去匹配他的中间的三位,例如2548,计算机就会把254和548都匹配出来这样也就会出现四位数了,所以这时我们在给开头加上一个<,给末尾加上一个>他们的意思就是词首(词尾)锚定,即到这就停止前面(后面)的都不要,这时候再打上去就会过滤掉UID大于999的用户了。
3.添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名同shell名的行

   [root@centos7 ~]#cat /etc/passwd|grep "\(^.*\)\>.*/\1$"

首先是创建用户,他的命令是useradd 然后空格跟上用户名,而添加nologin的时候,后面要求为其分配默认的shell,那我们就使用这样一条指令,useradd -s /sbin/nologin nologin ,-s 是useradd的一条选项,可以在创建用户的同时,为其制定默认的shell,用户创建完毕,接下来就是找出passwd文件中,用户名和其自己的shell相同的行,那么该如何表示这些不同的用户名呢,在表示用户名之前,先说一个概念叫做后向引用,他的意思就是\(\)内的内容在后面可以再次引用并且可以选择引用的次数,例如\([a][b]\)表示将括号内的多个字符绑在一起当作一个字符进行使用,在后面可以通过\1的方式再次引用一次这个字符集合,如果要引用多次可以将1换成别的数字或者表示次数的正则表达式,这样就很好的呼应了这道题要求前后一样的要求,那么,passwd文件中的用户名可能为数字或者大小写字母,我们就用.*来表示,再加上一个托字符^来表示这个小括号内的字符集和所匹配的内容位于行的开头也就是用户名,结尾加上\>,和上题一样,表示到此就停止,要不然计算机会为我们匹配用户名之后的符合字符集合的内容,接下来就是其他一些信息,我们也用.*表示,再加上/如果不加的话计算机就会匹配多余的行,例如用户名sh 的用户的shell 是bash ,也会被显示出来,然而这并不是题目所要求的,最后的最后敲上我们一开始说的\1,然后用$表示这是行尾,没有的话,匹配出来的就不是全部都是用户名和shell相同的行了,会出现用户名和shell之间的信息也相同的行。


©著作权归作者所有:来自51CTO博客作者腿快抖断了的原创作品,请联系作者获取转载授权,否则将追究法律责任

https://blog.51cto.com/u_11093860/1965793

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
正则表达式是一种在文本中匹配、查找模式的强大工具,也是Linux操作系统中常用的工具之一。它可以用于文本处理、搜索、验证或者替换等任务。 Linux正则表达式的语法规则如下: 1. 基本字符匹配:使用普通字符直接匹配文本中的字符。 2. 元字符:元字符是具有特殊含义的字符,例如"."表示匹配除换行符外的任意字符,"*"表示匹配前面的字符零次或多次。 3. 字符类:使用方括号来定义一个字符类,方括号内的字符表示任意一个字符,例如"[abc]"表示匹配字符"a"、"b"或"c"。 4. 反向字符类:在方括号内使用"^"表示取反,例如"[^abc]"表示匹配除"a"、"b"、"c"之外的任意字符。 5. 转义字符:使用反斜杠加上特殊字符来匹配这些特殊字符本身,例如"\."匹配字符"."。 6. 重复限定符:使用重复限定符可以指定一个模式出现的次数,例如"*"表示零次或多次,"+"表示一次或多次,"?"表示零次或一次。 7. 分组:使用小括号来分组表达式,分组内的模式被当作一个整体进行处理。 8. 锚点:使用锚点可以限制匹配的位置,例如"^"表示匹配文本开头,"$"表示匹配文本结尾。 在Linux中,可以使用多个工具来处理正则表达式,例如grep、sed、awk等。grep命令是最常用的工具之一,用于在文本中搜索匹配正则表达式的行。sed命令可以用来实现对文本的编辑和转换,awk则是用于在文本中查找并处理模式的工具。 总结来说,Linux正则表达式是一种强大的在文本中匹配和处理模式的工具,掌握它可以帮助我们高效地处理文本数据。了解其基本语法规则,并熟练运用相关工具,可以提升日常工作中的效率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值