您的位置:首页 > 运维架构 > Linux

Linux文本处理之grep

2018-07-24 20:47 190 查看
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 关键字高亮显示
[root@centos6 ~]# cat /etc/passwd |grep --color=auto 514
machao2:x:512:514::/root/app:/bin/bash
machao5:x:514:516::/root/machao1:/bin/bash
-v 关键字 显示不包含关关键字的行,取反
[root@localhost ~]# cat /etc/passwd |grep -v 1017
nologin:x:1013:1018::/home/nologin:/sbin/nologin
weiyan:x:1017:1024::/home/weiyan:/bin/bash
-i 关键字 忽略关键字的大小写
[root@localhost ~]# cat abc.txt
aaAAbb
BBccCC
dd ee ff
Aa Bb
hello world
[root@localhost ~]# cat abc.txt |grep 'a'
aaAAbb
Aa Bb
[root@localhost ~]# cat abc.txt |grep 'A'
aaAAbb
Aa Bb
[root@localhost ~]# cat abc.txt |grep -i 'a'
aaAAbb
Aa Bb
-n 显示的结果每行前增加行号
[root@localhost ~]# cat abc.txt |grep -i -n 'a'
1:aaAAbb
4:Aa Bb
-c 仅显示找出的结果的行数
[root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n
1:aaAAbb
2:BBccCC
3:dd ee ff
4:Aa Bb
5:hello world
[root@localhost ~]# cat abc.txt |grep '[[:alpha:]]' -n -c
5
-o 仅显示匹配到的关键字,不显示同行的其他内容
[root@localhost ~]# cat abc.txt |grep 'ee'
dd ee ff
[root@localhost ~]# cat abc.txt |grep -o 'ee'
ee
-q 不输出任何结果,静默
[root@localhost ~]# cat abc.txt |grep -q 'ee'
[root@localhost ~]# echo $?
0          (输入指令无结果显示,$?意思是变量保存最近的命令退出状态,结果为0表示正确)
-A # 显示关键字行及向下的n行
[root@localhost ~]# cat abc.txt |grep -A1 'ee'
dd ee ff
Aa Bb
-B # 显示关键字行及向上的n行
[root@localhost ~]# cat abc.txt |grep -B1 'ee'
BBccCC
dd ee ff
-C # 显示关键字行及向上n行和向下的n行
[root@localhost ~]# cat abc.txt |grep -C1 'ee'
BBccCC
dd ee ff
Aa Bb
-e 关键字1 -e 关键字2 …… 多个关键字之间是或的关系
[root@localhost ~]# cat abc.txt |grep -e aa -e ff -e BB
aaAAbb
BBccCC
dd ee ff
-w 关键字 匹配整个单词
[root@localhost ~]# cat abc.txt
aaAAbb
BBccCC
dd ee ff
Aa Bb
aa AA BB
hello world
[root@localhost ~]# cat abc.txt |grep aa
aaAAbb
aa AA BB
[root@localhost ~]# 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的正则表达式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息