1).简单的grep grep [option] PATTERM [file...] #grep 'root' /etc/passwd -E:使用扩展正则表达式 -F:使用固定字符串进行匹配 -l:列出匹配模式的文件名称,而不是打印匹配的行 -q:静默模式,匹配grep则成功退出,不匹配则写入标准输出 -S:不显示错误信息 -i:忽略字符大小写 --color:显示颜色 # alias grep='grep --color' # grep 'root' /etc/passwd -v :反向查找,显示没有被模式匹配到的行 -o:只显示被模式匹配到的字符串
2).基本正则表达式 meta字符 .:匹配任意单个字符 # grep 'r..t' /etc/passwd *:匹配其前面的字符任意次 a*b b,aab, 即a出现任意次以后跟一个b ^:锚定行首,此字符后面的任意内容必须出现在行首 # grep '^r..t' /etc/passwd $:锚定行尾,此字符前面的任意内容必须出现在行尾 # grep 'w$' /etc/passwd # grep 'r..t$' /etc/passwd ^...$:整个字符串 ^$: 空白行 # grep '^$' /etc/passwd 查看空白行 $ cc -E foo.c | grep -v '^$' > foo.out #先使用grep -v显示不匹配的行(即非空白行),重定向到新的文件,从而过滤文件中空白行 链接: cc -E :这个选项是相对标准的,它允许修改命令行以使编译程序把预先处理的C文件发到标准输出,而不实际编译代码. 在查看C预处理伪指令和C宏时,这是很有用的.可能的编译输出可重新定向到一个文件,然后用编辑程序来分析: $cc -c -E foo.c > foo.out #此命令使include文件和程序被预先处理并重定向到文件foo.out. #以后可以用编辑程序或者分页命令分析这个文件,并确定最终的C语言代码看起来如何.
\{n,m\}:匹配其前单个字符重现的次数区间,n-m次,匹配其前的字符至少n次,至多m次 n与m的值必须介于0至RE_DUP_MAX(含)之间 $ getconf RE_DUP_MAX 获得值 \{n\}:重现n次 \(n,\}:至少重现n次 \{1,\} ;至少一次 \{0.3\} :至多三次 # grep 'a\{1,3\}b' test.txt ab aab aaab # grep 'a.\{1,3\}b' test.txt aab acb amnb amnbnnhb
练习1:以abcABCdefDEF匹配 ^ABC 不匹配 def 匹配 def$ 不匹配 [[:upper:]]\{3\} 匹配,居中456ABC匹配 [[:upper:]]\{3\}$ 匹配,结尾DEF匹配 ^[[:alpha:]]\{3\} 匹配,起始abc匹配
.*:任意长度的任意字符 # a.*b a开头b结束中间任意 贪婪模式:默认情况下正则表达式工作在贪婪模式,尽可能长匹配
?:匹配其前面的字符一次或0次 部分符合也可以 a?b b ,ab ,aab,acb,adb,ammb,annnbnnhbnb
|:匹配于|符号前或后的正则表达式 +:匹配前面正则表达式的一个或多个实例 ():匹配括号中内容 [.与.]:排序,给予成组的项目排列顺序的操作, 如假定[.cd.]存在,则[ab[.cd.]ef]匹配a,b,e,f,以及成对出现的cd [=与=]:等价字符集,让不同字符集在匹配时视为相同字符集 如French的locale下,可能有[=e=]这样的等价字符集, 则[Fi[=e=]ld]就等同于所有小写英文字母元音,以及字母è、é等
\<或者\b:锚定词首,其后面的任意字符必须作为单词首部出现 \>或者\b:锚定词尾,其前面的任意字符必须作为单词尾部出现 # grep " \<root\>" test.txt
后向引用:匹配于正则表达式匹配的先前的部分 ①. 将子表达式包围在 \( 和 \) 里,单个模式里最多可包含9个子表达式,且可为嵌套结构 ②.在同一个模式之后使用 \digit, 数字digit介于1至9个数字。 指的是匹配于第n个先前方括号内子表达式匹配成功的字符 \1:引用第一个左括号以及与之对应的右括号所包括的所有内容 # grep ' # grep '\([0-9]).*\1$' /etc/passwd 任意数字 相同数字结尾 \([“ ’].*\1:表示匹配以单引号或双引号括起来的字,例如"bar"或者'foo' e 可以有0个或者多个字符。当再遇到ch时,匹配到一个。 #grep "
[]:匹配指定范围内的任意单个字符 [^]:匹配指定范围之外的任意单个字符
字符集合 [[:blank:]] 空格(space)与定位(tab)字符 [[:cntrl:]] 控制字符 [[:graph:]] 非空格(nonspace)字符 [[:space:]] 所有空白字符 [[:print:]] 可显示的字符 [[:xdigit:]] 十六进制数字 [[:punct:]] 所有标点符号 [[:lower:]] 小写字母 [[:upper:]] 大写字母 [[:alpha:]] 大小写字母 [[:digit:]] 数字 [[:alnum:]] 数字和大小写字母 # grep '[[:space:]][[:digit:]]$' /etc/passwd 以空格数字结尾
注意:排序元素、等价字符集以及字符集,都仅在方括号表达式的方括号内才被认可,也即是说,[:alpha:]这样的正则表达式,匹配字符为a、l、p、h、a以及:, 表达所有英文字母的正确写法应为[[:alpha:]]
BRE运算符优先级 由高到低
练习2: 1.通过管道过滤ls -l输出的内容,只显示以abc开头的行。 $ ls -l | grep '^abc' 2.显示所有以d开头的文件中包含test的行。 $ grep 'test' d* 3.显示在aa,bb,cc文件中匹配test的行。 $ grep 'test' aa bb cc 4.显示aa文件中所有包含每个字符串至少有5个连续小写字符的字符串的行。 $ grep '[a-z]\{5\}' aa 5.如果Field被匹配,则ie就被存储到内存中,并标记为1,然后搜索任意个字符(.*), 这些字符后面紧跟着另外一个ie(\1),找到就显示该行。 $ grep 'F 6.查找当前系统上名字为student(必须出现在行首0的用户的账号的相关信息,文件为/etc/passwd $ grep'^student' /etc/passwd | cut -d: -f3 id -u student 链接: /etc/passwd 下的文件 [gz_field@gimei3 ~]$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin account:登录名 password;密码 密码不在这放 而在 /etc/shadow UID:用户ID号 GID:基本组ID comment 用户的注释信息 全名等信息 HOME DIR:家目录 SHELL:用户默认shell 7.分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现的数字必须相同), 请写出精确找到类似两行的模式 11:1:wait:/etc/rc.d/rc 1 13:3:wait:/etc/rc.d/rc 3 # grep '^1
4).扩展的正则表达式(Extended Regular Expr ⑴匹配单个字符时,基本同BRE awk中存在一个例外,其\符号在方括号内表示其他的含义 若需匹配左方括号、连字符、右方括号或是反斜杠,则需使用[ ⑵不存在后向引用 ⑶、匹配单个表达式与多个正则表达式 区间表达式{} 不需要前置反斜杠字符 a{5} 刚好重现五个a , b{5,10}重现五到十个b ? 匹配0个或一个前置正则表达式 ab?c -->ac 或者abc + 匹配一个或多个前置正则表达式 ab+c -->abc,abbc,abbbc...不匹配ab ⑷、交替运算符| :匹配与这个序列,或者其他序列,或者... qqq|www|eee|rrr|ttt|... |与^,$结合使用,实现分组 ^abcd|efgh$ 匹配字符串起始处是否有abcd,或者结尾处是否有efgh ^(abcd|efgh)$ 找一个正是abcd或者正是efgh的字符串 ⑸、ab^cd,ef$gh 在扩展正则表达式仍然适用,无法匹配到任何东西
ERE运算符优先级 由高到低
5).正则表达式的扩展 额外的GNU正则表达式运算符
6).程序与正则表达式 UNIX程序及其正则表达式类型
|
|