linux三剑客grep详解
1、正则表达式
在学习grep以前,要对正则表达式有 一定的了解,所以在以下先介绍一下正则表达式
正则表达式是一种描述一组字符串的模式,为处理大量文本、字符串而定义的一套规则和方法,以行为单位进行处理。正则表达式分为两类:基本正则表达式(BRE)和扩展正则表达式(ERE)。在linux中使用正则表达式较多的有三个工具,分别为grep,sed和awk,这三个工具被称为linux文本处理的三剑客。
正则表达式元字符
正则表达式量词以及其它组成部分
正则表达式举例
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] 还有,要使用正则表达式的?+ {}记得前边加\