[8-27]正则表达式、扩展表达式以及相关实战
本文旨在复习正则表达式,扩展正则表达式,对基本概念、基本用法等作记录 知识储备
基本正则表达式BRE Usage:
grep [OPTIONS] PATTERN [FILE...] 常用参数 -v:显示模式匹配不到的行,取反,这里是小写。大写是Version 元字符: 字符匹配 . 匹配任意单个字符,请注意是单个 次数匹配
* 匹配前一个字符出现任意次,0次、1次、N次都可以 位置锚定
行为单位 词为单位 --> Linux中单词的定义和英文单词不一样,标点符号作为单独单词,连续字母or数字组成算单词 从上面的元字符我们可以看出来一件事,总是在强调匹配单个字符,如果对于lancelancexy如何去描述,或者说如何去匹配连续出现的2次lance呢? 分组: 使用(ABCDE)将多个字符捆绑起来作为整体,对整体你可以附加字符匹配、次数匹配等等; 扩展正则表达式BRE Usage:
egrep [OPTIONS] PATTERN [FILE...] 常用参数同基本正则表达式,参考前文 元字符: 字符匹配 ---> 同BRE
作业实战 3、显示/etc/passwd文件中以bash结尾的行 答:这道题没啥好说的,最基本的 bash+行尾锚定 4、显示/etc/passwd文件中的两位数或三位数 答:这道题除了如下写法,还可以使用&;限定词锚定 5、显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行 这道题没啥好说的,最后的*也可以用{0,}这种写法,不过要注意[:space:]外侧需要加括号,字符集均如此 6、添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找 这道题很有趣,当初我想用cut先切割/etc/passwd把用户名提取出来,然后通过管道送给grep来处理; 但是遇到2个难点:首先管道送给grep是送给grep当参数用,而我需要的是当grep的模式用;其次即便管道成功,那么cut切割后是N列用户名,而我需要是一次送一个用户名,还可能需要使用xargs,限于水平没这么做。 有人说我的&;.*&;范围太广不准确,其实我觉得正是因为范围广才不会出现漏情况。为何呢?因为/etc/passwd这个文件本身就是有规范的,不合法的用户名一定是不存在的,那么我用.*大范围一定能匹配到合法情况 不是吗? 7、显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在) 答:使用egrep的 | 匹配用户名 |请注意此时输出的是行!正则是以行为单位匹配和输出的 |cut切割显示 8、找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行 这道题解法各有不同,关键是你是如何理解和定义单词这个概念的?紧跟一组小括号,这里需要对()进行转义,否则在egrep中会把()当做分组处理。下面是我的写法,我用的是云服务器,截图不是全屏。 9、使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名 答: 基名:觉得简单但是当路径名结尾有/的时候,输出结果会携带/但这是不需要的,最终使用cut切割来解决豁然开朗 但是这样写其实也是有问题的,因为[:alnum:]匹配有限,如果是下面的情况那么就失效了 所以很难完完全全地考虑到所有情况解决这个问题,这道题能解决关键在于大部分人命名还是比较正常的。 目录名:这道题没想到太好的办法,多次过滤实现的 10、找出ifconfig命令执行结果中1-255之间的数字 思想很重要,主要是对1-255分层表述,数字1-9,数字10-99,数字100-199,数字200-249,数字250-255 在最初写得时候,我没有在两侧加上(),出现了下面的错误结果,这是因为如果没有()那么会将1028015这类也匹配到,这是为什么呢?因为|是针对整个左侧和右侧而言的,不加()意味着&;[1-9]是一个整体,你懂得 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |