linux文本分析利器grep命令的详解及更多用法(fgrep和egrep同样适用)

一、linux文本分析利器grep命令的详解及更多用法(fgrep和egrep同样适用)

        grep,awk,sed是linux下文本分析的三大利器。

1. 关于本站中已有的一些相关文章:

A. 比如awk的作用有如下文章:

https://linge.blog.csdn.net/article/details/137216394

​​​​​​https://linge.blog.csdn.net/article/details/140764746

https://linge.blog.csdn.net/article/details/137216426

B. sed使用相关的已有文章如下:

https://linge.blog.csdn.net/article/details/140706096

https://linge.blog.csdn.net/article/details/140080871

2. 关于grep命令使用的详解

    今天来一篇grep的详解,grep:global search regular expression(RE) and print out the line,即:全面搜索正则表达式并把行打印出来,grep是linux中非常常用的命令,也是一个非常简单的命令,但是高水平的人就是将简单的命令用得让你觉得不简单。

 A. grep常用选项:

-n #增加显示行号
-c #计算查找到的行数
-o #只输出文件中匹配到的部分。
-v #反转查找,即查找不包含指定字符串的数据
-R/-r #目录递归查找 和-d recurse 选项等价。
-E #使用能使用扩展正则表达式。
-i #不区分大小写差别
-A #当匹配本行后显示本行后面几行,-B 显示前两几行,-C 前后各几行。

#不常用选项
-h #在显示符合范本样式的那一列之前,不标示该列所属的文件名称。 
-H #在显示符合范本样式的那一列之前,标示该列的文件名称。 
-l #同时查找多个文件,显示哪些文件中找到了内容 
-L #与-l相反,显示没有查找到内容的文件
-e #要查找多个内容,就相当于 或
-q #静默输出,不显示任何信息,可捕获命令运行结果来作条件测试。

 

B. grep应用示例

然后我们对以上不常用的选项的使用进行一下应用示例:

[root@123 ~]# cat a.txt 
1=春天
2=春天
3=秋天
4helloworld
5=冬天
6yes it is me
7= 夏天
8=秋天1222
9test
10=秋天2
[root@123 ~]# cat b.txt 
this is from b.txt
ewqre

rewqre
[root@123 ~]# grep -l 'ewqre' a.txt b.txt       #在b.txt中找到了,所以显示b.txt
b.txt
[root@123 ~]# grep -L 'ewqre' a.txt b.txt   #在a.txt中没有找到,所有显示a.txt
a.txt
[root@123 ~]# grep -e 1 -e 2 a.txt 
1=春天
2=春天
8=秋天1222
10=秋天2
[root@123 ~]# grep -c -e 1 -e 2 a.txt   #之前我还以为grep不能查找或者,原来也是可以的。
4

     在之前的一篇文章里,我还以为grep不能以多条件查找,比如或者包含A,或者包含B,实际也是可以的。另外grep还可以使用-f来指定匹配的内容所在的文件 grep -f patfile -o

C. grep另外还有一些有用的选项

--include #指定文件后缀
--color #添加颜色
-f #指定文件 
-F #将范本样式视为固定字符串的列表。
[root@123 ~]# grep "222" . -r --include *.{txt,sh} #指定只在当前目录下的.txt/.sh文件中查找内容
./a.txt:8=秋天1222
[root@123 lua]# grep -r "pack"  .  --exclude "cc"  #排除cc文件搜索pack    
./lib/dump.lua:module(..., package.seeall)
./a.lua:package.path = "/usr/share/lua/5.1/?.lua;;"
./a.lua:package.cpath= '/usr/share/lua/5.1/?.so;' 
[root@123 lua]# grep -r "pack"  .  --exclude "a.lua"    #排除a.lua文件搜索  
./lib/dump.lua:module(..., package.seeall)
#搜索排除时还可以指定要排除的文件列表文件exclude-filelist-path
#grep "pack" . -r --exclude-from exclude-filelist-path
[root@123 lua]#  grep -H -r "pack"  .  --exclude "cc"   #-H选项,是默认的,即显示匹配到的文件名称
./lib/dump.lua:module(..., package.seeall)
./a.lua:package.path = "/usr/share/lua/5.1/?.lua;;"
./a.lua:package.cpath= '/usr/share/lua/5.1/?.so;' 
[root@123 lua]#  grep -h -r "pack"  .  --exclude "cc"   #-h不显示匹配文件狗
module(..., package.seeall)
package.path = "/usr/share/lua/5.1/?.lua;;"
package.cpath= '/usr/share/lua/5.1/?.so;'

D. grep其它不常用的选项,知道就行吧。

-a 不要忽略二进制数据。 
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。 
-G 将范本样式视为普通的表示法来使用。 
-d recurse参数相同。 
-s 不显示错误信息。 
-w 只显示全字符合的列。 
-x 只显示全列符合的列。 
-y 此参数效果跟-i相同。 

E.【关于grep的匹配查找】

        三个元字符:.表示任意单个字符。字符个数:* 表示匹配前面的字符任意次,
\?匹配前面的字符1次或0次。 \{m,n\}匹配前面的字符至少m次,至多n次。\反斜线是防止}被shell当命令行展开解释。
        如果模式中没有\?及空格,模式可以不加引号,但模式中有\?或空格,则模式必须加引号。

[root@123 ~]# cat z.log                     #显示文件内容
{0C1DAD29-813B-4E7F-3563-92FB8F169C2B}
{3C5750FE-8B8D-E9DF-E401-93F9A91EE1A2}
{7C511D70-49D8-F360-5332-21593D609039}
{24F0CEDB-B086-3EBE-92A3-8AE66A1285BC}
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{B29BDD59-154F-18C9-F776-130096CF3284}
{11E8BDB4-CCAE-6BE8-E297-6242CE7B20CF}
{1D7BE800-BB32-B64C-6028-67978882F413}
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}
{6870E758-8CA4-A184-FEF6-D0E89F486E82}
[root@123 ~]# grep 3..3 z.log               #.号匹配
{0C1DAD29-813B-4E7F-3563-92FB8F169C2B}
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}
[root@123 ~]# grep 3*3 z.log                #*号匹配,结果有删减 
{0C1DAD29-813B-4E7F-3563-92FB8F169C2B}
{24F0CEDB-B086-3EBE-92A3-8AE66A1285BC}
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}
[root@123 ~]# grep "39\?" z.log             # 可以有9,也可以没有              
{0C1DAD29-813B-4E7F-3563-92FB8F169C2B}
{3C5750FE-8B8D-E9DF-E401-93F9A91EE1A2}
{7C511D70-49D8-F360-5332-21593D609039}
{24F0CEDB-B086-3EBE-92A3-8AE66A1285BC}
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{B29BDD59-154F-18C9-F776-130096CF3284}
{1D7BE800-BB32-B64C-6028-67978882F413}
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}
[root@123 ~]# grep "39\{1,\}" z.log         #必须要包含一个9  
{7C511D70-49D8-F360-5332-21593D609039}

 F.【grep位置锚定】

位置锚定:^行首  $行尾 ^$匹配空白行
\< 其后面的任意字符必须作为单词首部出现  注意是单词首部
\> 其前面的任意字符必须作为单词的尾部出现
也可以使用\b  grep '\broot' a.txt 即和上面的行首一样。
分组:\(\)     \(ab\)* 星号修饰的是ab这个整体。

[root@123 ~]# grep "^{2" z.log          #要求开头
{24F0CEDB-B086-3EBE-92A3-8AE66A1285BC}
[root@123 ~]# grep "4}$" z.log          #要求结尾
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{B29BDD59-154F-18C9-F776-130096CF3284}
[root@123 ~]# grep "^{B.*4}$" z.log     #两边都要求
{B29BDD59-154F-18C9-F776-130096CF3284}
[root@123 ~]# grep "\(11\)" z.log       #要求11整体出现
{7C511D70-49D8-F360-5332-21593D609039}
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{11E8BDB4-CCAE-6BE8-E297-6242CE7B20CF}
[root@123 ~]# grep "\<6" z.log          #要求单词首部出现    
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{11E8BDB4-CCAE-6BE8-E297-6242CE7B20CF}
{1D7BE800-BB32-B64C-6028-67978882F413}
{6870E758-8CA4-A184-FEF6-D0E89F486E82}

G. 【后向引用】:

被前面匹配的后面引用。
如下前面8和4之间的和后面的要一样。\1调用前面第一个小括号出现的内容。同样后面还可以使用\2..\3

[root@123 ~]# grep '\(8..4\).*\1' z.log     #前后匹配同样一个字符串
{6870E758-8CA4-A184-FEF6-D0E8CA486E82}
[root@123 ~]# grep '\([0-9]\{2\}\).*\1' z.log  #前面出现的2个数字后面也要求出现
{7C511D70-49D8-F360-5332-21593D609039}

H.【grep正则表达式】

分为:Basic REGEXP和Extended REGEXP,基本和扩展正则表达式。
grep -E 支持扩展的正则表达式:默认工作在贪婪模式下。等同于命令:egrep
两者的区别:
作字符匹配的. [] [^]都一样,
作次数匹配的* ? + 注?不用加\,+表示匹配至少一次。{m,n}不用反斜线。
位置锚定一样,分组不用反斜线。另外支持或者 |    例如:

grep -E '([A-D]{3}).*\1' dm.log 要求前后出现三个同样的大写字母,示例如下: 
[root@123 ~]# grep -E '([a-zA-Z]{2}).*\1' z.log     
{CB1FE623-6EE7-61A1-EC32-B11B17BFED54}
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}
{6870E758-8CA4-A184-FEF6-D0E8CA486E82}
[root@123 ~]# grep -E '^\{[A-Z]+[0-9]{3}...[a-z]*' z.log    #要求以{加1个或多个大写字母开头,后面跟着三数字
{F478B0B5-FD3C-30CD-2C43-D619E271D9FD}

G. 关于 fgrep 和 egrep 两个命令,

fgrep:fast grep,快速匹配。不支持正则表达式。适应于搜索不带正则的搜索。
egrep:grep -E 支持扩展正则表达式。

其选项和grep都差不多。
'egrep' means 'grep -E'.  'fgrep' means 'grep -F'.
Direct invocation as either 'egrep' or 'fgrep' is deprecated.
When FILE is -, read standard input.  With no FILE, read . if a command-line
-r is given, - otherwise.  If fewer than two FILEs are given, assume -h.
Exit status is 0 if any line is selected, 1 otherwise;
if any error occurs and -q is not given, the exit status is 2.

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值