Linux文本处理三剑客之grep

grep命令

命令简介

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来

命令语法

grep [OPTION]... PATTERN [FILE]...

命令选项

--color=auto :  对匹配到的文本着色显示
-v :  显示不被pattern匹配到的行
-i :  忽略字符大小写
-n: 显示匹配的行号
-c :  统计匹配的行数
-o :  仅显示匹配到的字符串
-q :  静默模式,不输出任何信息
-A # :  after, 后#行
-B # :  before, 前#行
-C #: context, 前后各#行
-e : 实现多个选项间的逻辑or关系
-w : 匹配整个单词
-E : 相当于egrep,使用扩展的正则表达式
-F : 相当于fgrep,不支持正则表达式,搜索速度快

示例

root@centos7 ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


[root@centos7 ~]# grep -vc "root" /etc/passwd
29


[root@centos7 ~]# grep -o "root" /etc/passwd
root
root
root
root

[root@centos7 ~]# grep -C 2 "core id" /proc/cpuinfo
physical id : 0
siblings : 2
core id : 0
cpu cores : 2
apicid : 0
--
physical id : 0
siblings : 2
core id : 1
cpu cores : 2
apicid : 1

 

grep与正则表达式

正则表达式(REGEXP)又分为基本正则表达式(BRE)和扩展正则表达式(ERE)

基本正则表达式

1.字符匹配

. 匹配任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围外的任意单个字符
[:alnum:] 字母和数字
[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
[:lower:] 小写字母 [:upper:] 大写字母
[:blank:] 空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
[:cntrl:] 不可打印的控制字符(退格、删除、警铃...)
[:digit:] 十进制数字 [:xdigit:]十六进制数字
[:graph:] 可打印的非空白字符
[:print:] 可打印字符
[:punct:] 标点符号

2.次数匹配(贪婪模式:尽可能长的匹配)

* 匹配前面的字符任意次,包括0次
.* 任意长度的任意字符
\? 匹配其前面的字符0或1次
\+ 匹配其前面的字符至少1次
\{n\} 匹配前面的字符n次
\{m,n\} 匹配前面的字符至少m次,至多n次
\{,n\} 匹配前面的字符至多n次
\{n,\} 匹配前面的字符至少n次

3.位置锚定

^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行,其中 ^$ 表示空行,^[[:space:]]*$ 表示空白行
\< 或 \b 词首锚定,用于单词模式的左侧
\> 或 \b 词尾锚定;用于单词模式的右侧
\<PATTERN\> 匹配整个单词

4.分组和后向引用

\(string\) :将string作为一个整体方便后面引用
\1 :引用第1个左括号及其对应的右括号所匹配的内容
\2 :引用第2个左括号及其对应的右括号所匹配的内容
...
\n :引用第n个左括号及其对应的右括号所匹配的内容

5.或者

\|,例如a\|b表示a或b,C\|cat表示C或cat, \(C\|c\)at表示Cat或cat

扩展正则表达式

注意grep要使用扩展的正则表达式要加-E选项,或者直接使用egrep

1.字符匹配

跟正则表达式一样

2.次数匹配(贪婪模式:尽可能长的匹配)

* 匹配前面的字符任意次,包括0次 (与基本正则表达式一样)
.* 任意长度的任意字符 (与基本正则表达式一样)
? 匹配其前面的字符0或1次 (跟基本正则表达式相比没有 \)
+ 匹配其前面的字符至少1次 (跟基本正则表达式相比没有 \)
{n} 匹配前面的字符n次 (跟基本正则表达式相比没有 \)
{m,n} 匹配前面的字符至少m次,至多n次 (跟基本正则表达式相比没有 \)
{,n} 匹配前面的字符至多n次 (跟基本正则表达式相比没有 \)
{n,} 匹配前面的字符至少n次 (跟基本正则表达式相比没有 \)

3.位置锚定

跟基本正则表达一样

4.分组和后向引用

(string) :将string作为一个整体方便后面引用     (跟基本正则表达相比没有 \)
\1 :引用第1个左括号及其对应的右括号所匹配的内容
\2 :引用第2个左括号及其对应的右括号所匹配的内容
...
\n :引用第n个左括号及其对应的右括号所匹配的内容

5.或者

|(跟基本正则表达式相比没有 \),例如a|b表示a或b,C|cat表示C或cat, (C|c)at表示Cat或cat

示例

1. 取出rhel或centos系统的主版本号

[root@centos7 ~]# grep -o "[0-9]\+" /etc/redhat-release | head -1
7

2. 取出网卡ens33的ip地址

[root@centos7 ~]# ifconfig ens33 | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | head -1
192.168.249.70

3. 显示CentOS7的/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面有非空白字符的行

[root@centos7 ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg

4. 找出/etc/passwd中的两位或三位数

[root@centos7 ~]# grep -o  '\<[[:digit:]]\{2,3\}\>' /etc/passwd

5 .使用egrep取出/etc/rc.d/init.d/functions中其基名

[root@centos7 ~]# echo /etc/rc.d/init.d/functions | egrep -o '[^/]+/?$'
functions

6 .使用取出/etc/rc.d/init.d/functions中其目录名

[root@centos7 ~]# echo /etc/rc.d/init.d/functions | egrep -o  "^.*/"
/etc/rc.d/init.d/

 

 

 

 

posted @ 2018-08-02 15:42  独孤柯灵  阅读(165)  评论(0编辑  收藏  举报