1. 简介
grep全称Global Regular Expression Print,全局正则表达式打印.
在这里面提到了三个关键词,我们逐个进行分析,这样有助于我们理解
grep这个命令的作用,1.global说明该命令可以用于所有用户(交互式
用户) 2.Regular Expression的作用想必学过基本程序的同学都知道
Regular Expression最大的作用就是按照规则(模式)去查找匹配的一
段字符串,至于如何按照规则这是后面 3.Print 按照规则搜索的的字
符串当然要打印出来了,不然这是在瞎耽误功夫
综合而论,在多个用户模式下,根据规则搜索查找想要的文本片段,将
其标准输出在交互行(当然可以重定向输出)
2. 语法
Usage:
1
|
grep
[OPTION]... PATTERN [FILE]...
|
eg:
1
2
|
[root@CentOS ~]
# grep -e "^root" /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
|
1
2
3
4
5
6
|
dd
if
=
/dev/zero
of=
/dev/sdb
bs=1M count=612
returnVal=$?
if
[ $returnVal -
eq
0 ];
then
echo
-e
'n\np\n1\n \n+100M\nn\np\n2\n \n+512M\nw'
|
fdisk
/dev/sdb
&>
/dev/null
fi
|
(a)基本程序信息
'--help' 帮助信息
eg:
1
|
grep
--help
|
'-V'
'--version' 程序版本信息及版权信息
1
2
3
4
5
6
|
[root@CentOS ~]
# grep -V
GNU
grep
2.6.3
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http:
//gnu
.org
/licenses/gpl
.html>
This is
free
software: you are
free
to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
|
(b) 匹配控制选项
'-e pattern' 默认选项,表明grep工具使用正则匹配规则搜索数据
eg:
1
2
|
[root@CentOS ~]
# grep -e "/bin/bash" /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
|
'-i' 忽略匹配的大小写结果
eg:
1
2
|
[root@CentOS
test
]
# grep -i "ssh" /etc/passwd
sshd:x:74:74:Privilege-separated SSH:
/var/empty/sshd
:
/sbin/nologin
|
'-v' 将匹配结果反转
eg:
1
2
3
4
|
[root@CentOS
test
]
# grep -iv "ssh" /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
...
|
'-w' 单词匹配(行中只要出现该匹配信息即可返回结果)
eg:
1
2
3
4
5
6
|
# 示例程序
cpuid level :13
wp :
yes
wp
wpp
flags
|
1
2
3
|
[root@CentOS
test
]
# grep -w "wp" b.txt
wp :
yes
wp
|
'-x' 行匹配(行中只出现该匹配信息才返回信息)
eg:
1
2
|
[root@CentOS
test
]
# grep -x "wp" b.txt
wp
|
(c) 通用输出选项
'-c' 匹配正则表达式成功次数
eg:
1
2
|
[root@CentOS
test
]
# grep -c 'root' /etc/passwd
2
|
'--color' 匹配结果高亮标识 {never | always | auto}
eg:
1
|
grep
--color=auto
'root'
/etc/passwd
|
'-m #' 匹配返回次数
eg:
1
2
3
4
5
|
[root@CentOS
test
]
# grep -m 1 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
[root@CentOS
test
]
# grep -m 2 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
|
'-o' 匹配正则表达式所匹配的内容(grep默认情况返回匹配数据的所在行)
eg:
1
2
3
4
5
6
7
8
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -o 'root' /etc/passwd
root
root
root
root
|
'-q' 安静模式,匹配内容没有任何输出
eg:
1
2
3
4
5
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -q 'root' /etc/passwd
[root@CentOS
test
]
#
|
(d) 输出行前缀选项
'-b' 字节偏移打印(需要注意该标识只是每行块首的位置)
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -b 'root' /etc/passwd
0:root:x:0:0:root:
/root
:
/bin/bash
388:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-H' 匹配内容所在文件前缀显示(多文件自动开启)
eg:
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -H 'root' /etc/passwd
/etc/passwd
:root:x:0:0:root:
/root
:
/bin/bash
/etc/passwd
:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep 'root' /etc/passwd ./a.txt
/etc/passwd
:root:x:0:0:root:
/root
:
/bin/bash
/etc/passwd
:operator:x:11:0:operator:
/root
:
/sbin/nologin
.
/a
.txt:root:x:0:0:root:
/root
:
/bin/bash
.
/a
.txt:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-n' 匹配内容所在文件的行号
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -n 'root' /etc/passwd
1:root:x:0:0:root:
/root
:
/bin/bash
11:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-T' 对齐前缀内容,更加美观方便识别
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep -bnH 'root' /etc/passwd
/etc/passwd
:1:0:root:x:0:0:root:
/root
:
/bin/bash
/etc/passwd
:11:388:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -bnHT 'root' /etc/passwd
/etc/passwd
: 1: 0:root:x:0:0:root:
/root
:
/bin/bash
/etc/passwd
: 11: 388:operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-l' 只输出匹配内容所在的文件名(多文件查找,只需要知道存在性时)
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
# grep -l 'root' /etc/passwd ./a.txt ./b.txt
/etc/passwd
.
/a
.txt
[root@CentOS
test
]
#
|
'-L' 输出不匹配内容的文名(一般情况下linux参数大小写都是获取相反的结果)
eg:
1
2
3
4
5
6
|
[root@CentOS
test
]
# grep -l 'root' /etc/passwd ./a.txt ./b.txt
/etc/passwd
.
/a
.txt
[root@CentOS
test
]
# grep -L 'root' /etc/passwd ./a.txt ./b.txt
.
/b
.txt
[root@CentOS
test
]
#
|
'-s' 不显示关于不存在或者无法读取文件的错误信息。
eg:
1
2
3
4
|
[root@CentOS
test
]
# grep 'root' /etc/passwd1
grep
:
/etc/passwd1
: No such
file
or directory
[root@CentOS
test
]
# grep -s 'root' /etc/passwd1
[root@CentOS
test
]
#
|
(e) 内容行选项
'-A #' 匹配内容的之后#行信息
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep -A 1 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
--
operator:x:11:0:operator:
/root
:
/sbin/nologin
games:x:12:100:games:
/usr/games
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-B #' 匹配内容的之前#行信息(第一个匹配项就是第一行)
eg:
1
2
3
4
5
6
7
|
[root@CentOS
test
]
# grep -B 2 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
--
mail:x:8:12:mail:
/var/spool/mail
:
/sbin/nologin
uucp:x:10:14:uucp:
/var/spool/uucp
:
/sbin/nologin
operator:x:11:0:operator:
/root
:
/sbin/nologin
[root@CentOS
test
]
#
|
'-C #' 匹配内容的前后各#行信息
eg:
1
2
3
4
5
6
7
8
|
[root@CentOS
test
]
# grep -C 1 'root' /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
--
uucp:x:10:14:uucp:
/var/spool/uucp
:
/sbin/nologin
operator:x:11:0:operator:
/root
:
/sbin/nologin
games:x:12:100:games:
/usr/games
:
/sbin/nologin
[root@CentOS
test
]
#
|
'--group-separator=string' 当使用到-A,-B,-C时中间可能出现内容分割符,此命令可以替
换中间默认的'--'的分隔符
eg:
1
2
3
4
5
6
7
8
9
|
[root@CentOS
test
]
# grep -C 1 --group-separator=### 'root'
/etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
bin:x:1:1:bin:
/bin
:
/sbin/nologin
###
uucp:x:10:14:uucp:
/var/spool/uucp
:
/sbin/nologin
operator:x:11:0:operator:
/root
:
/sbin/nologin
games:x:12:100:games:
/usr/games
:
/sbin/nologin
[root@CentOS
test
]
#
|
'--no-group-separator' 不显示分隔符,这个就不示例了 :)
(f) 文件及文件夹选项
'-a' 如果需要操作的文件是二进制文件,此命令会将理论可能转换的文字进行匹配
eg:
1
2
3
4
5
|
[root@CentOS ~]
# grep "file" /bin/grep
Binary
file
/bin/grep
matches
[root@CentOS ~]
# grep -a "file" /bin/grep
write error(standard input)lseek failedBinary
file
%s matches
/usr/share/localeGREP_OPTIONSreadskipunknown
devices methodrecurseunknown directories methodinvalid max countbinaryunknown binary-files typeyesforcenevernononeautoif-ttyTERMdumbGREP_COLORGREP_COLORSGNU
grep
2.6.3%s
|
'-r' 如果指定查找对象是一个目录,那么需要使用递归完成所有文件匹配
eg:
1
2
3
4
5
6
|
[root@CentOS ~]
# grep "file" ./test
[root@CentOS ~]
# grep -r "file" ./test
Binary
file
.
/test/grep
matches
.
/test/a
.txt:custom
file
.
/test/a
.txt:
file
custom
[root@CentOS ~]
#
|
'-D' 如果查找的文件中包括设备输入输出,套接字文件的时候,可以选择其他操作{read,
skip},当然如果使用-r或-R遍历时此选项没有效果
'-d' 如果查找的文件是一个目录时,也可以选择其他操作{read,skip}
(g) 其他选项
'--line-buffered' 输出时使用缓存区,这样的好处不言而明 :)
3. grep正则表达式字符集
grep在查询与搜索内容时是支持正则表达式的,很难想象有哪一种操作系统或开发语言
不支持它的,不论是IT运维还是程序员都需要掌握的一种基本技能.当然如果系统管理员
掌握这些之后,可以非常方便的对于系统进行管理与操作,综上所述,学好正则表达式是
学好grep命令的重中之重.接下来我们先接触基本的匹配字符集,由简到繁
(a) 基本集
'.' 匹配一个非换行符的字符 如: gr. => grr | gr
'?' 匹配次数有1次或0次 如: gr? => gr | g
'*' 匹配次数任意次数 如: gr* => grrrrrr | g | gr
'+' 匹配次数至少1次 如: gr+ => gr | grrr
'{n}' 匹配多少次(确定) 如 gr{2} => grrr
'{n,}' 匹配至少n次以上 如 gr{2,} => grrr | grrrrr
'{,m}' 匹配至多m次以内 如 gr{,2} => g | grr
'{n,m}' 匹配次数在n到m次之间 如gr{2,3} => grrr | grrrr
(b) 元字符集(基于POSIX,在使用时需要加入[])
'[:alnum:]' 匹配数字和字符中的一个 例 [0-9A-Za-z]
'[:alpha:]' 匹配基本字符串 例 [A-Za-z]
'[:black:]' 匹配一个制表符和空格符,tab,space键所产生的空格
'[:digit:]' 匹配一个数字 例 [0-9]
'[:punct:]' 匹配一个在半角状态下符号 例 [!"#$%&()*+,-./:;<=>?@[\]^_'{|}~`]
'[:graph:]' 匹配一个[:punct:]和[:alnum:]中的任意一个字符
'[:space:]' 匹配一个space空格字符
'[:print:]' 匹配一个[:punct:]和[:alnum:]和[:space:]中一个字符
'[:lower:]' 匹配一个[a-z]中的任意一个字符
'[:upper:]' 匹配一个[A-Z]中的任意一个字符
'[:xdigit:]' 匹配一个[0-9a-fA-F]中的任一个字符
(c) 特殊表达式
'\b' 匹配字符串时进行完全限定 例: word\b => word 而不限定的话 wor. => work
'\<' 匹配字符串时进行左边限定
'\>' 匹配字符串是进行右边限定 例 \bword\b
=> \<word\>
'\w' 匹配[:alnum:]中外加'_'的任意一个字符
'\s' 匹配[:space:]匹配空格字符串
'()' 将匹配规则看作一个整体出现,不可分割
例 ab*(cc)d* => acc | abccd | abbcc | accdddd
'|' 将匹配规则或处理,注意或者包括前后整体 ab|cd => ab | cd
(4) 锚标记
'^' 行首锚定也代表正则匹配规则开始 例 ^g... => geek | gank
'$' 行尾锚定也代表正则匹配规则结束 例 ...k$ => seek | work
(5) 后项引用
'\n' 与小括号联用,如果当前规则中出现小括号,则在后续的规则中可以进行引用替换,替换
的值需要完全匹配 例 (g..k)\1 => geekgeek | geakgeak
4. 实战
(a) QQ号码
1
|
^[1-9]*[1-9][0-9]*$
|
解析 : QQ号码的开头(^)不能是0,所以是[1-9],[1-9]的可以是任意位*,允许有1位数的QQ
当然你也可以限定QQ号码的位数
1
|
^[1-9][[:digit:]]{5-14}$
|
(b) URL地址
1
2
3
|
^http[s]\?:\/\/\([[:alnum:]-]{1,}\.\){1,}[[:alnum:]-]{1,}\([[:alnum:]-./?%&=]*\)\?$
# http://www.baidu.com
# http://51buy.com
|
解析 : URL可以由http或者https开头,并且s是可选的,接下来//,斜线需要转义,所以出现了
\/\/.然后是任意字母字符可以加-,但必须有1位,所以{1,},接下来出现.号,期间重复出现,
最后可以出现.?=&这些符号,通常是网页参数
1
|
http:
//blog
.51cto.com
/user_index
.php?action=addblog_new&job=modify&tid=1360494
|
(c) IP地址
1
2
3
4
5
6
|
\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)\.
\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)\.
\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)\.
\(25[0-5]\|2[0-4][[:digit:]]\|[1][[:digit:]]\{2\}\|[1-9]\?[[:digit:]]\)
127.0.0.1
255.255.255.0
|
解析 : 猛然一看,可能这个比较难,当我们仔细观察会发现很多都是重复内容,ip地址的匹配
由高位到低位开始,我们先来转换一下这个正则,25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|[1-
9][0-9]|[0-9],这段的意思是说如果ip地址是25开头的3位数字的话,地址可以是250,251,252
253,254,255,接下来就是2开头的其他三位数的匹配,范围可以是2[0-4][0-9],需要注意它们
之间的关系是或者,那么25[0-5]\|2[0-4][[:digit:]]这段我们就可以把200-255这段
ip地址列完,接下来的事情就是在1开头的三位数与二位数继续判断.
本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360494,如需转载请自行联系原作者