一.grep家族
1.grep使用基本正则元字符集。标准的grep 在默认情况下也支持以反斜杠开头的扩展正则元字符集。例如:\?,\+,\{,\|,\(,\);前面没有反斜杠的扩展元字符集对于标准的grep 无特别的含义。
2.egrep 是grep的扩展,用的是正则表达式元字符集的扩展集。
3.fgrep 就是fixed grep 或者fast grep,元字符只表示其自身的字面意义。
4.Linux 使用的是Gnu grep,为了符合POSIX标准,grep 增加了-G.-E 和-F选项,它们使你在拥有标准grep 所提供的功能的同时还拥有egrep 和fgrep的功能。Gnu grep 的使用格式如下:
grep 'pattern' filename(s) | 基本正则表达式元字符集(默认) |
grep -G 'pattern' filename(s) | 基本正则表达式元字符集(默认) |
grep -E 'pattern' filebname(s) | 扩展正则表达式元字符集 |
grep -F 'pattern' filename(s) | 无正则表达式元字符集 |
5.当使用 egrep 命令时 \ (或者 \ (匹配文本中的括弧,但是 (和 )都是模式组部分中的特殊字符。在使用 grep 命令时,逆向也成立。
二.grep命令(grep lm - -color=auto /proc/cpuinfo)
1.grep 的含义
grep 的名字可以追溯到ex 编辑器。如果想启动ex 编辑器并打印所有包含pattern 的行,就需要输入:
: g/pattern/p
g 命令的意思是“文件中所有的行”或者“运行一个全文替代”。因为搜索模板被称为正则表达式,所以我们可以用RE 来替换模板,命令读为:
: g/RE/p
你看到了,这就是grep 命令的含义和名字的来源。它的意思是“全面搜索正则表达式并把找到的行打印出来(global search regular expression (RE) and print out the line)。
使用grep的好处是不用启动编辑器就可以运行查找,也不需要用斜杠把正则括起来。因此它比使用vi 和ex 更加快捷和方便。
2.grep 怎样工作
grep 命令在一个或者多个文件中搜索字符串模板。如果模板包括空格,则必须用引号。
模板可以是一个被引用的字符串,其后面的所有字符串被看作文件名。grep把搜索结果送到屏幕,但是不影响输入文件。
3.引号引用
在grep命令中输入字符串参数时,最好将其用引号括起来。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,
例如:“jet plane”,如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。
在调用变量时,也应该使用双引号,诸如:grep “$MYVAR”文件名,如果不这样,将没有返回结果。
在调用模式匹配时,应使用单引号。
4.grep的正则表达式元字符集(基本集)
基本集包括:^,$,.,*,[],[^],\<, \>。另外,Gnu 将\b,\w 和\W 作为POSIX 新增的正则元字符予以识别。
^ ^love | \(..\)b \(love\)able |
$ love$ | x\{m\} o\{5\} |
. l..e | x\{m,\} o\{5,\} |
* *love | x\{m,n\} o\{5,10\} |
[] [Ll]ove | \w L\w*e |
[^] [^A-Z]ove | \W love\W+ |
/< \<love | \b \blove\b |
\> love\> |
|
5.POSIX字符类
为了处理不同的地区字符集,POSIX 加入了基本正则表达式和扩展正则表达式,表示这些类。
例如A-Za-z0-9 本身并是正则表达式,但是[A-Za-z0-9]就是。
同样[:alnum:]只有被写成[[:alnum:]]时才是正则表达式。
这两种形式的区别在于,第一种依赖的是ASCII字符编码,第二种依赖的是类中的其他语言,例如瑞典语或者德语。
Bracketed Class/含义 | Bracketed Class/含义 |
[:alnum:] 文字数字字符 | [:print:] 跟非空字符一样,但是包括空格 |
[:alpha:] 文字字符 | [:graph:] 非空字符(非空格.控制字符) |
[:digit:] 数字字符 | [:punct:] 标点符号 |
[:upper:] 大写字符 | [:xdigit:] 十六进制数字(0-9.a-f.A-F) |
[:lower:] 小写字符 | [:space:] 所有白空格字符(新行.空格.制表符) |
[:cntrl:] 控制字符 |
|
#grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile #grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile #grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile #grep '5[[:upper:]][[:upper:]]' datafile #grep '[[:upper:]]\.[[:upper:]][P,D]' datafile以P,D结尾的 |
6.grep.grep-G实例
grep –G NW file1 打印所有包含正则表达式NW的行。 |
grep NW d* 打印所有以d 开头的文件中且包含正则表达式NW 的行 |
grep '^n ' file1 打印所有以n开头的行。^表示锚定行的开头。 |
grep '4$ ' file1 打印所有以4结束的行。$表示锚定行的结尾。 |
grep TB Savage file1 第一个参数是模板,其他的参数是文件名 |
grep 'TB Savage ' file1 打印所有包含模板TB Savage的行。 |
grep '5\.. ' file1 第一个是5,紧跟着一个点,再后是任意一个字符 |
grep '\.5 ' file1 打印所有包含字符串“.5”的行。 |
grep '^[we] ' file1 打印所有以w或者e开头的行。 |
grep '[^0-9] ' file1 括号内的^表示任意一个不在括号范围内的字符。 |
grep ' [A-Z][A-Z] [A-Z] ' file1打印所有包含前两个字符是大写字母,后面紧跟着一个空格及一个大写字母的字符串的行。例如,TB Savage和AM Main。 |
grep 'ss* ' file1 打印所有包含一个或者多个s 且后面跟有一个空格的字符串的行。比如,Charles 和Dalsass。 |
grep ' [a-z]\{9\} ' file1打印所有包含每个字符串至少有9个连续小写字符串的行。 |
grep '\(3\)\.[0-9].*\1 *\1 ' file1 第一个字符是3,紧跟着一个句点,然后是任意一个数字,然后是任意个数字,然后是一个3,然后是任意个制表符,然后又是一个3。因为3在一对圆括号中,它可以被后面的\1引用。 |
grep '\<north ' file1 所有包含以north开始的单词的行。 grep '\bnorth\b ' file1 在所有Gnu 版本的grep 中,\b是单词分界符 |
grep '^n\w*\w ' file1 第一个字符是n,紧跟着是任意个字母或者数字字符,然后是一个非字母数字字符。在各种Gnu版本的grep中,\w 和\W都是标准的单词匹配符。 |
grep '\<[a-z].*n\> ' file1 第一个字符是一个小写字母,紧跟着是任意个字符,然后以字符n结束。注意.*,它表示任意字符,包括空格。 |
#ls –l|grep '^[^d]' 不匹配行首 |
三.grep与选项(grep <参数> <正则> <文件名>)
1. -A NUM,--after-context=NUM 除了列出符合行之外,并且列出后NUM行。 $grep-A 1 panda file从file中搜寻有panda样式的行,并显示该行的后1行 |
2. -a或--text grep原本是搜寻文字文件,若加上-a参数则可将二进制档案视为文本文件搜寻,相当于--binary-files=text这个参数。 $grep-a panda mv |
3. -B NUM,--before-context=NUM与 -A NUM 相对,同时输出匹配行的前num行。 $grep-B 1 panda file 从file中搜寻有panda样式的行,并显示该行的前1行 |
4. -b, --byte-offset列出样式之前的内文总共有多少byte .. 根据上下文定位磁盘块时有用 $grep-bpanda file 显示结果类似于: 66:pandahuang |
5.-c输出匹配行的计数只显示符合的总行数。加上-v,--invert-match显示不符合的总行数。 #grep -c '^ *$' ch04 输出所有包含空行的行的数目 |
6. -C [NUM], -NUM, --context[=NUM] 列出符合行及上下各NUM行,默认值是2。 $grep-C[NUM] panda file |
7. -E, --extended-regexp采用规则表示式去解释样式。 |
8. -f FILE, --file=FILE档案的一行为一个样式。然后采用档案搜寻。 $grep-f newfile file //newfile为搜寻样式文件 |
9. -G, --basic-regexp将样式视为基本的规则表示式解释。(此为预设) |
10. -i, --ignore-case匹配时忽略大小写 $grep-i panda mv |
11. -L, --files-without-match显示出没有符合的文件名称。 |
12. -l, --files-with-matches 打印匹配模板的文件清单 #grep -l ‘\<PATH’ /etc/* 输出所有包含词的文件名 |
13. -n, --line-number在显示行前,标上行号。 #grep -n ‘\<root\> /etc/passwd 显示行号;严格匹配元字符:\<\> #grep -n /etc/passwd |
14. -q, --quiet, --silent只返回状态,0则表示找到了匹配的行 #grep -q nstall install.log && echo $? 若找到nstall则传回真值 |
15. -r, --recursive-递归,到子目录中搜索,此相当于 -d recsuse 参数。 #grep –ir abc /usr 忽略大小写;递归查找 |
16. -v, --invert-match 显示除搜寻样式行之外的全部。 #grep -v -f file1 file2 && grep -v -f file2 file1删除两个文件相同部分 #grep -v ^# /etc/initab|grep -v ^$ |
17. -w, --word-regexp执行单词搜索,完全符合该"单词"的行才会被列出,相当于\<和\> #grep -w /hi/etc/fstab 输出所有包含词reg-exp的行 #grep “student\>” /ur/share/dict/words 精确匹配 |
18.-# 同时显示匹配行的上下#行;Grep -2 vim install.log |
四.egrep或grep-E(行被限制在 2048 字节)
元字符 | 例子 |
+ | 重复至少“1个”前一个RE字符 #egrep –n ’go+d’ file1 |
? | 重复至少“0个”前一个RE字符 #egrep '2\.?[0-9]' datafile 一个2后跟0或一个.,再跟一个数 |
| | 用“or”方式找出字符串 #egrep -v '^$|^#' file1 #who|egrep -v ’^(matty|pauline)’ ^符号排除字符串 |
() | 找出“群组”字符串 #egrep ‘(shutdown|reboot) (s)?’ file1 #echo 'AxyzxyzxyzC'|egrep 'A(xyz)+C' |
(..)(…)\1\2 | \(love\)ing\1rs 保存为变量并替换 |
x{m,n} | o\{5\} o\{5,\} o\{5,10\} #egrep ‘[a-z]{3,5}’ file1长度是3~5以小写字母组成的字串 #egrep ‘go{2,}gle’ some-file前面的字符>2个 #egrep '^ [a-z]{5}' file1行首连续5个小写字母 grep -n '[0-9]\{6,\}$' datebook打印工资是6位数的行并给出行号 |