grep/egrep和正则表达式汇总
grep,egrep,fgrep 语法格式: grep [option] ... 'PATTERN' FILE --color=auto 对目标FILE进行搜索,显示能够匹配的行 正则表达式 基本正则: grep 扩展正则: grep -E 或者 egrep fgrep: fast但是不支持正则表达 基本正则表达式的元字符: 字符匹配: . 匹配任意单个字符 [] 匹配指定范围内的单个字符 [0-9],[[:digit:]] 单个数字 [a-z],[[:lower:]] 单个小写字符 [A-Z],[[:upper:]] 单个大写字符 [[:space:]] 单个空白字符 [[:punct:]] 单个标点符号 [[:alpha:]] 单个字母 [[:alnum:]] 单个字母或者数字 [^] 表示取反 次数匹配元字符: 用于实现指定其前面的字符所能够出现的次数 * 任意长度, 他前面的字符可以出现任意次 例如: x*y 可匹配: xy,xyy,y ? 0次或1次, 它前面的字符是可有可无的 例如: x?y 可匹配: xy,y,ay {m} m次, 它前面的字符要出现m次 例如: x{2}y 可匹配: xxy,xxxy {m,n} 至少m次,至多n次 例如: x{2,5}y 可匹配: xxy,xxxy,xxxxy,xxxxxy {m,} 至少m次 {0,n} 至多n次 .* 任意长度的任意次 工作于贪婪模式: 尽可能多的去匹配 位置锚定: ^ 行首锚定: 写在模式最左边 $ 行尾锚定: 写在模式最右边 ^$ 空白行 单词 - 不包含特殊字符的连续字符组成的串 &; 词首, 出现于单词左侧 &; 词尾, 出现于单词右侧 分组: () 例如: (ab)* 可匹配 ababababab 分组中的模式匹配到的内容, 可由正则表达式引擎记忆在内存中,之后可被引用 引用: 例如 (ab(x)y).*(mn) 括号是有编号的, 自左向右的左括号,以及与其匹配的右括号中间的内容 数左括号 # 引用第n个括号所匹配到的内容, 而非模式本身 例如 (ab?c).*1 这里的1 代表的是(ab?c) 匹配到的内容 比如abcxxxxabc,可以被匹配到 先匹配abc,然后正则将分组中匹配到的abc记录到内存中,匹配.*, 然后继续调用1,为abc才匹配 abcmnaaa abcmnabc abcmnac acxyac 或者: (|) a|b: a或者b 命令选项: -v: 反向选取 eg: 全选非空白行 grep -v "^$" /etc/issue -o: 仅显示匹配的字符串,而非字符串所在的行 -i: 忽略字符大小写 -i "cat" 则每一个字符都不区分大小写, Cat CAt cAt cAT都满足 -E: 支持使用扩展正则表达式 -A # 同时显示匹配内容的后一行 -B # 同时显示匹配内容的前一行 -C # 同时显示匹配内容的前后各一行 练习: 1、显示/proc/meminfo文件中以大写或小写S开头的行; #grep "^[sS]" /proc/meminfo #grep -i "^s" /proc/meminfo #grep -E "^(s|S)" /proc/meminfo 2、显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户; #grep -v "/sbin/nologin" /etc/passwd 3、显示/etc/passwd文件中其默认shell为/bin/bash的用户; 进一步:仅显示上述结果中其ID号最大的用户; #grep "bin/bash" /etc/passwd #grep "bin/bash" /etc/passwd | sort -n -t: -k3 | tail -1 4、找出/etc/passwd文件中的一位数或两位数; #grep "&;[0-9][0-9]?&;" /etc/passwd 5、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; # grep "^[[:space:]]{1,}" /boot/grub/grub.conf 6、显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; #grep "^#[[:space:]]{1,}[^[:space:]]{1,}" /etc/rc.d/rc.sysinit 7、找出netstat -tan命令执行结果中以'LISTEN'结尾的行; #netstat -tan | grep "LISTEN$" ??? 8、添加用户bash,testbash,basher,nologin(SHELL为/sbin/nologin),而找出当前系统上其用户名和默认shell相同的用户;
#grep "^([[:alnum:]]{1,}):.*1$" /etc/passwd 先锚定行首,匹配至少一个数字或字母,并分组,加上第一个:,然后任意字符,最后行尾匹配1 9、扩展题:新建一个文本文件,假设有如下内容: He like his lover. He love his lover. He like his liker. He love his liker. 找出其中最后一个单词是由此前某单词加r构成的行。 ===================================================================== 练习:使用扩展的正则表达式 10、显示当前系统上root、fedora或user1用户的默认shell; #egrep 'root|richie|jingming' /etc/passwd | cut -d: -f7 11、找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行; #grep -o -E "&;[[:alnum:]]+&;()" /etc/rc.d/init.d/functions 12、使用echo命令输出一个路径,而后使用grep取出其基名; #echo "/etc/sysconfig" | grep -E "[^/]+/?$" 非反斜线的字符至少。*一个匹配到行尾 13、找出ifconfig命令结果中的1-255之间的数字; #ifconfig | egrep "&;([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])&;" 14、挑战题:写一个模式,能匹配合理的ipv4地址; 1.0.0.1-239.255.255.255 ============================================================================ 博客作业, 写清楚grep和egrep的各个元字符的意义和给出实例说明用法 基本正则表达式: 字符匹配: . 匹配单个任意字符 [] 匹配指定范围内的任意单个字符 [^]匹配到的内容取反 eg: [^M] 次数匹配: * 在*符号的前一个字符可以出现任意次 ? 在?符号的前一个字符可以出现0次或者1次 {m} 在{m}符号之前的那个字符,必须出现m次 {m,n} 在{m,n}符号之前的那个字符,可以出现最少m次,最多n次 {m,} 在{m,} 符号之前的那个字符, 至少出现m次 {0,n} 在{0,n} 符号之前的那个字符,至多出现n次 .* 匹配任意长度的任意字符 工作于贪婪模式,系统会尽可能的去多匹配符合的 位置锚定 ^ 锚定行首 $ 锚定行尾 ^$ 锚定空行 单词: 不包含特殊字符的连续字符组成的串 &; 词首, 出现于单词的左侧 b也可 &; 词尾, 出现于单词的右侧 b也可 分组: () 分组中的模式匹配到的内容, 可以又正则表达式引擎记忆在内存中, 之后可以再次以 #的形式被引用 引用: ()是有编号的: 自左向右的左括号,以及与其匹配的右括号 #: 引用第n个括号所匹配到的内容,而非模式本身 例如文件内内容为: abcmnxabcmnx abcmnxbc abcmnxc abcmnxx eg: (a(b(c))mn(x)).*# 1 引用到的内容就是(a(b(c))mn(x))匹配的内容为 abcmnxabcmnx 2 引用到的内容就是(b(c)) 匹配到的内容为 abcmnxbc 3 引用到的内容就是(c) 匹配到的内容 abcmnxc 4 引用到的内容就是(x) 匹配到的内容 abcmnxx 工作于贪婪模式,系统会尽可能的去多匹配符合条件的内容。 所以实际上,一些子串也会被匹配到 grep命令 grep [options] PATTERN [FILE...] grep [options] [-e PATTERN] -f [FILE] [FILE...] -v 反向选取 -o 仅显示匹配的字串, 而非字串所在的行 -i ignore-case, 忽略大小写 -E 支持使用扩展正则表达式 -A # after-context -B # before-context -C # context ================================================================== 扩展正则表达式: 字符匹配: . [] [^] 次数匹配: * ? + {m} {m,n} {m,} {0,n} 位置锚定: ^ $ &;,b &;,b ^$ 分组: () 引用: 1,2,3 ... 或者: a|b a或者b eg:conC|cat是 concat或conCat? no 还是conC 或cat?? yes con(C|c)at 是conCat或concat egrep命令 grep -E 'PATTERN' FILE... egrep 'PATTERN' FILE... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |