在linux里面有处理文本的三剑客,现在我要说的就是grep正则表达式的使用,正则表达式只是一种表示法,只要工具支持这种表示法,那么该工具就可以处理正则表达式的字符串。vi grep ,awk ,sed 等都支持正则表达式.。正则表达式有基本正则表达式和扩展正则表达式。

grep默认就是基本表达式。

基本正则表达式: 默认匹配次数:贪婪模式,尽可能多的去匹配。

扩展正则表达式:基于基本正则表达式多加了一些功能,基本一样。

 

1、 grep命令

grep 【参数】 搜索文件

参数:

--color=auto:对匹配到的串做高亮显示

-v:显示模式匹配不到行

-i:忽略字符大小写;

-o:仅显示能够被模式匹配到的串本行

-q: 静默模式

-E:使用扩展的正则表达式

-n: 顺便输出行号

 

基本正则表达式的元字符:

字符匹配:

.: 匹配任意单个字符;

[]:匹配指定范围内的任意单个字符;

[^]:匹配指定范围内的任意单个字符;

次数匹配:用于要指定其次数的字符的后面;

*: 任意次;

\\?:0或1次;

\\+:1或多次;

\\{m\\}:精确限制为m次;

\\{m,n\\}: 至少m次,至多n次,[m,n]

\\{0,n\\}:至多n次;

\\{m,\\}:至少m次;

.*: 匹配任意长度的任意字符;

位置锚定:

^: 行首锚定;用于模式的最左侧;

$: 行尾锚定;用于模式的最右侧;

\\<,\\b: 词首锚定;用于表示单词的模式的左侧;

\\>, \\b:词尾锚定;用于表示单词的模式的右侧;

^$: 空白行;

分组:\\(\\)

分组的小括号中的模式匹配到的内容,会在执行过程中被正则表达式引擎记录下来,并保存内置的变量中;这些变量分别是\\1, \\2, ...

\\1: 从左侧起,第一个左括号,以及与之配对的右括号中间的模式所匹配到的内容;

后向引用:使用变量引用前面的分组括号中的模式所匹配到的字符;


2、egrep命令

扩展正则表达式的元字符:

字符匹配:

.: 任意单个字符

[]:

[^]:

次数匹配:

*

?: 0次或1次;

+: 1次以上;

{m}: 精确匹配m次;

{m,n}: 至少m次,至多n次;

锚定:

^: 锚定行首

$: 锚定行尾

\\<, \\b

\\>, \\b

分组:()


题:显示/etc/passwd文件中以bash结尾的行

-bash-4.1#grep --color 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
Oracle:x:3000:3000::/home/database:/bin/bash
51CTO:x:3001:3001::/home/51CTO:/bin/bash

题:显示/etc/passwd文件中的两位数或三位数

-

bash-4.1#grep --color '\\b[[:digit:]]\\{2,3\\}\\b' /etc/passwd
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:Systemmessage bus:/:/sbin/nologin

题:显示`netstat -tan`命令结果中以‘LISTEN’后跟0个、1个或者多个空白字符结尾的行

-bash-4.1#netstat -tan |grep --color 'LISTEN[[:space:]]*$'
tcp        0     0 0.0.0.0:111                0.0.0.0:*          LISTEN     
tcp        0     0 0.0.0.0:22                 0.0.0.0:*                   LISTEN     
tcp        0     0 127.0.0.1:631              0.0.0.0:*                   LISTEN     
tcp        0     0 127.0.0.1:25               0.0.0.0:*                   LISTEN


题:添加用户bash、testbash、basher以及nologin用户(nologin用户的shell为/sbin/nologin);而后找出/etc/passwd文件中用户名与其shell名相同的行

-bash-4.1#grep --color '\\(bash\\).*\\1' /etc/passwd
bash:x:3002:3002::/home/bash:/bin/bash
testbash:x:3003:3003::/home/testbash:/bin/bash
basher:x:3004:3004::/home/basher:/bin/bash

 

-bash-4.1#grep --color '^\\(nologin\\).*\\1' /etc/passwd
nologin:x:3005:3005::/home/nologin:/sbin/nologin

题:显示当前系统上root、centos或者user1用户的默认shell和UID (请事先创建这些用户,若不存在)

-bash-4.1#grep -E --color '^root|^centos|^user1' /etc/passwd | cut -d: -f1,3,7
root:0:/bin/bash
centos:3006:/bin/bash
user1:3007:/bin/bash

题:找出/etc/rc.d/init.d/functions文件中某单词(单词中间可以存在下划线)后面跟着一组小括号的行

-bash-4.1#grep --color '.*()' /etc/rc.d/init.d/functions
fstab_decode_str(){
checkpid(){
__readlink(){
__fgrep(){
__umount_loop(){
__umount_loopback_loop(){


题:使用echo输出一个路径,而后egrep找出其路径基名;进一步的使用egrep取出其目录名

-bash-4.1#echo /etc/sysconfig/network-scripts/ifcfg-eth0 |grep --color '.*'
/etc/sysconfig/network-scripts/ifcfg-eth0
-bash-4.1#echo /etc/sysconfig/network-scripts/ifcfg-eth0 |egrep --color -o '^/.*/'
/etc/sysconfig/network-scripts/

 

 

题:找出ifconfig命令执行结果中1-255之间的数字

-

bash-4.1#ifconfig | egrep --color'\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[1-9][0-9]|25[0-9])\>'
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7E:E8:80 
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe7e:e880/64Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500 Metric:1
          RX bytes:791817 (773.2 KiB)  TX bytes:379603 (370.7 KiB)
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536 Metric:1