Chinaunix首页 | 论坛 | 博客
  • 博客访问: 202594
  • 博文数量: 37
  • 博客积分: 4624
  • 博客等级: 上校
  • 技术积分: 433
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-10 14:06
文章分类

全部博文(37)

文章存档

2012年(6)

2011年(25)

2008年(6)

我的朋友

分类: LINUX

2011-12-20 14:16:03

准备文件:

$ cat data

48     Dec  3BC1997  LPSX 68.00        LVX2A       138

483  Step 3BC1997  LPSX 65.00        LVX2A       182

47     Oct   3BC1997  LPSX 43.00        LVX2A       512

219  dec   3BC1997  LPSX 23.00        LVX2A       68

484  nov   3BC1997  LPSX 49.00        LVX2A       234

483  may 3BC1997  LPSX 37.00        LVX2A       644

216  sept 3BC1997  LPSX 86.00        LVX2A       234

 

1.1.   grep

一般格式:

grep [选项] 基本正则表达式 [文件]

 

选项:

-c 只输出匹配行的计数。

-i 不区分大小写(只适用于单字符)。

-h 查询多文件时不显示文件名。

-l 查询多文件时只输出包含匹配字符的文件名。

-n 显示匹配行及行号。

-s 不显示不存在或无匹配文本的错误信息。

-v 显示不包含匹配文本的所有行。

这里基本正则表达式可为字符串。

输入字符串参数时,最好将其用双引号括起来,可以用来查找多个单词组成的字符串。

在调用变量时,也应该使用双引号,如果不这样,将没有返回结果。

在调用模式匹配时,应使用单引号。

 

查询多个文件:

$ grep "sort" *.doc  在当前目录下所有.doc文件中查找字符串sort

$ grep "sort it" *  在所有文件中查询单词sort it

xxxxx

 

行匹配:

grep -c "483" data

2

grep "483" data

483  Step 3BC1997  LPSX 65.00        LVX2A       182

483  may 3BC1997  LPSX 37.00        LVX2A       644

 

行数:

grep -n "483" data

2:483        Step 3BC1997  LPSX 65.00        LVX2A       182

6:483        may 3BC1997  LPSX 37.00        LVX2A       644

 

显示非匹配行:

grep -v "483" data

48     Dec  3BC1997  LPSX 68.00        LVX2A       138

47     Oct   3BC1997  LPSX 43.00        LVX2A       512

219  dec   3BC1997  LPSX 23.00        LVX2A       68

484  nov   3BC1997  LPSX 49.00        LVX2A       234

216  sept 3BC1997  LPSX 86.00        LVX2A       234

 

精确匹配:

grep '48\>' data

48     Dec  3BC1997  LPSX 68.00        LVX2A       138

\>能匹配tab和空格。

不知道为什么grep '48' data不行,先记下。

 

大小写敏感:

grep -i "step" data

483  Step 3BC1997  LPSX 65.00        LVX2A       182

216  step 3BC1997  LPSX 86.00        LVX2A       234

grep "step" data

216  step 3BC1997  LPSX 86.00        LVX2A       234

wuzhiguo@wuzhiguo-linux:~/program/shell$

 

1.2.   grep和正则表达式

使用正则表达式时最好用单引号括起来,这样可以防止与一些shell命令的特殊方式相混淆。

 

模式范围:

grep '48[34]' data

483  Step 3BC1997  LPSX 65.00        LVX2A       182

484  nov   3BC1997  LPSX 49.00        LVX2A       234

483  may 3BC1997  LPSX 37.00        LVX2A       644

 

不匹配行首:

grep '^[^48]' data

219  dec   3BC1997  LPSX 23.00        LVX2A       68

216  step 3BC1997  LPSX 86.00        LVX2A       234

 

设置大小写:

grep '[Ss]tep' data

483  Step 3BC1997  LPSX 65.00        LVX2A       182

216  step 3BC1997  LPSX 86.00        LVX2A       234

grep '[Ss]tep' data | grep "483"

483  Step 3BC1997  LPSX 65.00        LVX2A       182

 

匹配任意字符:

grep 's..p' data

216  step 3BC1997  LPSX 86.00        LVX2A       234

grep '[A-Za-z][a-z]ep' data

483  Step 3BC1997  LPSX 65.00        LVX2A       182

216  step 3BC1997  LPSX 86.00        LVX2A       234

 

日期查询:

grep '3..199[8,9]' data

483  Step 3BC1998  LPSX 65.00        LVX2A       182

47     Oct   3BC1999  LPSX 43.00        LVX2A       512

grep '[0-9]\{3\}[8,9]' data

483  Step 3BC1998  LPSX 65.00        LVX2A       182

47     Oct   3BC1999  LPSX 43.00        LVX2A       512

 

范围组合:

grep '^[4-9][8-9][1-3]' data

483  Step 3BC1998  LPSX 65.00        LVX2A       182

483  may 3BC1997  LPSX 37.00        LVX2A       644

 

模式出现机率:

grep '9\{3,4\}' data

47     Oct   3BC1999  LPSX 43.00        LVX2A       512

219  dec   3BC9999  LPSX 23.00        LVX2A       68

grep '9\{3,\}' data

47     Oct   3BC1999  LPSX 43.00        LVX2A       512

219  dec   3BC9999  LPSX 23.00        LVX2A       68

grep '9\{3\}' data

47     Oct   3BC1999  LPSX 43.00        LVX2A       512

219  dec   3BC9999  LPSX 23.00        LVX2A       68

 

使用grep匹配“与”或者“或”模式:

grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为219216,方法如下:

grep -E '483|484' data

483  Step 3BC1998  LPSX 65.00        LVX2A       182

484  nov   3BC1997  LPSX 49.00        LVX2A       234

483  may 3BC1997  LPSX 37.00        LVX2A       644

 

空行:

$ grep '^$' data

 

$

 

匹配特殊字符:

grep '68.00' data

48     Dec  3BC1997  LPSX 68.00        LVX2A       138

483  Step 3BC1998  LPSX 68*00       LVX2A       182

grep '68\.00' data

48     Dec  3BC1997  LPSX 68.00        LVX2A       138

 

查询格式化文件名:

ls -l | grep '[a-z]\{1,3\}\.[A-Z]\{2\}'

-rw-rw-r-- 1 wuzhiguo wuzhiguo   0 2011-12-20 13:33 a.AB

-rw-rw-r-- 1 wuzhiguo wuzhiguo   0 2011-12-20 13:33 def.DE

 

查询IP地址:

grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9a]\{1,3\}' data

192.168.1.2

123.345.678.901

192.168.1.a

 

1.3.   系统grep命令

 

目录:

ls -l | grep '^d'

drwxrwxr-x 2 wuzhiguo wuzhiguo 4096 2011-12-20 13:41 dir

drwxrwxr-x 2 wuzhiguo wuzhiguo 4096 2011-12-20 13:41 dir2

ls -l | grep '^[^d]'

总用量 16

-rw-rw-r-- 1 wuzhiguo wuzhiguo    0 2011-12-20 13:33 a.AB

-rw-rw-r-- 1 wuzhiguo wuzhiguo    0 2011-12-20 13:33 Abc.ab

-rw-rw-r-- 1 wuzhiguo wuzhiguo  311 2011-12-20 13:37 data

-rw-rw-r-- 1 wuzhiguo wuzhiguo    0 2011-12-20 13:33 def.DE

-rw-rw-r-- 1 wuzhiguo wuzhiguo   12 2011-12-19 17:52 file

ls -l | grep '^[^d]......rwx'

-rw-rw-rwx 1 wuzhiguo wuzhiguo   12 2011-12-19 17:52 file

 

passwd文件:

grep 'wuzhiguo' /etc/passwd

wuzhiguo:x:1000:1000:wuzhiguo,,,:/home/wuzhiguo:/bin/bash

grep 'wuzhiguo' /etc/passwd > wuzhiguo.log

cat wuzhiguo.log

wuzhiguo:x:1000:1000:wuzhiguo,,,:/home/wuzhiguo:/bin/bash

 

使用ps命令:

ps -ef | grep "java"

wuzhiguo  4947  2397  0 13:52 pts/0    00:00:00 grep --color=auto java

 

对一个字符串使用grep

$ str="123ABC123"

$ echo $str

123ABC123

$str | grep '[0-9]\{3\}[A-Z]\{3\}[0-9]\{3\}'

123ABC123

阅读(772) | 评论(0) | 转发(0) |
0

上一篇:正则表达式介绍

下一篇:AWK介绍

给主人留下些什么吧!~~