grep用法解析(macos环境BSD shell)

介绍

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

主要参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#格式
grep [options]

[options]主要参数:

-c:只输出匹配行的计数。

-i:不区分大 小写(只适用于单字符)。

-I:Ignore binary files.

-h:查询多文件时不显示文件名。

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

-v:显示不包含匹配文本的所有行。

testfile

1
wget -P ~/testfile/ "http://ou0y29lb2.bkt.clouddn.com/po.zip"

##全局设置

1
2
grepc="grep --color"
cd $HOME/Documents/test_directory/pojo_test

-c : 只输出匹配行的计数

1
$grepc -c "\<condition\>" ./po/* -d skip

Alt text

-i:不区分大 小写(只适用于单字符)。

1
$grepc -i "value" ./po/* -d skip

Alt text

-h:查询多文件时不显示文件名。

1
$grepc -h -i "value" ./po/* -d skip

Alt text

-l:查询多文件时只输出包含匹配字符的文件名。

1
$grepc -l -h -i "value" ./po/* -d skip

Alt text

-n:显示匹配行及 行号

1
$grepc -n -i "value" ./po/* -d skip

Alt text

-s:不显示不存在或无匹配文本的错误信息。
Alt text
照样报错 - - 不知道有啥用…

-v:显示不包含匹配文本的所有行。

1
grep -h -E -v -i "value|string|return|Criteria|{|}|=|addCriterion|super" ./po/* -d skip | grep [:space:]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pattern正则表达式主要参数:

\: 忽略正则表达式中特殊字符的原有含义。

^:匹配正则表达式的开始行。

$: 匹配正则表达式的结束行。

\<:从匹配正则表达 式的行开始。

\>:到匹配正则表达式的行结束。

[ ]:单个字符,如[A]即A符合要求 。

[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。

. :所有的单个字符。

* :有字符,长度可以为0。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#        \: 忽略正则表达式中特殊字符的原有含义。
$grepc -n -i "\\$" ./po/* -d skip
# ^:匹配正则表达式的开始行。
$grepc -h -i "^sed" ./po/* -d skip
# $: 匹配正则表达式的结束行。
$grepc -E -h -i "class.*{$" ./po/* -d skip
# \<:从匹配正则表达 式的行开始。
$grepc -E -h -i "\<cond" ./po/* -d skip
# \>:到匹配正则表达式的行结束。
$grepc -E -h -i "tion\>" ./po/* -d skip
# \< 和 \> 分别标注单词的开始与结尾。
$grepc -E -h -i "\<condition\>" ./po/* -d skip
# [ ]:单个字符,如[A]即A符合要求 。
$grepc -E -h "[A-Z]{2,5}" ./po/* -d skip
# [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
$grepc -E -h "[A-Z]{2,5}" ./po/* -d skip
# . :所有的单个字符。
$grepc -E -h "\b.{5}\b" ./po/* -d skip
# * :有字符,长度可以为0。
$grepc -E -h "\b[[:alnum:]]{5}\b" ./po/* -d skip

grep命令使用简单实例

1
2
# 如果只有一个 txt文件 并且匹配到了 不会显示全路径, 只会显示行号和匹配行
$grepc -E -i -n "value" ./po/t* -d skip #显示所有以d开头的文件中包含 test的行。
1
2
3
$grepc -E -n "value|one" ./po/test001.txt ./po/test002.txt    #显示在test001.txt,test002.txt 文件中匹配value或者one的行。-E 表示表达式扩展
$grepc -E '\b[a-z]{5}\b' ./po/test001.txt #显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$grepc -E "'number (one)'.*\1" ./po/test001.txt #如果number (one)被匹配,则one就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个one(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义.

grep命令使用复杂实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#假设您正在'./po/*'目录下搜索带字符 串'value'的文件:
$grepc "value" ./po/*.txt
#./po/test001.txt:What is your value?
#./po/test002.txt:What is your value?

#默认情况下,'grep'只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
#grep: sound: Is a directory
#这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
#明确要求搜索子目录:
grep -r
#或忽略子目录:
grep -d skip
#如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$grepc "value" ./po/* | less
#这样,您就可以更方便地阅读
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#下面还有一些有意思的命令行参数:
files="./po/* -r"

$grepc -i obj ./po/* #:不区分大小写地搜索。默认情况区分大小写,

$grepc -l obj $files #:只列出匹配的文件名,

$grepc -L obj $files #:列出不匹配的文件名,

$grepc -w obj $files #:只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),

$grepc -C 2 obj $files #:匹配的上下文分别显示[number]行,

$grepc -E -i "address|value" $files #:显示匹配 pattern1 或 pattern2 的行,

$grepc -ie address $files | $grepc -ie value #:显示既匹配 pattern1 又匹配 pattern2 的行。

$grepc -n -ie address $files #即可显示行号信息

$grepc -c -ie address $files #即可查找总行数

可以使用国际模式匹配的类名:

1
2
3
4
5
6
7
8
9
10
11
[[:upper:]]   [A-Z]

[[:lower:]] [a-z]

[[:digit:]] [0-9]

[[:alnum:]] [0-9a-zA-Z]

[[:space:]] 空格或tab

[[:alpha:]] [a-zA-Z]