grep用于在特定的文本中查找包含有特定模式字符串的行,并且输出到终端中。而grep为我们提供了丰富的参数,满足不同的条件。在介绍下面的参数的时候,会采用实际的例子,为了能运行下面的例子,你需要做如下操作:
- 新建文件test
- 将以下文本写入到test中
11111111
11112222
22222222
"112233"
常用的参数
-E, –extended-regexp
使用扩展的正则表达式作为匹配条件
grep -E "[1]+" test # 查找含有一到多个连续1的行
输出
11111111
11112222
"112233"
-F, –fixed-strings
使用特定的字符串作为匹配条件
grep -F "11111" test # 查找带有11111的行
输出
11111111
-G, –basic-regexp
使用基础的正则表达式作为匹配条件
grep -G "[1]+" test # 查找含有一个到多个连续1的行
上面的例子在ubuntu16.04上面没有任何输出,如果替换成
grep -G "[1]*" test
则会有如下输出,
11111111
11112222
22222222
"112233"
可见在某些系统上-G的功能要弱于-E。
-P, –perl-regexp
使用perl正则表达式作为匹配条件, 这个参数属于实验性质的,不建议使用。
grep -P "[1]+" test # 查找含有一个到多个连续1的行
输出
11111111
11112222
"112233"
-e
-e pattern 指定pattern为匹配条件,可以使用多个-e表示或者的关系。
grep -e "11" -e "22" test # 查找含有11或者22的行
输出
11111111
11112222
22222222
"112233"
-f
从文件中读取匹配条件,文件中的每一行都是匹配条件,为或的关系,相当于使用多个-e参数。
新建文件file, 在文件中写入如下数据
11
22
运行
grep -f file test
输出
11111111
11112222
22222222
"112233"
这与参数-e的列子达到了相同的效果,与-e相同的是-f也可以指定多个文件。
-i, –ignore-case
忽略大小写
在test文件中新增行aaaaaaaa
,
grep "AAAA" test
和
grep -i "AAAA" test
会得到不同的结果,后者会将最后一行输出。
-v, –invert-match
选出不满足匹配条件的行
grep -v "1111" test # 选出不包含1111的行
输出
22222222
"112233"
aaaaaaaa
-w, –word-regexp
将匹配条件作为一个单词,所匹配的行必须恰好包含该单词而不是仅仅包含该子串,
在test文件中新增行 words hhh
,
grep -w "word" test
将不会输出任何数据,如果想匹配出words hhh
需要将匹配条件修改为
grep -w "words" test
-x, –line-regexp
将匹配条件当做一行,所匹配的行必须恰好与匹配条件相同
grep -x "words" test
将不会有任何输出,如果相匹配出words hhh
需要将匹配条件修改为
grep -x "words hhh" test
-c, –count
打印出匹配的行数,如果带有-v参数,则表示不匹配的行数
grep -c "11" test
输出 3
–color
–color[=when],用于高亮显示。 when可以是never, always, auto
-L, –files-without-match
打印出不满足匹配条件的文件
新建文件test1, 写入如下数据 22222222
grep -L "1111" test test1
输出 test1
-l, –files-with-matches
打印出满足匹配条件的文件
grep -l "1111" test test1
输出 test
-m, –max-count
最多匹配的个数,一旦匹配的数量达到上限,则停止遍历
grep -m 1 "1111" test
只会打印出 11111111
-o, –only-matching
只打印出匹配的文本,而不输出整行
grep -o "1111" test
输出
1111
1111
1111
-q, -quiet, –slient
不打印任何信息到标准输出
-s
对于文件不存在或者不可读这种异常进行忽略操作
grep -s "1111" test333
不会打印出
grep: test333: No such file or directory
的错误
-b, –byte-offset
打印出匹配的行在文件中的字节偏移,如果使用了-o参数,则打印出在匹配出的子串在文件中的字节偏移
grep -b "2222" test
输出
9:11112222
18:22222222
上面条件匹配出的行11112222在文件中的字节偏移为9
grep -o -b "2222" test
输出
13:2222
18:2222
22:2222
上面条件匹配出的第一个子串2222在文件中的字节偏移为13
-H, –with-filename
打印出文件名
grep -H "2222" test test1
输出
test:11112222
test:22222222
test1:2222222
-h, –no-filename
不打印文件名
–label
给输出一个名字,这个名字有点类似-H输出的文件名
echo "2222" | grep --label=foo -H "2222"
输出
foo:2222
-n, –line-number
打印出匹配的行号
grep -n "1111" test
输出
1:11111111
2:11112222
-T, –initial-tab
对输出做格式化,使得标准的匹配在同一列开始打印,这个参数对于-H, -n和-b非常有用
grep -T "2222" test test1
输出
test :11112222
test :22222222
test1 :2222222
匹配出的文本从同一列开始打印,而前面的文本则通过空格进行补全。
-u, –unix-byte-offsets
功能与-b类似,不过针对的是unix-style的文件
-A NUM, –after-context=NUM
根据NUM打印出匹配行之后的NUM行
grep -A 1 "2222" test
输出
11112222
22222222
"112233"
最后一行实际不满足条件,但是因为加了-A 1参数,所以也在输出之中。
-B NUM, –before-context=NUM
跟-A相反,打印出匹配行之前的NUM行
-C NUM, -NUM, –context=NUM
-A和-B的合体。匹配行的前后NUM行都会被打印
grep -3 "1111" test # 等价于 grep -A 3 -B 3 "1111" test
输出
11111111
11112222
22222222
"112233"
aaaaaaaa
-a, –text
将一个二进制文件当做文本文件进行处理
–binary-files=TYPE
如果文件的前几个字节表明文件是二进制文件,则采用TYPE对文件进行处理
- 如果TYPE是binary则当做binary处理
- 如果TYPE是without-match,则grep假设这个文件不满足匹配
- 如果TYPE是text,则会当做是文本处理
-D ACTION, –devices=ACTION
如果输入的文件是一个设备,FIFO或者socket,则使用指定的ACTION处理。
- 如果ACTION是read则把输出的文件当做是传统的文件进行读取
- 如果ACTION是skip,则跳过
-d ACTION, –directories=ACTION
如果输出的文件是一个文件夹,则使用指定的ACTION进行处理。
- 如果ACTION是read则把文件夹当做传统的文件进行读取
- 如果ACTION是skip,则跳过该文件夹
- 如果ACTION是recurse,则递归读取文件处理
–exclude=GLOB
跳过对GLOB执行的文件的扫描
grep --exclude test1 2222 ./*
输出
./test:11112222
./test:22222222
–exclude-from=FILE
通过文件FILE指定需要跳过的文件
新建文件skip,将test1
写入到skip中,
grep --exclude-from=skip 2222 ./*
输出
./test:11112222
./test:22222222
–exclude-dir=DIR
忽略文件夹
-I
认为二进制文件不包含匹配的,等同于–binary-files=without-match
–include=GLOB
针对GLOB指定的文件进行扫描
-r, –recursive
递归扫描
-R, –dereference-recursive
递归扫描,范围比-r更广