0


【Linux】grep超级大详解,(拓展)正则表达式

一、grep简介

【grep】:*Global Regular Expression Print
*根据给定的正则表达式搜索文本,是Linux系统中最重要和最有用的命令之一。
A “regular expression” is a text string that describes a particular search pattern.

【反思】:grep搜索的内容要理解为“字符串”,而不是“单词/关键字/...”
grep 对于字符串的定义很宽泛,空格、Tab、标点符号等都可以作为字符串的划分。
grep -e 和 -E 的区别主要在于符号在默认情况下是字符串还是特殊含义,参看 5.1。

              注:反思内容的来源在后文红色字体对应的部分。

二、基本用法

2.1 在一个文件中搜索

在文件中搜索与字符串相匹配的内容,命令返回文件中包含此字符串的每一行内容。

$ grep "你所要搜索的字符串" 你所要搜索的文件名

例如:在文件 "test.txt" 中搜索包含连续字符串 aaa 的每一行。

$ grep "aaa" test.txt

2.2 同时在多个文件中搜索

直接输入多个文件名,命令返回时会自动显示字符串所在的文件名。

$ cat test1
a
aa
aaa
b
bb

$ cat test2
a
b
aa
bb

$ grep "a" test1 test2
test1:a
test1:aa
test1:aaa
test2:a
test2:aa

三、选项详解

3.1 忽略大小写 -i

i 指的是 ignore

命令返回包含 "aa" "aA" "Aa" "AA" 的每一行。

$ grep -i "aa" test.txt

3.2 反选 -v

v 指的是 invert-match

命令返回不包含 "aaa" 的每一行。

$ grep -v "aaa" test.txt

3.3 显示行号 -n

n 指的是 line-number

命令返回包含 "aaa" 的每一行,以及在文件中相对应的行号。

$ grep -n "aaa" test.txt

# output:
2:sdcnu, jfsdfaaa, aaasfjw
5:sdfowaaacjisdfaa
13:aaabbbccc
20:aaaaaaaaaaaaa

3.4 只搜索完全符合字符串要求的内容 -w

w 指的是 whole-word

首先用 cat 命令打开 test.txt 文件,看到文件中的内容,再用 grep -w 命令,返回的只有完全符合要求的行内容。

因此单纯的包含是不行的,例如aaaaaaaa不会返回。

grep 对于字符串的定义很宽泛,空格、Tab、标点符号等都可以作为字符串的划分。

「字母的例子」
$ cat test.txt 
aaa bbb ccc
aaaaaaa
aaabbb
aaa:bbb
aaa,bbb
aaa    bbb
aaa|bbb
aaa'bbb
aaaa bbbb

$ grep -w "aaa" test.txt 
aaa bbb ccc
aaa:bbb
aaa,bbb
aaa    bbb
aaa|bbb
aaa'bbb
「数字的例子」
$ cat test.txt 
aa123bb
aa 123 bb
aa 1 2 3 bb
1 2 3
1,2,3,aa

$ grep -w "123" test.txt 
aa 123 bb
「含有分隔符的例子」
$ grep "aa 1" test.txt
aa 123 bb
aa 1 2 3 bb

$ grep -w "aa 1" test.txt
aa 1 2 3 bb

综上,grep搜索的内容要理解为“字符串”,而不是“单词/关键字/...”

3.4 计算总行数 -c

c 指的是 -count

输出说明该文件中有 2 行包含字符串内容。

$ grep -c "aaa" test.txt

# output:

2

四、正则表达式

4.1 以**开头 ^

搜索以字符串 aa 开头的行。^要放在字符串前

$ grep "^aa" test.txt

4.2 以**结尾 $

搜索以字符串 aa 结尾的行。$要放在字符串后

$ grep "aa$" test.txt

4.3 存在任意字符 ./../.../....

搜索的字符串中存在任意位(可用任意字符代替),有几个位子就用几个.

搜索包含字符串 a..a 的行,可用两个任意字符代替..

命令返回(例如:a12a a*Ba a.1a 等等)

$ grep "a..a" test.txt

4.4 存在/不存在规定范围内的任意一个字符 [ ]

搜索字符串,包含 [ ] 外的字符,和 [ ] 内的任意字符。命令返回包含字符串 aa ab ac 的行。

$ grep "a[abc]" test.txt

搜索字符串,包含 [ ] 外的字符,和除了 [ ] 内的任意字符。命令不会返回字符串 aa ab ac 的行。
相当于不包含aa ab ac 的 a.

$ grep "a[^abc]" test.txt

用 [ ] 表示一个范围。命令返回以大写字母 A 到 H 开头的所有行。

$ grep "^[A-H]" test.txt

4.5 存在重复内容 *

非常实用的命令,特别是不规定字符串长度的情况下。
搜索括号内由小写字母和空格组成的字符串,不规定括号内的字符数量。

$ grep "([a-z ]*)" test.txt

4.6 字符串中存在4.1-4.5中的特殊符 \

在以上的特殊符号 ^ $ . * 的前面加上反斜杠 \ 表明该符号仅用作字符串

搜索以大写字母 C-I 开头,并且以 . 结尾的字符串,字符串长度不限,除去开头结尾意外的内容不限。

$ grep "^[C-I].*\.$" test.txt

五、拓展正则表达式 grep -E

5.1 grep -e 和 grep -E 的区别

有一些符号,除了作为字符串的一部分以为,有特殊的含义。这类符号可以进一步分为两类。

*第一类:^ $ . [ ] * *
在 grep 命令中,默认为特殊含义,若要作为字符串的一部分,则需要在前面加上反斜杠 \ 。

第二类:( ) | ? + { }
在grep命令中,默认为字符串,若要使用其特殊含义,则用 grep -E 。

5.2 存在规定范围内的任意一组字符 ( ) |

与 [ ] 作比较, [ ] 中只能是一个字符,依靠 ( ) 和|可以扩大范围。

( ):小括号里的内容作为一个独立的单元。

$ cat test
AaaaA
AbbbA
AabaA

$ grep -E "A(aaa|bbb)A" test
AaaaA
AbbbA

5.2 可有可无 ?+

与 * 的区别
* :0次~很多次
? : 0次 或者 1次
+ :1次~很多次

$ grep -E "copy(right)?" test   # copy 后面有/没有 right
$ cat test
()
( )

$ grep "([^[:space:]]*)" test    # 没有空格,或者至少有一个
()
( )

$ grep -E "\([^[:space:]]+\)" test # 至少有一个空格
( )

5.3 确定数量 { }

定一个确切的字符串长度。搜索在 ABCDEFG 范围内任三个字符组成的字符串。

$ grep -E "[ABCDEFG]{3}" test

定一个范围。搜索长度为15~20范围内的英文单词(不区分大小写)。

$ grep -E "[[:alpha:]]{15,20}" test
标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/m0_62079974/article/details/142552844
版权归原作者 兔子太岁 所有, 如有侵权,请联系我们删除。

“【Linux】grep超级大详解,(拓展)正则表达式”的评论:

还没有评论