Unix中的grep命令
? ? ? ?grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印出来,不会修改原文件内容。
使用grep 命令的语法为:
?$grep [option(s)] pattern [file(s)]
? ??
? ? 其中option为grep命令的选项,pattern为要匹配的简单字符串或携带特殊字符的模式字符串,file为文件列表,可有多个文件。
?
Part 1 ?grep中经常用到的选项(option)
-i 忽略pattern中的大小写
?$grep -i hAL /etc/passwd
-w 搜索整个词汇
? ? 忽略大小写并搜索整个词汇"samba"
? $grep -iw "samba" /tec/samba/smb.conf ??
? # This is the main Samba configuration file. You should read the ? ?
? # here. Samba has a huge number of configurable options (perhaps too ? ?
? # For a step to step guide on installing, configuring and using samba, ? ?
? # read the Samba-HOWTO-Collection. This may be obtained from:
?
-r 递归地指定文件所在目录中的所有子目录中的文件
-v 查找与pattern不匹配的行
定义输出方式:
-o 仅打印出匹配的一段,而非整行
-n 打印出匹配行的行号
-l 仅打印出匹配行所在的文件
-c 打印出每个文件中匹配行的总数
-A num 显示匹配行之后的num行?
-B num 显示匹配行之前的num行
-C num 相当于 -A num 与 -B num 的组合
--color=auto 将pattern在匹配行中高亮输出
?
注意:
(1).选项区分大小写
(2).多个选项可以一起使用,例如:
? $grep -iwr
(3).grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
?
Part 2 在grep中使用正则表达式
?
1.基本的匹配模式
? ? 尽管直接使用最简单直接的pattern字串可以完成一些重要任务,但是grep命令的真正威力在于它可以使用正则表达式来完成复杂的模式字串的匹配。grep命令中使用的是“基本的正则表达式”,如果想使用更高级的正则表达式规则,需要指定选项 -E ,相当于egrep命令。
? ? 以下字符或字符串在正则表达式的规则中具有特殊意义,如,*,+,[,],^,$,\,{,}
? ? 它们的多种组合展示了基本的正则表达式的匹配模式:
? ? (1)'.'匹配任意单一字符
? ? (2) X* 与包含连续0个或多个字符X的行匹配?
? ? (3) X\+ 与包含连续1个或多个字符X的行匹配?
? ? (4) [a-z] 与包含a-z的其中一个字符的行匹配
? ? (5) [^a-z] 与不包含a-z的其中一个字符的行匹配
? ? (6) [0-9] 与包含0-9的其中一个字符的行匹配
? ? (7) ^hello 与以字串hello起始的行匹配
? ? (8) hello$ 与以字串hello结束的行匹配
? ? (9) \ 转义字符,后跟特殊字符,可表示它本来的涵义
? ? (10)
? ? ? ? ? ? ?\d 匹配一个数字字符. 等价于 [0-9]
? ? ? ? ? ? ?\D 匹配一个非数字符. 等价于 [^0-9]
? ? ? ? ? ? ?\w ?,等价于 "[A-Za-z0-9_]"
? ? ? ? ? ? ?\W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"
? ? ? ? ? ? ? \s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]
? ? ? ? ? ? ?\S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v]
? ? ? ? ? ? ? \b 匹配一个单词边界,也就是指单词和空格间的位置。
? ? ? ? ? ? ? \B 匹配非单词边界。
? ? 如,
? $grep '[' filename
?
? ? 返回结果为grep : ?Invalid regular expression
? ? 而 ?,
? $grep '\[' filename
?会匹配所有包含'['(不包括单引号)的行。
? ? X\{n\} 与连续包含n个字符X的行匹配
? ? (11) X\ {n,\} 与至少连续包含n个字符X的行匹配 (注意n后面的',')
? ? (12) X \{,m\} 与最多连续包含m个字符X的行匹配 (注意m前面的',')
? ? (13) X \{n,m\} 与最少包含n个,最多包含m个字符X的行匹配
注意:
? ? ?1.不要混淆shell 中的".","*"与正则表达式中的".","*",很多刚开始学的人都会犯错。
? ? 在正则表达式中,"."很像shell中的"?",它与任意单一字符匹配。而"*"在正则表达式中的使用,表示"*"前面的字符可能出现0次或1次或多次,与shell中的"*"涵义不同。
2.grep 中模式(pattern)之间的OR,AND,NOT 操作
1.grep or 操作(4 种方法)
1.1 使用 \|
? $grep 'pattern1\|pattern2' filename ??
1.2.使用 -E 选项
? ? grep -E 代表扩展的正则表达式. 若使用-E选项,则可以去掉转义字符'\',直接使用'|'
? $grep -E 'pattern1|pattern2' filename ?
1.3.使用 egrep 命令
? ? egrep 相当于 ‘grep -E’.?
1.4.使用 -e 选项
? ? 通过指定多个-e选项来应用多个pattern,多个pattern之间是“或”的关系
?$grep -e pattern1 -e pattern2 filename
?
2.grep AND 操作
2.1 使用 -E选项和模式字符 'pattern1.*pattern2'
?$grep -E 'pattern1.*pattern2' filename ?
? ? 以上命令为在filename文件中查找既与pattern1匹配又与pattern2匹配的行
?$grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename?
??
2.2 利用管道实现
?$grep -E 'pattern1' filename | grep -E 'pattern2' ??
3.Grep NOT 操作
3.1使用 ?-v 选项
?$grep -v 'pattern' filename ?
? ? 以上命令在filename文件中查找不能与pattern匹配的行
?
Part 3 grep命令的 Examples
1. 对文件中的空行计数
? $grep -c "^$" filename ?
2.查找在“hello”有任意长度字串的行
? $grep ?".*hello" filename ? ?
3.查找在'hi'与'hello'之间至少有一个空格的行
? $grep "hi \+hello" filename
4.查找在'hi'与'hello'之间没有空格或有多个空格的行
? $grep "hi *hello" filename?
5..查找在'hi'与'hello'之间没有空格或有1个空格的行
? $grep "hi \?hello" filename?
6.查找ip地址127.0.0.1 (其中包含特殊字符 '.')
? $grep "127\.0\.0\.1" ?filename
7.过滤其他命令的输出结果
? $ls --help | grep "dired"
? ? 将ls命令的帮助文本,作为grep的输入,查找与"dired"匹配的行
? ? 输出为:-D, --dired ? ? ?generate output designed for Emacs' dired mode
8.从系统日志中获得有用的信息
? ? 在apache日志文件中查找以IP地址开头,包含数字200的行
? $grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200" /srv/www/example.com/logs/access.log
?
Part 3 grep命令的 man
◎grep?--?print?lines?matching?a?pattern?(将符合样式的该行列出)?
?◎语法:?grep?[options]??
?PATTERN?[FILE...]??
?grep用以在file内文中比对相对应的部分,或是当没有指定档案时,??
?由标准输入中去比对。?在预设的情况下,grep会将符合样式的那一行列出。?
?????????此外,还有两个程式是grep的变化型,egrep及fgrep。???????????
?????????其中egrep就等同於grep?-E?,fgrep等同於grep?-F?。?
?◎参数?
????1.?-A?NUM,--after-context=NUM??
???????????????除了列出符合行之外,并且列出後NUM行。?
??????????????
?????????ex:???$?grep?-A?1?panda?file??
???????????????(从file中搜寻有panda样式的行,并显示该行的後1行)?
??????????????????????????????????
????2.?-a或--text???
???????????????grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,?
???????????????则会显示如下的讯息:?Binary?file?二进位档名?matches?然後结束。?
???????????????????
???????????????若加上-a参数则可将二进位档案视为文字档案搜寻,?
???????????????相当於--binary-files=text这个参数。?
?????????????
?????????ex:???(从二进位档案mv中去搜寻panda样式)?
???????????????(错误!!!)?
???????????????$?grep?panda?mv??
???????????????Binary?file?mv?matches???
???????????????(这表示此档案有match之处,详见--binary-files=TYPE?)?
???????????????$?
???????????????(正确!!!)?
???????????????$?grep?-a?panda?mv??
????????
????3.?-B?NUM,--before-context=NUM?
???????????????与?-A?NUM?相对,但这此参数是显示除符合行之外?
???????????????并显示在它之前的NUM行。?????????
??????????????
?????????ex:???(从file中搜寻有panda样式的行,并显示该行的前1行)?
???????????????$?grep?-B?1?panda?file??
????4.?-C?[NUM],?-NUM,?--context[=NUM]???
???????????????列出符合行之外并列出上下各NUM行,预设值是2。?
??????????????
?????????ex:???(列出file中除包含panda样式的行外并列出其上下2行)?
???????????????(若要改变预设值,直接改变NUM即可)?
???????????????$?grep?-C[NUM]??panda?file??
??????????????
????5.?-b,?--byte-offset?
???????????????列出样式之前的内文总共有多少byte?..?
???????????????
??????????ex:??$?grep?-b??panda?file???
???????显示结果类似於:?
?????????0:panda?
????????66:pandahuang?
???????123:panda03?
????????????
????6.?--binary-files=TYPE?
???????????????此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:?
?????????????????1.若有符合的地方:显示Binary?file?二进位档名?matches?
?????????????????2.若没有符合的地方:什麽都没有显示。?
????????????????????
???????????????若TYPE为without-match,遇到此参数,?
???????????????grep会认为此二进位档案没有包含任何搜寻样式,与-I?参数相同。?
????????????????????
???????????????若TPYE为text,?grep会将此二进位档视为text档案,与-a?参数相同。?
?????????
?????Warning:?--binary-files=text?若输出为终端机,可能会产生一些不必要的输出。?
???????????????
????7.?-c,?--count?
???????不显示符合样式行,只显示符合的总行数。?
???????若再加上-v,--invert-match,参数显示不符合的总行数。?
????8.?-d?ACTION,?--directories=ACTION?
???????????????若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。?
???????预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;?
???????若ACTION是skip(略过),资料夹会被grep略过:?
???????若ACTION是recurse(递),grep会去读取资料夹下所有的档案,?
???????此相当於-r?参数。?
????9.??-E,?--extended-regexp?
???????采用规则表示式去解释样式。?
???????
???10.??-e?PATTERN,?--regexp=PATTERN?
???????把样式做为一个partern,通常用在避免partern用-开始。???
???11.??-f?FILE,?--file=FILE?
???????事先将要搜寻的样式写入到一个档案,一行一个样式。?
???????然後采用档案搜寻。?
???????空的档案表示没有要搜寻的样式,因此也就不会有任何符合。?
????????
???ex:?(newfile为搜寻样式档)?
???????$grep?-f?newfile?file?????
???12.??-G,?--basic-regexp?
???????将样式视为基本的规则表示式解释。(此为预设)?
???13.??-H,?--with-filename?
???????在每个符合样式行前加上符合的档案名称,若有路径会显示路径。?
????????
???ex:?(在file与testfile中搜寻panda样式)????
???????$grep?-H?panda?file?./testfile?
????????????????file:panda?
????????????????./testfile:panda?
????????????????$?
??????
???14.??-h,?--no-filename???
???????????????与-H参数相类似,但在输出时不显示路径。?
???15.??--help??
???????????????产生简短的help讯息。?
???16.??-I?
???????????????grep会强制认为此二进位档案没有包含任何搜寻样式,?
???????????????与--binary-files=without-match参数相同。?
????????????????????
???????????ex:??$?grep?-I??panda?mv?
???17.??-i,?--ignore-case? ??????
???????????????忽略大小写,包含要搜寻的样式及被搜寻的档案。?
????????????????
???????????ex:??$?grep?-i?panda?mv?
?????????????????
???18.??-L,?--files-without-match??
???????????????不显示平常一般的输出结果,反而显示出没有符合的档案名称。?
???19.??-l,?--files-with-matches????????????????
???????????????不显示平常一般的输出结果,只显示符合的档案名称。?
???20.??--mmap????????????????
???????????????如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。??
???????????????在某些状况,--mmap?能产生较好的效能。?然而,--mmap??
???????????????如果运作中档案缩短,或I/O?错误发生时,?
???????????????可能造成未定义的行为(包含core?dump),。?
????????????????
???21.??-n,?--line-number?
???????????????在显示行前,标上行号。?
????????????????
????????????ex:??$?grep?-n??panda?file???
????????????????显示结果相似於下:?
????????????????行号:符合行的内容?
???22.??-q,?--quiet,?--silent??
???????????????不显示任何的一般输出。请参阅-s或--no-messages?
???23.??-r,?--recursive?
???????递地,读取每个资料夹下的所有档案,此相当於?-d?recsuse?参数。?
???24.??-s,?--no-messages?
???????不显示关於不存在或无法读取的错误讯息。?
??????
?小:?不像GNU?grep,传统的grep不符合POSIX.2协定,?
???????因为缺乏-q参数,且他的-s?参数表现像GNU?grep的?-q?参数。?
???????Shell?Script倾向将传统的grep移植,避开-q及-s参数,?
???????且将输出限制到/dev/null。?
?????
POSIX:?定义UNIX及UNIX-like系统需要提供的功能。?????? ????????
?????
???25.??-V,?--version
??显示出grep的版本号到标准错误。?
??当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。?
???26.??-v,?--invert-match?
??显示除搜寻样式行之外的全部。?
????????????????????
???27.??-w,?--word-regexp?
??????????将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。?
???28.??-x,?--line-regexp?
??将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。