linux三剑客grep详解

1、正则表达式

在学习grep以前,要对正则表达式有 一定的了解,所以在以下先介绍一下正则表达式

正则表达式是一种描述一组字符串的模式,为处理大量文本、字符串而定义的一套规则和方法,以行为单位进行处理。正则表达式分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。在linux中使用正则表达式较多的有三个工具,分别为grep,sed和awk,这三个工具被称为linux文本处理的三剑客。

正则表达式元字符

linux三剑客grep详解

正则表达式量词以及其它组成部分

linux三剑客grep详解

正则表达式举例

1、^\d+$” //非负整数(正整数 + 0) 
2、“^[0-9]*[1-9][0-9]*$” //正整数 
3、“^((-\d+)|(0+))$” //非正整数(负整数 + 0) 
4、“^-[0-9]*[1-9][0-9]*$” //负整数 
5、“^-?\d+$” //整数 
6、“^\d+(\.\d+)?$” //非负浮点数(正浮点数 + 0) 
7、“^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$” //正浮点数 
8、“^((-\d+(\.\d+)?)|(0+(\.0+)?))$” //非正浮点数(负浮点数 + 0) 
9“^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$” //负浮点数 
10、“^(-?\d+)(\.\d+)?$” //浮点数 
11、“^[A-Za-z]+$” //由26个英文字母组成的字符串 
12、“^[A-Z]+$” //由26个英文字母的大写组成的字符串 
13、“^[a-z]+$” //由26个英文字母的小写组成的字符串 
14、“^[A-Za-z0-9]+$” //由数字和26个英文字母组成的字符串 
15、“^\w+$” //由数字、26个英文字母或者下划线组成的字符串 
16、^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$ 邮箱
17、“^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$” //url 
18、/^(\d{2}|\d{4})-((0([1-9]{1}))|(1[12]))-(([0-2]([1-9]{1}))|(3[01]))$/   //  年-月-日 
19、/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/   // 月/日/年 
20、“^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$”   //Email 

1、grep简介

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

2、grep主要参数
[options]主要参数:

 -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”参数相同。
  --help   在线帮助。

3、grep实用案例

  1、搜寻1.txt文件中字符串"the"  注: n为显示行号   grep -n 'the' regular_express.txt

  2、反向搜寻特定字符串"the"      grep -vn 'the' regular_express.txt

  3取得任意大小写"the"的这个字符串  # grep -in 'the' regular_express.txt

4.利用括号 [] 来搜寻集合字符    搜索test或taste这两个单词  

grep -n 't[ae]st' regular_express.txt   

这样其实就是在找t[a]st和t[e]st这两个分开的字符

     第4题延伸:

如果搜索有 oo 的字符时,则可以使用:# grep -n 'oo' regular_express.txt

        如果搜索oo时不想搜到 oo 前面有 g 的话,我们可以利用反向选择[^]来达成:

         grep -n '[^g]oo'  regular_express.txt

        如果搜索oo前面不想有小写字符,则:grep -n '[^a-z]oo' regular_express.txt

        注: 大写英文/小写英文/数字 可以使用 [a-z]/[A-Z]/[0-9]等方式来书写,也可以写在一起[a-zA-Z0-9]表示要求字符串是数字以及英文

       如果我们要取得有数字的那行,则:# grep -n '[0-9]' regular_express.txt

5、显示行首为'the'的字符串  # grep -n '^the' regular_express.txt

  6、显示行首是小写字符    grep -n '^[a-z]' regular_express.txt

  7、显示行尾为点 . 的那一行  grep -n '\.$' regular_express.txt

  8、显示5-9行数据   cat -An regular_express.txt |head -n 10 |tail -n 6

                      nl 9.txt|grep '^\s\+5' -A 4

9、找出g??d字符串,起头g结束d的四个字符串 grep -n 'g..d' regular_express.txt

  10、o*代表空字符(就是有没有字符都可以)或者一个到N个o字符,所以

grep -n 'o*' regular_express.txt就会把所有行全部打印出来,

  11、.oo*代表o+空字符或者一个到N个o字符,所以grep -n 'oo*' regular_express.txt就会把o,oo,ooo等的行全部打印出来

12、"goo*g"代表gog,goog,gooog...等 grep -n 'goo*g' regular_express.txt

13、找出含g...g字符串的行grep -n 'g.*g' regular_express.txt

  14、找出含有数字的行  grep -n '[0-9]\+' regular_express.txt 

grep -n '[0-9]' regular_express.txt

 

  15、找出含两个o的字符串 grep -n 'o\{2\}'  regular_express.txt

  16、找出g后含2到5个o然后以g结尾的字符串 

grep -n 'go\{2,5\}g'  regular_express.txt

17、找出g后含2以上的o然后以g结尾的字符串 

grep -n 'go\{2,\}g'  regular_express.txt

 

4、grep 与管道

   grep 的输入不一定都是文件,它也常常从管道读取输入

    [[email protected] test]# ls

grep.txt sed1.txt sed2.txt sed.txt

[[email protected] test]# ls | grep "grep"

grep.txt

[[email protected] test]# ls | grep "^gr"

grep.txt

说明:

ls 的命令的输出通过管道传给 grep。输出结果字母 gr 开头的所有行都被打印出来了,

也就是说,被选中的目录被打印出来了

注意:经过测试\d不能使用如果想使用数字用[0-9] 还有,要使用正则表达式的?+ {}记得前边加\