1、或操作
grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行egrep '123|abc' filename // 用egrep同样可以实现awk '/123|abc/' filename // awk 的实现方式
2、与操作
grep pattern1 files | grep pattern2 //显示既匹配 pattern1 又匹配 pattern2 的行。
3、其他操作
grep -i pattern files //不区分大小写地搜索。默认情况区分大小写 grep -l pattern files //只列出匹配的文件名 grep -L pattern files //列出不匹配的文件名 grep -w pattern files //只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’) grep -C number pattern files //匹配的上下文分别显示[number]行
4、grep查找指定文件类型
find . -name "*.conf" | xargs grep pattern grep pattern ./ -r --include='*.conf' //需在GNU grep 2.5以上版本 单个文件表示:--include={config.xml,ConsolePreferences.xml}
5、打印出grep查找匹配关键词后的前后3行
grep -A 3 -B 3 "test" file
关于grep命令的or,and,not操作的例子
在Linux的grep命令中如何使用OR,AND,NOT操作符呢?
其实,在grep命令中,有OR和NOT操作符的等价选项,但是并没有grep AND这种操作符。不过呢,可以使用patterns来模拟AND操作的。下面会举一些例子来说明在Linux的grep命令中如何使用OR,AND,NOT。
在下面的例子中,会用到这个employee.txt文件,如下:
[plain] view plain copy
-
$ cat employee.txt
-
100 Thomas Manager Sales $5,000
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
400 Nisha Manager Marketing $9,500
-
500 Randy Manager Sales $6,000
(一)Grep OR 操作符
以下四种方法均能实现grep OR的操作。个人推荐方法3.
1.使用 \|
如果不使用grep命令的任何选项,可以通过使用 '\|' 来分割多个pattern,以此实现OR的操作。
[plain] view plain copy
-
grep 'pattern1\|pattern2' filename
例子如下:
[plain] view plain copy
-
$ grep 'Tech\|Sales' employee.txt
-
100 Thomas Manager Sales $5,000
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
500 Randy Manager Sales $6,000
2.使用选项 -E
grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。
[plain] view plain copy
-
<span style="font-family:'Microsoft YaHei';font-size:16px;">grep -E 'pattern1|pattern2' filename</span>
例子如下:
[plain] view plain copy
-
$ grep -E 'Tech|Sales' employee.txt
-
100 Thomas Manager Sales $5,000
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
500 Randy Manager Sales $6,000
3.使用 egrep
egrep 命令等同于‘grep -E’。因此,使用egrep (不带任何选项)命令,以此根据分割的多个Pattern来实现OR操作.
[plain] view plain copy
-
egrep 'pattern1|pattern2' filename
例子如下:
[plain] view plain copy
-
$ egrep 'Tech|Sales' employee.txt
-
100 Thomas Manager Sales $5,000
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
500 Randy Manager Sales $6,000
4.使用选项 -e
使用grep -e 选项,只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个pattern,以此实现OR操作。
[plain] view plain copy
-
grep -e pattern1 -e pattern2 filename
例子如下:
[plain] view plain copy
-
$ grep -e Tech -e Sales employee.txt
-
100 Thomas Manager Sales $5,000
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
500 Randy Manager Sales $6,000
(二)Grep AND 操作
1.使用 -E 'pattern1.*pattern2'
grep命令本身不提供AND功能。但是,使用 -E 选项可以实现AND操作。
[plain] view plain copy
-
grep -E 'pattern1.*pattern2' filename
-
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
第一个例子如下:(其中两个pattern的顺序是指定的)
[plain] view plain copy
-
$ grep -E 'Dev.*Tech' employee.txt
-
200 Jason Developer Technology $5,500
第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)
[plain] view plain copy
-
$ grep -E 'Manager.*Sales|Sales.*Manager' employee.txt
2.使用多个grep命令
可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。
[plain] view plain copy
-
grep -E 'pattern1' filename | grep -E 'pattern2'
例子如下:
[plain] view plain copy
-
$ grep Manager employee.txt | grep Sales
-
100 Thomas Manager Sales $5,000
-
500 Randy Manager Sales $6,000
(三)Grep NOT操作
1.使用选项 grep -v
使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。
[plain] view plain copy
-
grep -v 'pattern1' filename
例子如下:
[plain] view plain copy
-
$ grep -v Sales employee.txt
-
200 Jason Developer Technology $5,500
-
300 Raj Sysadmin Technology $7,000
-
400 Nisha Manager Marketing $9,500
当然,可以将NOT操作与其他操作联合起来,以此实现更强大的功能 组合。
如,这个例子将得到:‘Manager或者Developer,但是不是Sales’的结果:
[plain] view plain copy
-
$ egrep 'Manager|Developer' employee.txt | grep -v Sales
-
200 Jason Developer Technology $5,500
-
400 Nisha Manager Marketing $9,500
正则表达式:
特殊字符
符号 | 含义 | 举例 |
^ | 开始标记 | "^abc"满足的例子abc、abcd |
^ | 非(在[]内) | "[^abc]"满足的例子:ddd、mpd |
$ | 结束标记 | ”abc$”满足的例子abc、mmabc |
. | 任意字符 | "a.c"满足的例子abc、fapcc |
\< | 匹配单词开始 | "\<abc"满足的例子abc、abcd |
\> | 匹配单词结束 | "abc\>"满足的例子abc、pmrabc |
| | 或 | "AAA|BBB"满足的例子AAA、BBBpp |
范围
符号 | 含义 | 举例 |
? | 匹配前一个字符0或1次 | "abc?"满足的例子ab、mabcd |
* | 匹配前一个字符≥0次 | "abc*"满足的例子abbb、abcdk |
+ | 匹配前一个字符≥1次 | "abc+"满足的例子abcd、abcccdd |
{} | {m}、{m,n}、{m,}、{,n}分别为匹配前一个字符m次、m到n次、≥m次、≤n次 | "abc\{3,5\}"满足的例子abcccc、abcccccc |
[] | []内如果不是范围,选其一;是范围的话,范围内选其一 | "m[abc]p"满足的例子acpd;m[1-9]p满足的例子m8pp |
() | 将候选的所有元素放在()内,用|隔开 | "a(1|2|3)bc"满足的例子a1bc、mba3bcd |
标准字符类
字符类 | 释义 |
[:alnum:] | 字母和数字,与[A-Za-z0-9]等价 |
[:word:] | [:alnum:]加上下划线_ |
[:alpa:] | 字母,与[A-Za-z]等价 |
[:digit:] | 数字,与[0-9]等价 |
[:xdigit:] | 十六进制字符,与[0-9A-Fa-f等价] |
[:blank:] | 空格和制表符 |
[:graph:] | 可见字符,靠扩33~126 |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:print:] | 可打印字符 |
[:space:] | 空白字符,等价于[\t\r\n\v\f] |
[:punct:] | 标点符号 |
[:cntrl:] | ASCII控制码,包括字符0~31以及127 |
举例:
[:alnum:]是A-Za-z0-9的另一个写法,
要把它们放到[]号内才能成为正则表达式,如[A-Za-z0-9]或[[:alnum:]]
本文转自leonardos51CTO博客,原文链接:http://blog.51cto.com/leomars/1758812 ,如需转载请自行联系原作者