Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

七种武器:grep

Posted on 2009-10-13 17:05 Prayer 阅读(513) 评论(0)  编辑 收藏 引用 所属分类: Shell

grep的功能

grep从一个或多个文本文件中查找符合指定范本(正则表达式)的行,并把查找结果输出到指定设备(默认到屏幕)。

语法:

/usr/bin/grep [选项] <范本(正则表达式)> [文件1 ...]

范本是一个单独的词或者是一个用引号括起来的字符串。如果范本包含空格,则范本要用引号括起来。grep默认下把结果输出到屏幕但是并不影响或改变任何被查找的目标文件。
一些特殊字符($, *, [, ^, |, (, ), 和\)的使用要特别小心,因为这些字符在shell里有特殊意义。如果这些字符作为范本的一部份,请用单引号把整个范式括起来。
# grep root /etc/passwd /etc/shadow
/etc/passwd:root:x:0:0:Super-User:/:/sbin/sh
/etc/shadow:root:PdhpgiTZvqa2:13732::::::

备注:黑体部分是文件名

grep命令的输入

grep有三种输入来源:标准输入(键盘)、管道和文件。如果你忘了输入目标文件,grep会假定从标准输入设备(键盘)取得输入,直到你按^D(Control+D)。如果是管道,上个命令的输出将被作为grep的输入被处理,并把查找结果输出到指定输出设备。
global$grep mypattern
hello grep
I forget input file(s)
^D
global$

global$ ps -ef | grep root

global$ grep root /etc/passwd /etc/shadow


grep命令的返回值(不是查找结果)

### 0 (范本在指定文件里被查找到。)
global$grep root /etc/passwd;echo $?
root:x:0:0:Super-User:/:/sbin/sh
0

### 1 (范本在指定文件里没有查找到)
global$grep roo1t /etc/passwd;echo $?
1

### 2 (指定的目标文件不存在)
global$grep root /etc/passwd1;echo $?
grep: can't open /etc/passwd1
2

备注:Bourn/Korn shell变量,?,返回最后被执行的命令的返回值;C shell变量是status。

grep命令的选项

选项
描述
-c
显示符合范本的行的数目而不是显示满足条件的行的内容
-h
不显示文件名
-i
忽略大小写
-l
只列出有满足条件的行的文件的文件名
-n
显示满足条件的行在包含它的文件中的行号
-s
隐形操作,即如果出错不输出任何信息。在用于只检返回值时非常有用。
-v
反向显示,即输出不满足条件的行。

grep的正则表达式的元字符

元字符
功能
列子
描述
^
行首
'^love'
匹配所有以love开始的行
$
行尾
'love$'
匹配所有以love结尾的行
.(点)
匹配任意一个字符
'l..e'
匹配所有包含l,紧跟任意2个字符,再跟一个e的行
*
匹配0个或多个字符
' *love'
匹配所有包含0个或多个空格,再跟love的行
[]
匹配一个在集合里的字符
'[Ll]ove'
匹配包含Love或love的行
[^]
匹配一个不在集合里的字符
'[^A-K]ove'
匹配不包含从A-K的字符,紧跟ove的行
\<
词首
'\<love'
匹配所有有任一单词以love为首的行
\>
词尾
'love\>'
匹配所有有任一单词以love为尾的行
\(..\)
标识匹配的一个或多个字符
'\(love\)ing'
标识一个标注以期后面引用,第一个用\1,一次类推,最多有9个;见列子
x\{m\}
x\{m,\}
x\{m,n\}
重复字符x:m次
至少m次
在m次到n次之间
'0\{5\}'
'0\{5,\}'
'0\{5,10\}
如果一个行有:连续5个0,至少连续5个0,连续的0在5到10之间,则满足要求。

例子

  • 查找在/etc下以p为首的文件中有那些行包含有root
# 、/usr/bin/grep root /etc/p*
/etc/passwd:root:x:0:0:Super-User:/:/sbin/sh
/etc/project:user.root:1::::

  • 输出所有的非空行
$ /usr/bin/grep . $HOME.profile

$ /usr/bin/grep ^$ /etc/passwd | wc -l (本命令统计/etc/passwd里有几行空行)

  • 输出/etc/passwd中包含root或者sys的行
$/usr/xpg4/bin/grep -e 'root' -e 'sys' /etc/passwd  或者
$/usr/xpg4/bin/grep -E 'root|sys' /etc/passwd
root:x:0:0:Super-User:/:/sbin/sh
sys:x:3:3::/:


  • 输出所有行,此行包含这样的一个单词,它以小写字母打头,紧跟任意个字符,以n结尾
$ grep '\<[a-z].*n\>' /etc/passwd (注意.*,它表示任意个字符,包括空格)

  • 输出行,它包含一个3,紧跟着一个点和一个数字,再紧跟任意个字符(.*),再跟一个3(前面标识过了),一个或多个TAB,再跟一个3. 因为3前面被标识过,\(3\),所以后面引用只要用\1就可以了。
$ grep '\(3\)\.[0-9].*\1   *\1' /etc/passwd

注:你可以替换3为任意你想要的其他字符
  • 输出行,这些行有单词至少包含9个连续的小写字母
$grep '[a-z]\{9,\}' /etc/passwd

  • 输出当前目录下文件名,这些文件包含有这样子的行,这些行包含有'SE'字符串,忽略大小写。
$ grep -l -i 'se' *

egrep(扩展的grep)

元字符
功能
例子
描述
+
匹配一个或多个前导字符
'[a-z]+ove'
匹配一个或多个小写字符,紧跟ove.如love,loove,alove

匹配0个或一个前导字符
'lo?ve'
匹配以l开始,紧跟零个o或者一个o,在跟ve.如lve,love
a|b
匹配a或者b
'love|hate'
匹配love或者hate
()
分组
'lov(able|ly)?'
匹配lovable或者lovly,或者lov
  • 包含S,紧跟h或者u
$ egrep 'S(h|u)' /etc/passwd

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理