三剑客是:grep、sed、awk,简直就是我的弱点,一直没机会深入,仅仅会简单的使用,看完本剑客系列即可在文本处理上上升一个档次。掌握的三剑客知识也越来越多。
grep 是一种文本搜索工具,用于查找给定文本中符合条件的字符串所在的行,并打印出来,可以配合上节中的正则和其他多种命令,使用十分灵活。
此外还有 egrep 和 fgrep 两个命令,egrep = grep -E
,fgrep = grep -F
命令格式
grep [选项] 想要查找的字符串 给定查找的文本
如:grep a b
# 在b文件中,查找a所在的行
支持的正则
支持正则的选项 | 描述 |
---|---|
-E,–extended-regexp | 使用扩展正则匹配 |
-P,–perl-regexp | 使用 Perl 语言的正则匹配 |
-F,–fixed-strings | 将特殊字符转变为普通字符,可以省去转义符 |
三者之间不能同时使用
grep "\*\." = grep -F "*."
模式匹配
模式匹配的选项 | 描述 |
---|---|
-e,–regexp= | 使用模式匹配,可以指定多个模式匹配,每个模式之间是逻辑与的关系,与任意一个模式匹配就会输出 |
-f,–file= | 从文件每一行获取匹配模式 |
-i,–ignore-case | 忽略大小写 |
-w,–word-regexp | 模式匹配整个单词 |
-x,–line-regexp | 模式匹配整行 |
-v,–invert-match | 打印不匹配的行 |
示例
# 单个模式与多个模式匹配对比,多模式匹配相当于 grep -E 'abc|def'
$ echo -e "abc \ndef" | grep abc
abc
$ echo -e "abc \ndef" | grep -e abc -e def
abc
def
# 从文件每一行获取匹配模式,文件中写入想要匹配的关键词
$ cat > test.txt << EOF
a
d
EOF
$ echo -e "abc \ndef" | grep -f test.txt
abc
def
# 忽略大小写
$ echo -e "abc \ndef" | grep A
$ echo -e "abc \ndef" | grep -i A
abc
# 匹配整个单词,用空白字符来判断是否为一个单词,当你匹配的字符前后都是空白字符才会被匹配
$ echo -e "abc def\ndef" | grep -w a
$ echo -e "abc def\ndef" | grep -w abc
abc def
# 只匹配一整行,当你匹配的内容占据了一整行,才会被匹配到
$ echo -e "abc def\nghi" | grep -x "abc def"
abc def
$ echo -e "abc def" | grep -x "abc"
# 只匹配指定内容之外的行
# 比如很多文件有注释,可以把注释行过滤掉,将不会显示以#开头和以“空白字符+#”开头的行
grep -Ev "^([[:blank:]]+#|#)" file_name
控制输出
输出控制的选项 | 描述 |
---|---|
-m,–max-count | 输出匹配的结果数量 |
-n,–line-number | 输出匹配字符所在行的行号 |
-H,–with-filename | 输出每个匹配的文件名 |
-h,–no-filename | 不输出文件名 |
-o,–only-matching | 只输出匹配的内容,并不显示整行 |
-q,–quiet | 不输出正常信息,正常应该返回匹配的内容,使用-q不返回任何内容 |
-s,–no-messages | 不输出错误信息 |
-r,–recursive | 递归目录进行匹配文件内容,当过滤的目标中存在目录,则必须加-r参数 |
-c,–count | 输出每个文件匹配的行数(视情况可以代替wc命令) |
–include= | 值为需要过滤的文件路径 |
–exclude= | 值为不需要过滤的文件路径(如过滤整个目录中的文件时,有一个不需要进行过滤) |
–exclude-from= | 值为不需要过滤的文件路径的集合(如有多个文件不需要过滤时,可将文件路径写入一个文件中) |
–exclude-dir= | 值为不需要过滤的目录(如过滤的目录中还有其他目录,不需要过滤的可以作为该参数的值) |
# 输出1-20之间的两位数,只显示最先匹配到的5个
$ seq 1 20 | grep -E "[0-9]{2}" -m5
10
11
12
13
14
# 找出文件中匹配的行,并输出行号
$ cat > test.txt << EOF
FeiYi's Blog
Mupei's Blog
FY
EOF
$ grep -n -E "g$" test.txt
1:FeiYi's Blog
2:Mupei's Blog
# 找出目录下所有文件中匹配的行,并显示在哪个文件中的哪行
$ grep -Hn -E "g$" ./*
./test.txt:1:FeiYi's Blog
./test.txt:2:Mupei's Blog
# 只输出匹配内容,并不显示整行
$ grep -on -E "FeiYi" ./*
1:FeiYi
# 不输出错误信息
$ grep 'FSDF' asdf
grep: asdf: No such file or directory
$ grep -s 'FSDF' asdf
$ echo $?
2
其他没有举例的也都是很简单的应用,尝试一下即可