文本查找工具: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 结尾的中间以字母并且出现3到10次
\(\) \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
…