shell中grep命令详解
⽤‘grep’搜索⽂本⽂件
如果您要在⼏个⽂本⽂件中查⼀字符串,可以使⽤‘grep’命令。‘grep’在⽂本中搜索指定的字符串。举个例⼦:假设您正
在‘/usr/src/linux/Documentation’⽬录下搜索带字符串‘magic’的⽂件:
$ grep magic /usr/src/linux/Documentation/*
<:* How do I enable the magic SysRQ key?
<:* How do I use the magic SysRQ key?
其中⽂件‘’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,‘grep’只搜索当前⽬录。如果此⽬录下有许多⼦⽬录,‘grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使‘grep’的输出难于阅读。这⾥有两种解决的办法:
明确要求搜索⼦⽬录:grep -r
忽略⼦⽬录:grep -d skip
当然,如果预料到有许多输出,您可以通过管道
将其转到‘less’上阅读:
$ grep magic /usr/src/linux/Documentation/* | less
这样,您就可以更⽅便地阅读。
有⼀点要注意,您必需提供⼀个⽂件过滤⽅式(搜索全部⽂件的话⽤*)。如果您忘了,‘grep’会⼀直等着,直到该程序被中断。如果您遇到了这样的情况,按ctrl+c,然后再试。important!!命令⾏参数:
grep -i pattern files:不区分⼤⼩写地搜索。默认情况区分⼤⼩写,
grep -l pattern files :只列出匹配的⽂件名,
grep -L pattern files :列出不匹配的⽂件名,
grep -w pattern files:只匹配整个单词,⽽不是字符串的⼀部分(如匹配‘magic’,⽽不是‘magical’),
grep -C number pattern files:匹配的上下⽂分别显⽰[number]⾏,
grep pattern1 | pattern2 files :显⽰匹配 pattern1 或 pattern2的⾏,
grep pattern1 files | grep pattern2 :显⽰既匹配 pattern1 ⼜匹配pattern2 的⾏。
这⾥还有些⽤于搜索的特殊符号:
\< 和 \> 分别标注单词的开始与结尾。
例如:
grep man * 会匹配 ‘Batman’、‘manic’、‘man’等,
grep '\<man' * 匹配‘manic’和‘man’,但不是‘Batman’,
grep '\<man\>' 只匹配‘man’,⽽不是‘Batman’或‘manic’等其他的字符串。
'^':指匹配的字符串在⾏⾸,
'$':指匹配的字符串在⾏尾,
如果您不习惯命令⾏参数,可以试试图形界⾯的‘grep’,如 reXgrep 。这个软件提供 AND、OR、NOT 等语法,还有漂亮的按钮 :-) 。如果您只是需要更清楚的输出,不妨试试 fungrep 。
Grep的常⽤命令语法1. 双引号引⽤和单引号引⽤
在g r e p命令中输⼊字符串参数时,最好将其⽤双引号括起来。例如:”m y s t r i n g”。这样做有两个原因,⼀是以防被误解为 s h e l l命令,⼆是可以⽤来查多个单词组成的字符串,例如:”jet plane”,如果不⽤双引号将其括起来,那么单词 p l a n e将被误认为是⼀个⽂件,查询结果将返回”⽂件不存在”的错误信息。
在调⽤变量时,也应该使⽤双引号,诸如: g r e p”$ M Y VA R”⽂件名,如果不这样,将
没有返回结果。
在调⽤模式匹配时,应使⽤单引号.[root@mypc ]# echo `grep `  (#注意是反单引号)
2. 常⽤的g r e p选项有:
-c  只输出匹配⾏的计数。
-i  不区分⼤⼩写(只适⽤于单字符)。
-h  查询多⽂件时不显⽰⽂件名。
-l  查询多⽂件时只输出包含匹配字符的⽂件名。
-n  显⽰匹配⾏及⾏号。
-s  不显⽰不存在或⽆匹配⽂本的错误信息。
-v  显⽰不包含匹配⽂本的所有⾏。
3. 特殊的–在多个⽂件中进⾏查询
$ grep “sort”*.doc    ( #在当前⽬录下所有. d o c⽂件中查字符串”s o r t”)
$ grep “sort it” *      (#或在所有⽂件中查询单词”sort it”)
接下来的所有⽰例是指在单个⽂件中进⾏查询
4. ⾏匹配
$ grep -c “48″ data.f
$ 4                      (#g r e p返回数字4,意义是有4⾏包含字符串”4 8″。)
$ grep “48″ data.f          (#显⽰包含”4 8″字符串的4⾏⽂本)
5. 显⽰满⾜匹配模式的所有⾏⾏数:
[root@mypc oid2000]# grep -n
1:1234
3:1234ab
grep命令有什么用
6. 精确匹配
[root@mypc oid2000]# grep “1234\>”
1234
7. 查询空⾏,查询以某个条件开头或者结尾的⾏。
结合使⽤^和$可查询空⾏。使⽤- n参数显⽰实际⾏数
[root@mypc oid2000]# grep -n “^$”     (返回结果 2:  #说明第⼆⾏是空⾏)
[root@mypc oid2000]# grep -n “^abc” (#查询以abc开头的⾏)
[root@mypc oid2000]# grep -n “abc$”   (#查询以abc结尾的⾏)
8. 匹配特殊字符,查询有特殊含义的字符,诸如$ . ‘ ” * [] ^ | \ + ? ,必须在特定字符前加\。[root@mypc oid2000]# grep  “\.”   (#在中查询包含”.”的所有⾏)
[root@mypc oid2000]# grep  “my\.conf”  (#查询有⽂件名my. c o n f的⾏)
9. ⽬录的查询
[root@mypc oid2000]# ls -l |grep “^d”      (#如果要查询⽬录列表中的⽬录)
[root@mypc oid2000]# ls -l |grep “^d[d]“    (#在⼀个⽬录中查询不包含⽬录的所有⽂件) [root@mypc]# ls -l |grpe “^d…..x..x” (#查询其他⽤户和⽤户组成员有可执⾏权限的⽬录集合)