码迷,mamicode.com
首页 > 其他好文 > 详细

grep, egrep及相应的正则表达式用法详解

时间:2015-04-07 07:20:26      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:文本文件   linux   表达式   

grep, egrep及相应的正则表达式用法详解
Linux的哲学思想一切皆文件(包括硬件);使用文本文件保存程序的配置数据;掌握一种强大的文本搜索工具将是linux运维人员的的必备技能,grep全称 (Globel Search REgular Expression and Printing out the line)全局搜索正则表达式并匹配到的行打印出来)是Linux系统中一种强大的文本搜索工具,能根据用户指定的文本模式(正则表达元字符以及正常字符组合而成)对目标文件进行逐行搜索,并把匹配到的显示到屏幕;不影响原文件内容;grep家族包括 有grep、egrep和fgrep(fgrep:不支持正则表达式;搜索速度更快)。 egrep表示扩展的grep,比grep支持更多的元字符,
grep 使用格式:
grep [OPTIONS] PATTERN [FILE...]
grep  选项  模式  文件
#grep 在搜索的模式中含有空白字符必须使用引号;单引和双引号都可以;grep模式中如果包含变量的时候必须加双引号
grep 常用选项
 --color[=WHEN], --colour[=WHEN]  : 搜索到匹配的文本时进行语法着色,可将grep --color=auto 定义为alias
      --color=auto : 自动为语法着色
     例子:grep --color=auto "root" /etc/passwd
 -o: 只显示被模式匹配到的内容,而不是整个行
 -i: ignore case,匹配时不区分字符大小写
 -v: 反向选取,显示不能够被模式匹配到的行
 -E:使用扩展的正则表达式
 -A #:匹配到的行时,并显示该行后面的#行(#表示数值)
 -B #:匹配到的行时,并显示该行前面的#行(#表示数值)
 -C # 匹配到的行时,并显示该行前后的各#行(#表示数值)

正则表达式:REGular EXPression REGEXP
正则表达式是什么? 正则表达又一些是由元字符及正常字符所书写的模式,其中的元字符不表示字符本身的意义,而是用于表达控制或通配等功能;这就是grep的搜索模式(Pattern)做为过滤文本的条件。
 正则表达式分为:
  基本正则表达式 : grep
  扩展正则表达式: grep -E, egrep

基本正则表达式元字符:
 字符匹配:(通常只用于匹配单个字符)
  . : 匹配任意单个字符
  [] :  匹配指定范围内的任意单个字符
  [^] :  匹配指定范围外的任意单个字符
   [0-9], [[:digit:]] : 所有数字
   [^0-9], [^[:digit:]] :  出数字以外的其他字符
   [a-z], [[:lower:]] :所有的小写字母
   [A-Z], [[:upper:]] :所有的大写字母
   [a-zA-Z], [[:alpha:]] :所有的字母
   [0-9a-zA-Z], [[:alnum:]]  : 所有的数字和字母
   [[:space:]] : 空白字符
   [[:punct:]] : 所有标点符号

显示 /etc/rc.d/rc.sysinit  文件中,以大写C或c后面跟了a的行
# grep ‘[cC]a‘ /etc/rc.d/rc.sysinit
显示 /etc/rc.d/rc.sysinit  文件中,以大写N或小写n后面跟任意单个字符的行
# grep ‘[Nn].‘ /etc/rc.d/rc.sysinit
显示 /etc/rc.d/rc.sysinit  文件中,以大写N或小写n后面跟一个非字母的行
# grep ‘[Nn][^[:alpha:]]‘ /etc/rc.d/rc.sysinit

次数匹配:在期望匹配字符后面提供一个控制符,用于表达匹配其前面字符指定的次数
*  : 匹配其前字符任意长度,表示0次、1次或多次;
.* : 任意长度的任意字符;此时工作于贪婪模式(尽可能长的匹配)
\? :匹配其前字符0次或1次;(表示其左侧字符可有可无)
\+ : 匹配其前字符1次或多次;(表示其左侧字符至少出现1次)
\{m\} :表示其前字符精确出现m次;
\{m,n\} :其前字符至少出现m次,最多出现n次;
\{0,n\} :其前字符至多出现n次;
\{m,\} :其前字符至少出现m次
 
显示/etc/passwd中,roo后跟了t,t只出现0次或一次的行
# grep "root\?" /etc/passwd
显示/etc/passwd中,r后跟了o后跟了t,o至少出现1次的行
# grep "ro\+t" /etc/passwd
显示/etc/passwd中,r后跟了o,o只出现2次的行
# grep --color "ro\{2\}" /etc/passwd
显示/etc/passwd中,r后跟了o,o出现至少1次至多2次的行
# grep --color "ro\{1,2\}" /etc/passwd

位置锚定:
 ^: 锚定行首;使用格式:^WORD
 $: 锚定行尾;使用格式:WORD$
 ^PATTERN$:用模式来匹配整行;
 ^$ : 匹配空白行(空白行不等同于空白字符行);
 单词锚定 :由非特殊字符组成的连续的字符串
  \< :锚定词首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
  \> :锚定词尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
  \<PATTERN\>:匹配PATTERN能匹配到的整个单词
 分组:\(\)
  注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用;
   \1: 引用,模式中自左向右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
   \2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容
显示/etc/passwd文件,以sh开头的行
# grep "^sh" /etc/passwd
显示/etc/passwd文件,以sh开头中间跟了任意字符后以sh结尾的行
# grep "^sh.*sh$" /etc/passwd
显示/etc/rc.d/rc.sysinit 文件,以空白字符开头,空白字符出现任意次的行
# grep "^[[:space:]]*$" /etc/rc.d/rc.sysinit
显示/etc/rc.d/rc.sysinit 文件,空白行(行中不包含任意字符的行)
# grep "^$" /etc/rc.d/rc.sysinit
显示/etc/passwd文件,以sh作为单词词首的行
# grep "\<sh" /etc/passwd #等同于 # grep "\bsh" /etc/passwd
显示/etc/passwd文件,以sh作为单词词尾的行
# grep "sh\>" /etc/passwd #等同于 # grep "sh\b" /etc/passwd
从ifconfig命令结果中取得两位的数字
# ifconfig | grep "\<[[:digit:]]\{2\}\>"
显示/etc/rc.d/rc.sysinit 文件中以大写N或小写n后面了跟了任意个非字母的行
# grep "[Nn][^[:alpha:]]*" /etc/rc.d/rc.sysinit
显示/proc/meminfo文件中以大写或小写S开头的行;用两种方式;
# grep "^[sS]" /proc/meminfo
# grep -i "^s" /proc/meminfo
显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户;
# grep -v "/sbin/nologin$" /etc/passwd | cut -d: -f1
显示/etc/passwd文件中其默认shell为/bin/bash的用户;
# grep "/bin/bash$" /etc/passwd | cut -d: -f1
找出/etc/passwd文件中的一位数或两位数;
# grep "\<[0-9]\{1,2\}\>" /etc/passwd
显示/boot/grub/grub.conf中以至少一个空白字符开头的行;
# grep "^[[:space:]]\+" /boot/grub/grub.conf
显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行;
# grep "^#[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit
打出netstat -tan命令执行结果中以‘LISTEN’,后或跟空白字符结尾的行;
# netstat -tan | grep "LISTEN[[:space:]]*$"
添加用户bash, testbash, basher, nologin (此一个用户的shell为/sbin/nologin),而后找出当前系统上其用户名和默认shell相同的用户的信息;
# useradd -s /sbin/nologin nologin <--指定nologin用户的默认shell 为/sbin/nologin
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
# grep "^\(.*\):.*\1$" /etc/passwd

扩展的正则表达式:
字符匹配:(和基本正则表达式表示的含义一直)
 . : 匹配任意单个字符
 [] :匹配指定范围内的任意单个字符
 [^] :匹配指定范围外的任意单个字符
次数匹配:
 *: 匹配其前字符任意长度,表示0次、1次或多次;
 ?:匹配其前字符0或1次
 +: 匹配其前字符至少1次
 {m}:精确匹配匹配其前字符m次;
 {m,n}:匹配其前字符至少m次,至多次;
 {m,}:匹配其前字符至少m次;
位置锚定:
 ^ :锚定行首;使用格式:^WORD
 $ :锚定行尾;使用格式:WORD$
 \<, \b :锚定词首,也可用\b ;使用格式: \<PATTERN 或\bPATTERN
 \>, \b :锚定词尾,也可以用\b ;使用格式: PATTERN\>或PATTERN\b
分组:\(\)
 注意:分组中的模式,在某次的具体匹配过程中所匹配到的字符,可以被grep记忆(保存于内置的变量中,这些变量是\1, \2, ...),因此,还可以被引用;
  \1: 引用,模式中自左向右,由第一个左括号以及与之对应的右括号中的模式所匹配到的内容;
  \2: 引用 ,模式中自左右,由第二个左括号以及与之对应的右括号中的模式所匹配到的内容
或者:
 a|b:a或者b
  或者是匹配|两侧的所有内容;

支持扩展的正则表达式命令:grep -E PATTERN FILE... ;egrep PATTERN FILE...

使用echo命令输出一个绝对路径,使用grep取出其基名;
扩展:取出其路径名
# echo /etc/rc.d/init.d/functions | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1
找出ifconfig命令结果中的1-255之间数字;
# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
挑战题:写一个模式,能匹配合理的IP地址;
1.0.0.1 -- 239.255.255.255
# grep -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
# grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>" ip.txt
挑战题:写一个模式,能匹配出所有的邮件地址;



本文出自 “笨小孩” 博客,请务必保留此出处http://1066875821.blog.51cto.com/2375046/1629372

grep, egrep及相应的正则表达式用法详解

标签:文本文件   linux   表达式   

原文地址:http://1066875821.blog.51cto.com/2375046/1629372

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!