shell grep教程

grep (global regular expression) 命令用于查找文件里符合条件的字符串或正则表达式。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

1. 语法

grep [options] pattern [files]
或
grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
  • pattern - 表示要查找的字符串或正则表达式。
  • files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。

2. 选项:

-a 或 --text :

不要忽略二进制的数据。

-A<显示行数> 或
--after-context=<显示行数>

除了显示符合范本样式的那一列之外,并显示该行之后几行的内容。

]# echo -e "A\nB\nC\nD\nE"|grep -A1 C

C

D

-b 或

--byte-offset :

在显示符合样式的那一行之前,标示出该行第一个字符的编号

]# echo -e "123\n456\n789"|grep -b 5

4:456

-B<显示行数> 或

--before-context=<显示行数>

除了显示符合样式的那一行之外,并显示该行之前的内容。

]# echo -e "A\nB\nC\nD\nE"|grep -B1 C

B

C

-c 或

--count :

计算共有多少个匹配结果

]# echo -e "A\nBB\nCB\nDCB\nE"|grep -c B

3

-C<显示行数> 或

--context=<显示行数>或

-<显示行数> :

除了显示符合样式的那一行之外,并显示该行之前后的内容。

echo -e "A\nB\nC\nD\nE\nF\nG"|grep -C2 C

A

B

C

D

E

-d <动作> 或
--directories=<动作>

当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。

-d recurse 递归到文件夹里的文件查询
-d skip 跳过文件夹
-d read 默认操作,报错

]# grep -d recurse bin *

1/1.sh:/bin/bash

2.sh:/bin/bash

]# grep -d skip bin *

2.sh:/bin/bash

]# grep -d read bin *

grep: 1: Is a directory

2.sh:/bin/bash

-e<范本样式> 或

--regexp=<范本样式>

支持正则表达式匹配,支持多个-e

echo -e "123\nabc\nABC"|grep -e '1' -e 'a'

123

abc

-E 或

--extended-regexp

支持用扩展正则来进行匹配
egrep’即‘grep -E

echo -e "123\nabc\nABC"|grep -E '[a-z]'

abc

-f<规则文件> 或

--file=<规则文件>

指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。

cat patfile

aaa

bbb

]# echo aaa bbb ccc ddd eee | grep -f patfile -o

aaa

bbb

-F 或

--fixed-regexp

不支持正则表达式,将模式按照字面意思匹配 和fgrep效果一样

]# echo -e "bbbcd\naa" | grep -F "aa"

aa

]# echo -e "bbaabcd\naa" | grep -F "[a-z]"

无结果

-G 或

--basic-regexp :

基本正则

]# echo -e "bbaabcd\naa" | grep -G "[a-z]"

bbaabcd

aa

-h 或

--no-filename :

在显示符合样式的那一行之前,不标示该行所属的文件名称。

]# grep -r bin *

1/1.sh:/bin/bash

2.sh:/bin/bash

]# grep -r bin * -h

/bin/bash

/bin/bash

-H 或

--with-filename :

在显示符合样式的那一行之前,表示该行所属的文件名称。

]# grep bin *.sh

/bin/bash

]# grep bin *.sh -H

2.sh:/bin/bash

-i 或

-ignore-case

忽略字符大小写的差别。

]# echo -e "abc\nABC"|grep 'a' -i

abc

ABC

-l 或

--file-with-matches :

只打印匹配的文件名。

]# grep "/bin" *.sh -l

2.sh

-L 或

--files-without-match

列出文件内容不符合指定的样式的文件名称

]# grep bins *.sh -L

2.sh

-n 或

--line-number

在显示符合样式的那一行之前,标示行号。

]# grep sh *.sh -n

1:/bin/bash

2:bash

3:sh

-o 或

--only-matching

只显示匹配PATTERN 部分。

可用于统计某个字符或字符串在文件中出现的次数

grep -o "bash" /etc/passwd|wc -l

8

#grep -o '.' /etc/passwd|sort|uniq -c|sort -nr
统计每个字符出现的次数

#grep -o '[^,. ]*' patfile|sort|uniq -c|sort -nr
统计每个单词出现的次数

-q 或

--quiet或

--silent

不显示任何信息,可以通过判断返回值来确定是否有匹配到结果

]# grep called patfile -q

]# echo $?

0

-r 或

--recursive :

递归查找子目录中的文件。
此参数的效果和指定"-d recurse"参数相同

]# grep -r bin *

1/1.sh:/bin/bash

2.sh:/bin/bash

-s 或

--no-messages

不显示错误信息。

]# grep bin *

grep: 1: Is a directory

2.sh:/bin/bash

]# grep bin * -s

2.sh:/bin/bash

-v 或

--invert-match

反向查找,只打印不匹配的行

]# echo -e "1234\n345\n567"|grep -v 345

1234

567

-V 或

--version

显示版本信息。

]# grep -V

grep (GNU grep) 2.20

-w 或

--word-regexp

只显示全字符合的列。

]# echo -e "1234\n234\n567"|grep -w 234

234

-x 或

--line-regexp :

只显示全列符合的列。

]# echo -e "1234\n234 33\n567"|grep -x 234

无结果

]# echo -e "1234\n234 33\n567"|grep -x "234 33"

234 33

-y

忽略大小写,同-i

]# echo -e 'Ab\nab'|grep -y a

Ab

ab

3. 实例

1、在文件 file.txt 中查找字符串 "hello",并打印匹配的行:

grep hello file.txt

2、在文件夹 dir 中递归查找所有文件中匹配正则表达式 "pattern" 的行,并打印匹配行所在的文件名和行号:

grep -r -n pattern dir/

3、在标准输入中查找字符串 "world",并只打印匹配的行数:

echo "hello world" | grep -c world

4、在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行。此时,可以使用如下命令:

grep test *file

5、以递归的方式查找符合条件的文件。例如,查找指定目录/etc/acpi 及其子目录(如果存在子目录的话)下所有文件中包含字符串"update"的文件,并打印出该字符串所在行的内容,使用的命令为:

grep -r update /etc/acpi

6、反向查找。前面各个例子是查找并打印出符合条件的行,通过"-v"参数可以打印出不符合条件行的内容。

查找文件名中包含 test 的文件中不包含test 的行,此时,使用的命令为:

grep -v test *test*

7.统计test.txt文件中出现的字符以及字符串出现的次数,并排序

#grep -o '.' test.txt|sort|uniq -c|sort -nr
统计每个字符出现的次数

#grep -o '[^,. ]*' test.txt|sort|uniq -c|sort -nr
统计每个单词出现的次数

  • 30
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值