语法:[root @test /root ]# grep [-acinv] '搜寻字符串' filenames-list 参数说明: -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字符串' 的次数 -i :忽略大小写的不一样,因此大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行! 范例: [root @test /root]# grep 'root' /var/log/secure 搜索 /var/log/secure 这个文件中包含 root 的行 [root @test /root]# grep -v 'root' /var/log/secure 搜索没有 root 的行 [root @test /root]# grep [A-Z]ANPATH /etc/man.config 说明:grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,须要说明的是『grep 在一个文件中查寻一个字符串时,他是以"整行"为单位来数据的撷取的!』 grep 是最简单的正规表示法搜寻指令之一,他并不支持一些更严谨的正规表示法内容,不过,已经至关的好用。 例题一:找出这个文件里面含有 know 这个字符,并将行号列出来:注意,大小写是不同的 [root @test /root ]# grep -n 'know' regexp.txt 例题二:找出这个文件里面含有 * 这个字符,并将行号列出来: [root @test /root ]# grep -n '\*' regexp.txt 例题三:我要将全部 know 不论大小写都列出来,并列出行号: [root @test /root]# grep -ni 'know' regexp.txt 注意:相似的指令还有egrep、awk、gawk、sed等,将在后面详细说明 5 正规表示法的特殊字符(charaters)与 egrep 指令 特殊字符 表示意义 ^word 待搜寻的字符在行首 word$ 待搜寻的字符在行尾 . 匹配任何一个可能的字符 \ 跳脱符号将特殊字符变成普通字符 ? 任何一个『单一』字符 * 匹配模式中重复的字符 [list] 列表中的字符 [range] 列表中范围内的字符 [^list] 反向选择,与 [list] 相反 [^range] 反向选择,与 [range]相反 \{n\} 与前一个相同字浮连续 n 个 \{n,m\} 与前一个相同字浮连续 n-m 个 请特别留意的是,『正规表示法的特殊字符』与通常在指令列输入指令的『万用字符』并不相同,例如,在万用字符当中, * 表明的是 0 ~ 无限多个字符的意思,可是在正规表示法当中, * 则是重复前一个字符的意思~使用的意义并不相同,不要搞混了! 例题:在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来 grep [XYZ] /etc/* 例题:我想要知道在 /etc 里面,只要句首是 w-z 的就将他印出来? grep ^[w-z] /etc/* 6 diff比较两个文件内容是否有不一致的指令! 语法:[root @test /root ]# diff file1 file2 范例:[root @test /root]# diff index.htm index.html 例子:ls –l | grep ‘^d’ 查询子目录 注意:使用规则表达式要养成良好的习惯,就是在匹配模式的两端加上‘’。这样和shell的文件通配符号作区别。 7 充分规则表达式专用字符 符号 执行 pattern1 | pattern2 逻辑或 (patten) 对模式进行分组 char+ 搜索前面字符的一个或者多个重复实例 char? 搜索前面字符的一个或者0个实例 例题:t+ 匹配一个或一个以上连续的t,如t tt ttt t? 匹配0个或1个t 如 t 或 ‘ ’ “create | stream “ 和两种模式的任一种进行匹配 重点回顾 • shell文件匹配字符和规则表达式的区别 shell文件匹配字符是用于匹配文件名 正规表示法RE的用途主要是用来作为『搜寻』字符串之用,匹配的文件里面的内容和用来过滤特殊讯息等用途; • 因为严谨度的不一样,正规表示法之上还有更严谨的延伸正规表示法; • 正规表示法的处理方式,常常是以『整行』或称为『整段』来进行处理的; • grep 与 egrep 在正规表示法里面是很常见的两支程序,其中, egrep 能够用不一样的模式去匹配,以及支持更严谨的正规表示法的语法。