sed,grep,awk是三个很实用的文字处理命令,他们能和正则表达式能够很多的结合,让你的脚本搜索显现出强大的能力。
1.
正则表达式:
常用的元字符
.
匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\s
匹配任意的空白符
\d
匹配数字
\b
匹配单词的开始或结束
以上元字符字母变为大写想反匹配
^
匹配字符串的开始
$
匹配字符串的结束
[^x]匹配除了x以外的任意字符[^aeiou]匹配除了aeiou这几个字母以外的任意字符
常用限定符
*
重复零次或更多次
+
重复一次或更多次
?
重复零次或一次
{n}
重复n次
{n,}
重复n次或更多次
{n,m}
重复n到m次
*?重复任意次,但尽可能少重复+?重复1次或更多次,但尽可能少重复??
重复0次或1次,但尽可能少重复{n,m}?
重复n到m次,但尽可能少重复{n,}?
重复n次以上,但尽可能少重复
捕获(exp) 匹配exp,并捕获文本到自动命名的组里(?exp)匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp)
匹配exp,不捕获匹配的文本,也不给此分组分配组号位置指定(?=exp)
匹配exp前面的位置(?<=exp)匹配exp后面的位置(?!exp)
匹配后面跟的不是exp的位置(?匹配前面不是exp的位置注释(?#comment) 这种类型不对正则表达式的处理产生任何影响,用于提供注释让人阅读其它表达式
\a
报警字符(打印它的效果是电脑嘀一声)
\b 通常是单词分界位置,但如果在字符类里使用代表退格\t 制表符,Tab
\r 回车\v 竖向制表符\f 换页符\n 换行符\e Escape
\0nn ASCII代码中八进制代码为nn的字符\xnn ASCII代码中十六进制代码为nn的字符\unnnn Unicode代码中十六进制代码为nnnn的字符\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开头(类似^,但不受处理多行选项的影响)
\Z 字符串结尾或行尾(不受处理多行选项的影响)
\z 字符串结尾(类似$,但不受处理多行选项的影响)
\G 当前搜索的开头
grep
grep格式:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。
在用grep进行查询时注意事项:
1.
查询字符串特别是多个字符时应该用“”,如 grep “linuxdn” 这样做的好处有两个,一是防止被误认为shell命令;二是防止被误认为文件,如
grep linuxdn dd查询结果可能为” No such file or
directory”.
2.
在调用变量也要使用双引号,诸如:grep “$linuxdn”
file,如果不这样,将,没有返回结果。
3.
在调用模式匹配时,应使用单引号如 grep ‘l…n’ file.
4.
查询特殊字符进要用\
grep选项
常用选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
其它选项
-a 忽略二进制数据
-A 搜索符合字符串后依指定行数之后行数的所有显示
-b 显示符合模板样式的前一行,标出第一个字的位置
-B搜索符合字符串后依指定行数之前行数的所有显示
-C 输出匹配行的计数与之后指定行的行数内容
-d 指定搜索的为目录
-e 搜索指定字符串的文件内容(模板样式)
-E搜索指定字符串的文件内容(普通表示法)
-f 指定模板文件
-F 模板样式为固定字符串列表
-G模板样式为普通列表
-H查询多文件时显示文件名
-I 列出文件内容符合指定模板的文件名
-L列出文件内容不符合指定模板的文件名
-q 不显示任何信息
-V显示版本信息
-y 与-I相同
--help 帮助信息
grep 举例说明
有interface文件内容如下:
# and how to activate them. For more
information, see interfaces(5).
# The loopback network
interface
auto lo eth1
iface lo inet loopback
# The primary network
interface
allow-hotplug eth0
iface eth0 inet static
address 193.168.20.203
netmask 255.255.255.0
network 193.168.20.0
broadcast 193.168.20.255
gateway 193.168.20.1
# dns-* options are implemented by the resolvconf package, if
installed
dns-nameservers 202.106.0.20
dns-search rising.com.cn
iface eth1 inet static
address 192.168.110.148
netmask 255.255.255.0
有passwd 文件内容如下:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List
Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting
System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
rising:x:1000:1000:rising,,,:/home/rising:/bin/bash
sshd:x:100:65534::/var/run/sshd:/usr/sbin/nologin
mysql:x:101:103:MySQL
Server,,,:/var/lib/mysql:/bin/false
Debian-exim:x:102:104::/var/spool/exim4:/bin/false
ftp:x:103:65534::/home/ftp:/bin/false
1.
在多个文件中查询字符串
如果要在当前目录下所有.txt文件中查找字符串“
linuxdn”,方法如下:
# grep "linuxdn" *.txe
或在所有文件中查询单词“ linuxdn
”
# grep "linuxdn" *
2.
行匹配
查询# grep -c "1" passwd
10
grep返回数字10,意义是有10行包含字符串“1”。
3.
显示显示满足匹配模式的所有行行数
#grep -n "1" passwd
2:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
7:man:x:6:12:man:/var/cache/man:/bin/sh
11:uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
12:proxy:x:13:13:proxy:/bin:/bin/sh
17:gnats:x:41:41:Gnats Bug-Reporting
System (admin):/var/lib/gnats:/bin/sh
19:rising:x:1000:1000:rising,,,:/home/rising:/bin/bash
20:sshd:x:100:65534::/var/run/sshd:/usr/sbin/nologin
21:mysql:x:101:103:MySQL
Server,,,:/var/lib/mysql:/bin/false
22:Debian-exim:x:102:104::/var/spool/exim4:/bin/false
23:ftp:x:103:65534::/home/ftp:/bin/false
4.
显示非匹配行
#grep –v "1" passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List
Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
5.
精确匹配
使用geep精确匹配方式是在抽取字符串后加\ >假定在interface中精确抽取含有203的一行
方法如下:
#grep '203\>'
interfaces
address 193.168.20.203
6.
带范围匹配
如在interfacek 查找含有192 和 193 的行
#grep '19[23]' interfaces
address 193.168.20.203
network 193.168.20.0
broadcast 193.168.20.255
gateway 193.168.20.1
address
192.168.110.148
7.
带元字符查询
查询interface首行是allow
#grep '^allow' interfaces
allow-hotplug eth0
查询首行不是address
#grep '^[^address]'
interfaces
# This file describes the network
interfaces available on your system
# and how to activate them. For more
information, see interfaces(5).
# The loopback network
interface
iface lo inet loopback
# The primary network
interface
iface eth0 inet static
address 193.168.20.203
netmask 255.255.255.0
network 193.168.20.0
broadcast 193.168.20.255
gateway 193.168.20.1
# dns-* options are implemented by the resolvconf package, if
installed
dns-nameservers 202.106.0.20
dns-search rising.com.cn
iface eth1 inet static
address 192.168.110.148
netmask
255.255.255.0
8.
次数查询相关内容
查询interface中l出现有2次的行
#grep 'l\{2,\}' interfaces
allow-hotplug eth0
# dns-* options are implemented by the resolvconf package, if
installed
9.
grep 利用与,或操作
查询193或192出现的行
#grep -E '192|193'
interfaces
address 193.168.20.203
network 193.168.20.0
broadcast 193.168.20.255
gateway 193.168.20.1
address
192.168.110.148
10.
查询空行,可利用^ $进行查询
#grep
‘^$’ interface
11.
利用正则表达式进行查询
查询interface 中193.168.20.*的IP
#grep '193.168.20.[0-9]\{1,3\}'
interfaces
address 193.168.20.203
network 193.168.20.0
broadcast 193.168.20.255
gateway 193.168.20.1
12.
利用系统查询
grep 的一个强大功能就是和一些系统命令结合使用比如ls,find,ps等,关于这方面例子就太多了,我就不再说了,等大家在工作学习中慢慢体会吧。
今天很累了写了这么多,可以休息一会了,哈哈。以后我们再说关于awk,和sed。