文本查找工具:grep, egrep, fgrep

grep:

grep -E = egrep

 

正则表达式:regular expression, regex

由元字符组合的式子,可以当作pattern使用以匹配符合指定特征的字符串

 

基本正则表达式

b

扩展正则表达式

e

元字符:

^PATTERN 行首锚定符  要求必须出现在行首

PATTERN$ 行尾锚定符  要求必须出现在行尾

^PATTERN$     PATTERN   要求必须出现在行首及行尾

“\<PATTERN”    词首锚定符  要求PATTERN出现在词首

“PATTERN\>”    词尾锚定符  要求PATTERN必须出现在词尾

“\<PATTERN\>”   单词锚定符 要求精确匹配一个单词

.              任意单个非空白字符,不能指定多个字符   #grep  --color=auto ‘r….t’ file

星号*     匹配此前的字符0到任意次 a*b,ab,aab,acb,b  *做次数匹配,而不是字符匹配

.*        陪陪任意长度的任意字符      #grep  --color=auto ‘r.*t’ file 默认工作在贪婪模式下,尽可能长的匹配符合模式的字符串

        匹配此前的字符0次或1

PATTERN\{m,n\}   匹配此前的字符至少m次,之多n

\{0,5\}   至多5        #grep –color=auto “r.\{3,10\}t” file

\{5,\}    至少5

\{5\}     匹配5

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

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

[:space:]  #grep  --color=auto “r[[:alpha:]]\{3,10\}t” file 指定以r开头,t 结尾的中间以字母并且出现310

\(\)  \1,\2,\3 

[root@station30 ~]# cat grep.txt

andyedu is a linux lover,www.andyedu.com

andyemu is a linux lover,www.andyemu.com

andyedu is a linux lover,www.andyemu.com

[root@station30 ~]# grep  --color=auto "andye[dm]u.*andye[dm]u\.com" grep.txt

andyedu is a linux lover,www.andyedu.com

andyemu is a linux lover,www.andyemu.com

andyedu is a linux lover,www.andyemu.com

[root@station30 ~]# grep --color=auto "\(andye[dm]u\).*\1\.com" grep.txt

andyedu is a linux lover,www.andyedu.com

andyemu is a linux lover,www.andyemu.com

\(\) \1  \前边出现的字符出现 \1表示匹配第一个括号内的字符。

 

[root@station30 ~]# clear

[root@station30 ~]# cat grep2.txt

abc.111.222.333

12a.333.444.567

11.222.333.444

111.2.333.333

444.444.444.111

[root@station30 ~]# grep "[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}" grep2.txt

444.444.444.111

 

Practice1: 查找当前系统上名字为user1的用户的帐号的相关信息, /etc/passwd, user11, myuser1

[root@station30 ~]# tail -2 /etc/passwd

user11:x:5001:5001::/home/user11:/bin/bash

myuser11:x:5002:5002::/home/myuser11:/bin/bash 

 

[root@station30 ~]# grep  "^user11:"  /etc/passwd   user11:为行首锚定符

user11:x:5001:5001::/home/user11:/bin/bash

 

grep  "^user11\>"  /etc/passwd                   user11为行首和词尾的锚定符

user11:x:5001:5001::/home/user11:/bin/bash

 

practice2: 查找当前系统上以其为附加组的用户有两个或两个以上的组的相关信息, /etc/group, :,

 

practice3:查找当前系统上其用户帐号密码最长使用期为99999天的用户帐号的相关信息;99999

#grep  --color=auto  "\(.*:\)\{4\}99999"  /etc/shadow

# grep "[^:]*:[^:]*:[^:]*:[^:]*:99999:" /etc/shadow

 

Practice4: 分析/etc/inittab文件中如下两行的文本特征,请写出可以精确找到类似两行的模式,而且要求每一行中出现在数字必须相同

grep --color=auto "l\([1-5]\):\1:wait:/etc/rc.d/rc[[:space:]]\{1,\}\1" /etc/inittab

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

 

grep的常用选项:

   --color=auto|always

   -v  取反                       不匹配的显示

   -i  忽略大小写                 字母不区分大小写

   -r  表示搜索多个文件,在指定路径下搜索某个递归的文件

   -B  跟上一个数字,在匹配出来的字符串之前多少行显示出来

   -A  跟上一个数字,在匹配出来的字符串之后多少行显示出来

   -C  跟上一个数字,在匹配出来的字符串前后多少行显示出来

   -o  只显示被模式匹配的字符串,而非显示字符串所在的行

 

学习正则表达式的学习帮助:

#man 7 regex

 

扩展正则表达式

grep –E

\{m,n\} , {m,n}  匹配此前的字符至少m次,至多n

         \(\), () 

         |         表示或的意思  #egrep –n ‘gd |good ‘ file

[root@station30 ~]# grep -E "^root|redhat" /etc/passwd 

root:x:0:0:root:/root:/bin/bash

redhat:x:5005:5005::/home/redhat:/bin/bash

         +         重复一个或一个以上的RE字符  egrep –n ‘go+d’ file o+表示不止一个o

 

我们怎么去grep一个IP地址:

[1-9]   | [1-9][0-9] | 1[0-9][0-9] | 2[0-1][0-9] | 22[0-3]

第一位 |第二位   |第三位

如何搜寻IP地址范例:

[root@station30 ~]# cat grep2.txt

abc.111.222.333

12a.333.444.567

11.222.333.444

111.2.333.333

444.444.444.111

192.168.254.1

172.16.254.253

10.10.2.1

100.299.21.023

[root@station30~]#grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-1][0-9]|22[0-3])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}\>" grep2.txt

192.168.254.1

172.16.254.253

10.10.2.1

 

输入输出重定向,管道的实现

标准输入:键盘                         0

标准输出:monitor                       1

错误输出:--跟标准输入、输出没有关系    2

 

重定向:

覆盖输出重定向:范例:#ls /etc  > /tmp/etc.out  输出重定向每次都要覆盖原输出结果

注:我们可以使用#set –c 来拒绝覆盖输出重定向;#set +c开启覆盖重定向

这个时候,如果我们需要确定覆盖的话,则我们可以在 >| 来实现

追加输出重定向:>>

错误输出重定向:2>  只定向错误输出,不定向正常输出。

                2>> 错误追加输出重定向,不覆盖

&>整合标准输出和错误输出保存到同一个文件中去;

 

2>&1 将错误的输出信息整合输出到正确输出中去;

 

命令执行结束后,都有一个推出码

成功执行:0

错误执行:1-255

获取返回值:#echo $?

[root@station30 ~]# date TT &> /dev/null

[root@station30 ~]# echo $?

1   这个时候的返回码是1,表示执行错误。

/dev/null 这是一个模拟出来的设备,bit bucket, 位桶

 

输入重定向:

<将数据流从一个文件来进行导入

<< Here Document 用来生成文档   --在脚本中使用可以用来生成一个文档

[root@station30 ~]# cat > /tmp/a.out << END

> I am andy

> You are steve

> you are bill

> END

[root@station30 ~]# cat /tmp/a.out

I am andy

You are steve

you are bill

管道:|管道是将前一个命令的输出通过一个内部通道送给后一个命令,被后一个命令到做输入。

COMMAND1 | COMMAND2 | COMMAND3  连接多个小程序完成一个复杂的任务。

 

[root@station30 ~]# ifconfig | less  可以分页查看IP地址信息

[root@station30 ~]# ifconfig | grep "inet addr:" |cut -d: -f2 |cut -d' ' -f1 |grep -v "127.0.0.1"

172.16.31.1

 

Tee 命令  “read from standard input and write to standard output and files”

既可以显示到屏幕,有可以输出

[root@station30 ~]# ls /var | tee /tmp/varout.2

account

cache

cvs

…