Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25663
  • 博文数量: 7
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-10 22:42
文章分类

全部博文(7)

文章存档

2011年(1)

2010年(2)

2008年(4)

我的朋友
最近访客

分类: LINUX

2008-03-12 12:56:46

    sed,grep,awk是三个很实用的文字处理命令,他们能和正则表达式能够很多的结合,让你的脚本搜索显现出强大的能力。

1.  正则表达式:

    常用的元字符

                   .          匹配除换行符以外的任意字符

                \w          匹配字母或数字或下划线或汉字

                \s           匹配任意的空白符

                \d           匹配数字

                \b           匹配单词的开始或结束

           以上元字符字母变为大写想反匹配

               ^              匹配字符串的开始

               $              匹配字符串的结束

               [^x]        匹配除了x以外的任意字符
               [^aeiou]    
匹配除了aeiou这几个字母以外的任意字符

    常用限定符

               *         重复零次或更多次

              +          重复一次或更多次

              ?          重复零次或一次

             {n}         重复n

             {n,}        重复n次或更多次

             {n,m}       重复nm

      *?       重复任意次,但尽可能少重复
      +?       
重复1次或更多次,但尽可能少重复
      ??      
重复0次或1次,但尽可能少重复
     {n,m}?   
重复nm次,但尽可能少重复
      {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.   次数查询相关内容

查询interfacel出现有2次的行

#grep 'l\{2,\}' interfaces

allow-hotplug eth0

        # dns-* options are implemented by the resolvconf package, if installed

9.   grep 利用与,或操作

查询193192出现的行

#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                     

 

 

阅读(1760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~