grep入门(大数据)

原文链接:https://blog.csdn.net/Learn_ZhangK/article/details/80284903

本文在转载的基础上,加上自己的笔记,整理而成。

grep常用的命令

grep hello  demo.txt  #在demo.txt文件中,查找hello字符串
grep hello -r .    # 在文件夹中查找,下同,但是略有不同
grep hello -R .   # grep -R hello .    但是千万不能写成 grep -R . hello
grep -2 hello    # 查找前后2行。  如:seq 1 10 |grep -2 5
seq 1 10 |grep -A2 -B3 5   # A前n行  B后n行
seq 1 10|sed 's/^/HELLO/' |grep -iA2 -B3 hello5  # -i 忽略大小写,但是注意,因为其没有参数,可以跟其他命令合并,这是getopts命令行的特性


# 查找指定文件


grep -R --include=*.c main dir   # 查找指定几个目录下的c文件
grep -rn --include='*.c' --include='*.h' re .   # 查找指定文件格式,可以使用 {}符号

1.简介

1.1国际惯例

按照国际惯例先来理论的介绍。

grep则是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来。类似的上一篇中,cut是将一行信息当中,取出某部分我们想要的。它能使用正则表达式搜索文本,并把匹配的行打印出来。

2.常用选项

2.1 grep的格式

grep [-acinv] [--color=auto] '搜寻字符串' filename

grep -R '搜寻字符串' path   # 某个目录下查找

常用的选项与参数:

-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 '搜寻字符串' 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
--color=auto :可以将找到的关键词部分加上颜色的显示喔!

更多详细见下:


-a   --text   #不要忽略二进制的数据。   
-A<显示行数>   --after-context=<显示行数>   #除了显示符合范本样式的那一列之外,并显示该行之后的内容。   
-b   --byte-offset   #在显示符合样式的那一行之前,标示出该行第一个字符的编号。   
-B<显示行数>   --before-context=<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前的内容。   
-c    --count   #计算符合样式的列数。   
-C<显示行数>    --context=<显示行数>或-<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前后的内容。   
-d <动作>      --directories=<动作>   #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。   
-e<范本样式>  --regexp=<范本样式>   #指定字符串做为查找文件内容的样式。   
-E      --extended-regexp   #将样式为延伸的普通表示法来使用。   
-f<规则文件>  --file=<规则文件>   #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。   
-F   --fixed-regexp   #将样式视为固定字符串的列表。   
-G   --basic-regexp   #将样式视为普通的表示法来使用。   
-h   --no-filename   #在显示符合样式的那一行之前,不标示该行所属的文件名称。   
-H   --with-filename   #在显示符合样式的那一行之前,表示该行所属的文件名称。   
-i    --ignore-case   #忽略字符大小写的差别。   
-l    --file-with-matches   #列出文件内容符合指定的样式的文件名称。   
-L   --files-without-match   #列出文件内容不符合指定的样式的文件名称。   
-n   --line-number   #在显示符合样式的那一行之前,标示出该行的列数编号。   
-q   --quiet或--silent   #不显示任何信息。   
-r   --recursive   #此参数的效果和指定“-d recurse”参数相同。   
-s   --no-messages   #不显示错误信息。   
-v   --revert-match   #显示不包含匹配文本的所有行。   
-V   --version   #显示版本信息。   
-w   --word-regexp   #只显示全字符合的行列。   
-x    --line-regexp   #只显示全行符合的行。   
-y   #此参数的效果和指定“-i”参数相同。

规则表达式:

^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。    
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   #一起用代表任意字符。   
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。    
\<      #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。 

POSIX字符:
为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。

[:alnum:]    #文字数字字符   
[:alpha:]    #文字字符   
[:digit:]    #数字字符   
[:graph:]    #非空字符(非空格、控制字符)   
[:lower:]    #小写字符   
[:cntrl:]    #控制字符   
[:print:]    #非空字符(包括空格)   
[:punct:]    #标点符号   
[:space:]    #所有空白字符(新行,空格,制表符)   
[:upper:]    #大写字符   
[:xdigit:]   #十六进制数字(0-9,a-f,A-F)  

3. 实例

素材:

all     81480280        899933
20180503        80611124        899104
20180504        82530465        920596

3.1 grep默认

有出现 all 的那一行就取出来

[root@www ~]# last | grep 'root'

3.2 grep的-v

只要没有 all 的就取出

[root@www ~]# last | grep -v 'root'

3.3 grep的-d,-f

只要有 all 就取出,并且仅取第一栏

[root@www ~]# last | grep 'root' |cut -d ' ' -f1

只显示匹配的内容

grep -o 'some' myfile

显示查找附近的几行

# 前后n行
seq 1 10|grep -2 3


# 后n行   after
seq 1 10|grep -A2 3  

# 前n行   before
seq 1 10|grep -B2 1   

忽略大小写

-i 可以跟其他的命令何在一起用。

lspci -nnk | grep -iA2 vga

正则部分

参考资料

那些程序支持正则表达式

grep,sed,awk,vim,less,nginx,varnish

在man**中查询**

 我们可以在正则man手册中查找正则的用法

man 7 regex

正则表达式的分类

 基本正则表达式

 扩展的正则表达式

元字符的分类

 字符匹配,匹配次数,位置锚定,分组

基础RE(用于grep)

 字符匹配        
1    .        匹配任意单个字符
2    []       匹配指定范围内的任意单个字符
3    [^]      匹配指定范围外的任意字符
 匹配次数:用在要指定的次数的字符后面,用于指定前面的字符出现的次数
1    *           匹配前面的字符任意次(包括0次)
2    .*          任意长度的任意字符
3    \?          匹配前面的字符0次或一次
4    \+          匹配前面的字符至少一次
5    \{n\}    匹配前面的字符n次
6    \{m,n\}   匹配前面的字符至少m次,最多n次
7    \{,n\}      匹配前面的字符最多n次
8    \{n,\}      匹配前面的字符最少n次
 位置锚定:用于定位出现的位置
1   ^            行首锚定
2   $            行尾锚定
3   ^$          空行
4   ^[[:space:]]$    空白行
5   \<,\b           词首锚定,用于单词模式的左侧
6   \>,\b           词尾锚定,用于单词模式的右侧
7   \<pattern\>      匹配整个单词
 分组:

     将一个或多个字符捆绑在一起,当做一个整体进行处理,如rootroot\+

      分组括号中的模式匹配到的内容会被正则表达式引擎记录在内部的变量中,这些变量的命令方式为\1,\2,\3...

      \1   表示从左侧起第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符

 后向引用:

      引用前面的分组括号中的模式所匹配的字符,而非模式本身

 或者:`\|`

扩展RE(用于egrep或grep —E)

  • 字符匹配:
1    .        匹配任意单个字符
2    []       匹配指定范围内的任意单个字符
3    [^]     匹配指定范围外的任意字符
  • 匹配次数
1    *                匹配前面的字符任意次(包括0次)
2    ?                匹配前面的字符0次或一次
3    +                匹配前面的字符至少一次
4    {n}          匹配前面的字符n次
5    {m,n}       匹配前面的字符至少m次,最多n次
  • 位置锚定
1   ^ :     行首
2    $ :     行尾
3    \<, \b :  语首
4    \>, \b :  语尾                    
  • 分组:
1     ()
2     后向引用: \1, \2, ...                      
  • 或者:
1     a|b: a或b
2     C|cat: C或cat
3     (C|c)at:Cat或cat   
  • 特殊字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母
[:upper:] 大写字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 所有水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号``[:xdigit:] 十六进制数字