Linux 文本处理之grep
我们经常会遇到只需要一个文件里的只言片语,比如从文件里获取一串字符或者样式,可以用cat +文件一个一个找,这样不仅效率低,而且海量的字符会让你奔溃的。这个时候需要了解一下文本处理三剑客,分别是 grep 文本过滤工具 ;sed 文本编辑工具 ;awk 文本报告生成器。
1.grep
英文全拼:Global search REgular expression and Print out the line(全面搜索正则表达式并把行打印出来)。grep是每个Linux发行版都预装的文件工具。
2.作用
强有力的文件模式搜索工具,根据用户指定的"模式"(由正则表达式字符及文本字符所编写的过滤条件)对目标文本逐行进行匹配检查并打印出匹配到的行。
3.语法
grep [options] pattern [file...]
grep命令选项:
--color=auto 关键字高亮显示
[[email protected] ~]# cat /etc/passwd |grep --color=auto 514 machao2:x:512:514::/root/app:/bin/bash machao5:x:514:516::/root/machao1:/bin/bash
-v 关键字 显示不包含关关键字的行,取反
[[email protected] ~]# cat /etc/passwd |grep -v 1017 nologin:x:1013:1018::/home/nologin:/sbin/nologin weiyan:x:1017:1024::/home/weiyan:/bin/bash
-i 关键字 忽略关键字的大小写
[[email protected] ~]# cat abc.txt aaAAbb BBccCC dd ee ff Aa Bb hello world [[email protected] ~]# cat abc.txt |grep 'a' aaAAbb Aa Bb [[email protected] ~]# cat abc.txt |grep 'A' aaAAbb Aa Bb [[email protected] ~]# cat abc.txt |grep -i 'a' aaAAbb Aa Bb
-n 显示的结果每行前增加行号
[[email protected] ~]# cat abc.txt |grep -i -n 'a' 1:aaAAbb 4:Aa Bb
-c 仅显示找出的结果的行数
[[email protected] ~]# cat abc.txt |grep '[[:alpha:]]' -n 1:aaAAbb 2:BBccCC 3:dd ee ff 4:Aa Bb 5:hello world [[email protected] ~]# cat abc.txt |grep '[[:alpha:]]' -n -c 5
-o 仅显示匹配到的关键字,不显示同行的其他内容
[[email protected] ~]# cat abc.txt |grep 'ee' dd ee ff [[email protected] ~]# cat abc.txt |grep -o 'ee' ee
-q 不输出任何结果,静默
[[email protected] ~]# cat abc.txt |grep -q 'ee' [[email protected] ~]# echo $? 0 (输入指令无结果显示,$?意思是变量保存最近的命令退出状态,结果为0表示正确)
-A # 显示关键字行及向下的n行
[[email protected] ~]# cat abc.txt |grep -A1 'ee' dd ee ff Aa Bb
-B # 显示关键字行及向上的n行
[[email protected] ~]# cat abc.txt |grep -B1 'ee' BBccCC dd ee ff
-C # 显示关键字行及向上n行和向下的n行
[[email protected] ~]# cat abc.txt |grep -C1 'ee' BBccCC dd ee ff Aa Bb
-e 关键字1 -e 关键字2 …… 多个关键字之间是或的关系
[[email protected] ~]# cat abc.txt |grep -e aa -e ff -e BB aaAAbb BBccCC dd ee ff
-w 关键字 匹配整个单词
[[email protected] ~]# cat abc.txt aaAAbb BBccCC dd ee ff Aa Bb aa AA BB hello world [[email protected] ~]# cat abc.txt |grep aa aaAAbb aa AA BB [[email protected] ~]# cat abc.txt |grep -w aa aa AA BB
-E 等于egrep 使用扩展正则表达式
-F 等于fgrep 不使用正则表达式
这仅仅是grep命令的开始,你可能已经注意到,它对于实现各种各样的需求简直是太有用了。除了这种我们运行的这种只有一行的命令,grep还可以写成c自动的shell脚本去执行。
4.正则表达式
(1)由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义 ,而表示控制或通配的功能。程序支持:grep,sed,awk,vim, less,nginx,varnish等等
(2)分为两类:基本正则表达式(Basic Regular Expression 又叫Basic RegEx 简称BREs)
扩展正则表达式(Extended Regular Expression 又叫Extended RegEx 简称EREs)
Perl正则表达式 (Perl Regular Expression 又叫Perl RegEx 简称PREs)
(3)组成:一般字符:没有特殊意义的字符
特殊字符(meta字符):元字符,有在正则表达式中有特殊意义
(4)元字符及其在正则表达式上下文中的行为
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符 ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次。+ 等价于 {1,} ? 匹配前面的子表达式零次或一次。? 等价于 {0,1} {n} n 是一个非负整数,匹配确定的n 次 {n,} n 是一个非负整数,至少匹配n 次 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串 . 匹配除 “\n” 之外的任何单个字符 $ 匹配前面的正则表达式,在字符串或者行结尾处。BRE中仅在正则表达式的结尾处有特殊的含义,ERE中在任何位置都有特殊含义 [] 匹配方括号内的任一字符,其中可用连字符(-)指的连续字符的范围;^符号苦出现在方括号的第一个位置,则表示匹配不在列表中的任一字符 \< 或 \b 词首锚定,用于单词模式的左侧 \> 或 \b 词尾锚定;用于单词模式的右侧 \<PATTERN\> 匹配整个单词
(5) 字符集
[::alnum] : 数字字符 [:digit:] : 数字字符 [:punct:] : 标点符号字符 [:alpha:] : 字母字符 [:graph:] : 非空格字符 [:space:] : 空格字符 [:blank:] : 空格与定位字符 [:lower:] : 小写字母字符 [:upper:] : 大写字母字符 [:cntrl:] : 控制字符 [:print:] : 可显示的字符 [:xdigit:] : 16进制数字
(6)常用正则表达式
^$ 空行 ^[[:space:]]*$ 空白行 /<(.*)>.*<\/\1>|<(.*) \/>/ 匹配HTML标记的正则表达式 /(\d+)\.(\d+)\.(\d+)\.(\d+)/g // 匹配IP地址的正则表达式 "\<(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>" 匹配IP地址的正则表达式 \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 匹配Email地址的正则表达式 http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 匹配网址URL的正则表达式
原文地址:http://blog.51cto.com/13805636/2149653