三剑客是:grep、sed、awk,简直就是我的弱点,一直没机会深入,仅仅会简单的使用,看完本剑客系列即可在文本处理上上升一个档次。掌握的三剑客知识也越来越多。

grep 是一种文本搜索工具,用于查找给定文本中符合条件的字符串所在的行,并打印出来,可以配合上节中的正则和其他多种命令,使用十分灵活。

此外还有 egrep 和 fgrep 两个命令,egrep = grep -Efgrep = 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

其他没有举例的也都是很简单的应用,尝试一下即可

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0