学习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之间的信息也相同的行。