介绍
ls /usr/bin | grep zip
这个命令会列出,位于目录 /usr/bin 中,文件名中包含子字符串“zip”的所有文件。
这个 grep 程序以这样的方式来接受选项和参数:
grep [options] regex [file...]
这里的 regx 是指一个正则表达式。
下面是grep的常见options列表:
-i:模式匹配时忽略大小写
-V:显示不匹配的行
-l:列出匹配模式的文件名称,而不是打印匹配的行
-n:列出检索目标所在的行号
-c:统计匹配的行总数,不显示行信息
grep 正则表达式示例
在 /etc/passswd 目录中搜索 ‘liuyan’:
grep liuyan /etc/passwd
输出:
liuyan:x:1001:1001:,,,:/home/liuyan:/bin/bash
搜索大小写任意的 liuyan 或 raj:
grep -E -i -w 'liuyan|raj'/etc/passwd
这里加上-E,就是一个扩展的正则表达式的模式。
锚点
你可以分别使用 ^ 和 $ 符号来正则匹配输入行的开始或结尾。
grep ^liuyan /etc/passwd
仅仅只搜索出以单词 liuyan 开始的行,即不显示 liuyangit、liuyang 等:
grep -w ^liuyan /etc/passwd
grep 'foo$' 文件名 #找出以单词foo结尾的行
grep '^foo$' 文件名 #匹配仅仅只包含foo的行
grep '^$' 文件名 #搜索空行
字符类
grep '[lL]iuyan' 文件名
grep -w '[lL]iuyan[0-9]' 文件名
grep 'foo[0-9][0-9]' 文件名
grep '[A-Za-z]' 文件名
grep [wn] 文件名
放在括号内的表达式,即包在 “[[:” 和 “:]]” 之间的字符类的名字,它表示的是属于此类的所有字符列表。标准的字符类名称如下:
[[:alnum:]] - 字母数字字符
[[:alpha:]] - 字母字符
[[:blank:]] - 空字符: 空格键符 和 制表符
[[:digit:]] - 数字: '0 1 2 3 4 5 6 7 8 9'
[[:lower:]] - 小写字母: 'a b c d e f g h i j k l m n o p q r s t u v w x y z'
[[:space:]] - 空格字符: 制表符、换行符、垂直制表符、换页符、回车符和空格键符
[[:upper:]] - 大写字母: 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
grep '[[:upper:]]' 文件名 #匹配所有大写字母
通配符
你可以使用 “.” 来匹配单个字符。
grep '\<b.t\>' 文件名 #匹配以 "b" 开头以 "t" 结尾的3个字符的单词
grep '^..$' 文件名 #匹配只有两个字符的所有行
grep '^\.[0-9]' 文件名 #匹配以一个点和一个数字开头的行
\< 匹配单词前面的空字符串
\> 匹配单词后面的空字符串
egrep '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' 文件名 #匹配通用的IP地址
grep -e '--test--'文件名 #搜索以“-” 符号开头的匹配模式,如果不用-e选项grep 命令会试图把 '--test--' 当作自己的选项参数来解析
grep -E 'word1|word2'文件名 #使用 grep 的“或”匹配
grep 'word1' 文件名 | grep 'word2' #使用 grep 的“和”匹配
序列检测
egrep "v{2}" 文件名 #匹配字符 “v" 出现两次
egrep 'co{1,2}l' 文件名 #匹配 "col" 和 "cool"
egrep 'c{3,}'文件名 #匹配至少有三个 'c' 字符的所有行
grep "[[:digit:]]\{2\}[-]\?[[:digit:]]\{10\}" 文件名 #匹配 91-1234567890(二个数字-十个数字) 这种格式
总结
字符限定符
. 匹配任意的一个字符
- 在[]中表示字符范围
[] 代表一定有一个在括号内的字符(非任意字符)
[^] 若括号内的第一个字符为指数字符(^),那表示反向选择
数量限定符
? 匹配前面的子表达式,0-1次。
* 匹配前面的子表达式,0-N次。
+ 匹配前面的子表达式,1-N次。
{N} 匹配前面的子表达式 N 次。
{N,} 匹配前面的子表达式 N 次到多次。
{N,M} 匹配前面的子表达式 N 到 M 次。
位置限定符
^ 匹配行首位置。
$ 匹配行尾位置。
\b 匹配一个单词前后的空字符串。
\B 匹配一个单词中间的空字符串。
\< 匹配单词前面的空字符串。
\> 匹配单词后面的空字符串。
egrep -c '[[:punct:]]{2,}' -r ./raw_data #查找超过两个标点在一起的行数
egrep -c '\.{2,}' -r ./raw_data #查找超过两个.在一起,有多少行
grep -o 'n.t' nohup.out |wc -l #个数
grep -o ‘objStr1\|objStr2' filename|wc -l #直接用\| 链接起来即可