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/