7、模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '4\{2,\}' data.f
483 may 5PA1998 USP 37.00 KVM9D 644
上述语法指明数字4至少重复出现两次,注意有无边界字符的区别。
同样,抽取记录使之包含数字9 9 9(三个9),方法如下:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '9\{3,\}' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
如果要查询重复出现次数一定的所有行,语法如下,数字9重复出现两次或三次:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '9\{3\}' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
[sam@chenwy sam]$ grep '9\{2\}' data.f
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
有时要查询重复出现次数在一定范围内,比如数字或字母重复出现2到6次,下例匹配数字8重复出现2到6次,并以3结尾:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ cat myfile
83
888883
8884
88883
[sam@chenwy sam]$ grep '8\{2,6\}3' myfile
888883
88883
8、使用grep匹配“与”或者“或”模式
g r e p命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
9、空行
结合使用^和$可查询空行。使用- c参数显示总行数:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep -c '^$' myfile
使用- n参数显示实际在哪一行:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep -c '^$' myfile
10、匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含“.”的所有行,脚本如下:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '\.' myfile
或者是一个双引号:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '\"' myfile
以同样的方式,如要查询文件名c o n f t r o l l . c o n f(这是一个配置文件),脚本如下:
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep 'conftroll\.conf' myfile
11、查询格式化文件名
使用正则表达式可匹配任意文件名。系统中对文本文件有其标准的命名格式。一般最多六个小写字符,后跟句点,接着是两个大写字符。
[Copy to clipboard] [ - ]
CODE:
[sam@chenwy sam]$ grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename
这个写法我不知道有没有错 :oops: :oops: :oops:
12 查询IP地址
要查看n n n . n n n网络地址,如果忘了第二部分中的其余部分,只知有两个句点,例如n n n . n n . .。要抽取其中所有nnn.nnn IP地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ } \。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。
[Copy to clipboard] [ - ]
CODE:
[0-9]\{3\}\.[0-9]\{3\}\.'
上面还有一点错,改天更正
1、类名
g r e p允许使用国际字符模式匹配或匹配模式的类名形式。
类名及其等价的正则表达式类等价的正则表达式类等价的正则表达式
QUOTE:
[ [ : u p p e r : ] ] [ A - Z ] [ [ : a l n u m : ] ] [ 0 - 9 a - zA-Z]
[ [ : l o w e r : ] ] [ a - z ] [ [ : s p a c e : ] ] 空格或t a b键
[ [ : d i g i t : ] ] [ 0 - 9 ] [ [ : a l p h a : ] ] [ a - z A - Z ]
例一:取以5开头,后跟至少两个大写字母:
[Copy to clipboard] [ - ]
CODE:
$grep '5[[:upper:]][[:upper]]' data.f
取以P或D结尾的所有产品代码:
[Copy to clipboard] [ - ]
CODE:
grep '[[:upper:]][[:upper:]][P,D]' data.f
2、使用通配符*的匹配模式
[Copy to clipboard] [ - ]
CODE:
$cat testfile
looks
likes
looker
long
试试如下:
[Copy to clipboard] [ - ]
CODE:
grep "l.*s" testfile
如在行尾查询某一单词,试如下模式:
[Copy to clipboard] [ - ]
CODE:
grep "ng$" testfile
这将在所有文件中查询行尾包含单词ng的所有行。
3、系统grep
文件passwd
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# grep "sam" /etc/passwd
sam:x:506:4::/usr/sam:/bin/bash
上述脚本查询/ e t c / p a s s w d文件是否包含sam字符串
如果误输入以下脚本:
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# grep "sam" /etc/password
grep: /etc/password: 没有那个文件或目录
将返回g r e p命令错误代码'No such file or directory'。
上述结果表明输入文件名不存在,使用g r e p命令- s开关,可屏蔽错误信息。
返回命令提示符,而没有文件不存在的错误提示。
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# grep -s "sam" /etc/password
如果g r e p命令不支持- s开关,可替代使用以下命令:
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# grep "sam" /tec/password >/dev/null 2>&1
脚本含义是匹配命令输出或错误( 2 > $ 1),并将结果输出到系统池。大多数系统管理员称/ d e v / n u l l为比特池,没关系,可以将之看成一个无底洞,有进没有出,永远也不会填满。
上述两个例子并不算好,因为这里的目的只想知道查询是否成功。
如要保存g r e p命令的查询结果,可将命令输出重定向到一个文件。
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# grep "sam" /etc/passwd >/usr/sam/passwd.out
[root@Linux_chenwy sam]# cat /usr/sam/passwd.out
sam:x:506:4::/usr/sam:/bin/bash
脚本将输出重定向到目录/ t m p下文件p a s s w d . o u t中。
使用ps命令
使用带有ps x命令的g r e p可查询系统上运行的进程。ps x命令意为显示系统上运行的所有进程列表。要查看D N S服务器是否正在运行(通常称为n a m e d),方法如下:
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# ps ax|grep "named"
2897 pts/1 S 0:00 grep named
输出也应包含此g r e p命令,因为g r e p命令创建了相应进程, ps x将找到它。在g r e p命令中使用- v选项可丢弃p s命令中的g r e p进程。如果ps x不适用于用户系统,替代使用ps -ef。这里,由于我没有DNS服务,因而只有grep进程。
对一个字符串使用grep
g r e p不只应用于文件,也可应用于字符串。为此使用e c h o字符串命令,然后对g r e p命令使用管道输入。
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# STR="Mary Joe Peter Pauline"
[root@Linux_chenwy sam]# echo $STR | grep "Mary"
Mary Joe Peter Pauline
匹配成功实现。
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# echo $STR | grep "Simon"
因为没有匹配字符串,所以没有输出结果。
4、egrep
e g r e p代表e x p r e s s i o n或extended grep,适情况而定。e g r e p接受所有的正则表达式, e g r e p的一个显著特性是可以以一个文件作为保存的字符串,然后将之传给e g r e p作为参数,为此使用- f开关。如果创建一个名为g r e p s t r i n g s的文件,并输入4 8 4和4 7:
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# vi grepstrings
[root@Linux_chenwy sam]# cat grepstrings
484
47
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# egrep -f grepstrings data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
484 nov 7PL1996 CAD 49.00 PLV2C 234
上述脚本匹配d a t a . f中包含4 8 4或4 7的所有记录。当匹配大量模式时, - f开关很有用,而在一个命令行中敲入这些模式显然极为繁琐。
如果要查询存储代码3 2 L或2 C C,可以使用(|)符号,意即“|”符号两边之一或全部。
[Copy to clipboard] [ - ]
CODE:
[root@Linux_chenwy sam]# egrep '(3ZL|2CC)' data.f
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
可以使用任意多竖线符“ |”,例如要查看在系统中是否有帐号l o u i s e、m a t t y或pauline ,使用w h o命令并管道输出至e g r e p。
[Copy to clipboard] [ - ]
CODE:
$who |egrep (louise|matty|pauline)
还可以使用^符号排除字符串。如果要查看系统上的用户,但不包括m a t t y和p a u l i n e,方法如下:
[Copy to clipboard] [ - ]
CODE:
$who |egrep -v '^(matty|pauline)'
如果要查询一个文件列表,包括s h u t d o w n、s h u t d o w n s、r e b o o t和r e b o o t s,使用e g r e p可容易地实现。
[Copy to clipboard] [ - ]
CODE:
$egrep '(shutdown |reboot) (s)?' *