分类: LINUX
2008-04-23 13:15:19
1.grep格式:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串
grep命令中输入字符串参数时,最好将其用双引号括起来。一是以防被误解为s h e l
l命令,二是可以用来查找多个单词组成的字符串。
在调用变量时,也应该使用双引号,如: grep
"$MYVAR"文件名
在调用模式匹配时,应使用单引号。
2.grep选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l
查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v
显示不包含匹配文本的所有行。
3.查询多个文件
eg: 如在当前目录下所有.doc文件中查找字符串"sort"
$ grep "sort"
*.doc
在所有文件中查询单词"sort it"
$ grep "sort it"
*
在当前目录下的所有文件中查询有"awk"字符串的文件,并且只显示文件名
$ grep -l "awk"
*
在当前目录下所有文件中查询有"awk"字符串的文件,显示文件名和所处行号
$ grep -n "awk"
*
duawk.awk:1:#!/bin/awk -f
duawk.awk:2:# to call: du | duawk.awk
文件文件中grep选项的用法:
行匹配:
$ grep -c "48" data.f
$ 4
grep
反回数字4,意思是有4行包含字符串"48"
现在显示包含"48"字符串的4行文件
$ grep "48" data.f
行数:
$ grep -n "48" data.f
显示非匹配行
$ grep -v "48" data.f
精确匹配
$ grep "48
用grep抽取精确匹配的一种更有效的方式是在抽取字符串后加\>
大小写敏感
缺省情况下,grep是大小写敏感的,如果查询大小写不敏感字符串,必须使用-i开关
$ grep -i "sept"
data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
grep和正则表达式
使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。
1.模式范围
假定要抽取代码为484和483的城市位置
$
grep '48[34]' data.f
2.不匹配行首
抽出记录,使行首不是48,可以在方括号中使用^记号,表明查询在行首开始
$ grep '^[^48]' data.f
3.设置大小写
$ grep '[Ss]ept'
data.f
如果要抽取包含Sept的所有月份,不管其大小写,并且此行包含字符串483,可以使用管道
$ grep '[Ss]ept' data.f
| grep 483
4.匹配任意字符
抽取以L开头,以D结尾的所有代码,长度为5个字符
$ grep 'K...D'
data.f
前两个是大写字母,中间任意,以C结尾
$ grep '[A-Z][A-Z]..C' data.f
5.日期查询
$ grep '5..199[6,8]'
data.f
查询包含1998的所有记录的另外一种方法是使用表达式[0-9]\{3\}[8]
意思是:任意数字重复3次,后跟数字8
$
grep '[0-9]\{3\}[8]' data.f
6.范围组合
$ grep '[0-9][0-5][0-6]' data.f
47 Oct 3ZL1998 LPSX
43.00 KVM9D 512
以行首开始,使用^符号
$ grep '^[0-9][0-7]' data.f
47
Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD
23.00 PLV2C 68
7.模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法:
$ grep '4\{2,\}'
data.f
抽取记录使之包含数999(三个9)
$ grep '9{3,\}'
data.f
查询重复出现次数一定的所有行,数字9重复出现两次
$ grep '9\{2\}'
data.f
查询数字9重复出现2到6次,并以8结尾
$ grep '9\{2,6\}8' data.f
47 Oct
3ZL1998 LPSX 43.00 KVM9D 512
483 may 5PA1998 USP 37.00
KVM9D 644
8.使用grep匹配"与"或者"或"模式
grep命令加-E参数,这一扩展允许使用扩展模式匹配。
抽取城市代码为219或216
$
grep -E '219|216' data.f
9.空行
使用^和$可查询空行。使用-n显示实际行数
$ grep '^$' data.f
10.匹配特殊字符
查询诸如$.'"*[]^|\+?,必须在特定字符前加\
查询"."
$ grep '\.'
myfile
查询"""
$ grep '\"' myfile
要查询文件名conftroll.conf
$ grep
'conftroll\.conf' myfile
11.查询格式化文件名
在文件filename.deposit中查询
a-z重复了1-6次,然后是"."
,最后为大写字母,重复1-2次
$ grep '[^a-z]\{1,6\}\.[^A-Z]\{1,2\}' filename.deposit
12.查询IP地址
$ grep '[0-9]\{3,\}\.[0-9]\{3,\}\.' data.f
123.134.999
类名
grep
允许使用国际字符模式匹配或匹配模式的类名形式。
类名及其等价的正则表达式
--------------------------------------------------
类 等价的正则表达式
--------------------------------------------------
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或tab键
[[:alpha:]] [a-zA-Z]
--------------------------------------------------
使用通配符
$ grep 'l.*s' testfile
looks
likes
系统grep命令
1.目录
查询目录列表中的目录
$ ls -l | grep
'^d'
在一个目录中不包含目录的所有文件
$ ls -l | grep
'^[^d]'
要查询其他用户和其他用户组成员有可执行权限的目录集合
$ ls -l | grep '^d.....x..x'
2.passwd文件
$ grep "louise" /etc/passwd
使用grep命令-s开关,可屏蔽错误信息
$ grep -s "louise" /etc/password
$
如果grep命令不支持-s开关,可替代使用以下命令:
$ grep "louise" /etc/password >/dev/null
2>&l
/dev/null为比特池,有进没有出。
保存grep命令的查询结果
$ grep "louise" /etc/passwd >/tmp/passwd.out
3.使用ps命令
ps -ef 显示系统上运行的所有进程列表
$ ps -ef | grep
"named"
grep命令创建了相应进程,ps -ef将找到它,使用-v选项可丢弃ps命令中的grep进程
$ ps -ef | grep
named | grep -v "grep"
4.对一个字符串使用grep
使用echo字符串命令,然后对grep命令使用管道输入
$ STR = "Mary Joe Peter
Pauline"
$ echo $STR | grep "Mary"