Linux 命令grep正则表达式
在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