6-1 9 正则 元字符 grep
博客专区 > 阿想 的博客 > 博客详情
6-1 9 正则 元字符 grep
阿想 发表于3个月前
6-1 9 正则 元字符 grep
  • 发表于 3个月前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

9.1 正则表达式和元字符

正则表达式是一种符号表示法,用于识别文本模式。

元字符

正则表达式的元字符包括以下字符

^ $ . [] {} - ? * + () | \

“.” 点。匹配任意单个字符

“^”和“$” 锚。匹配行的开头和结尾。例如:grep -i '^..j.r$' /词典用于填字游戏

“[ ]” 方括号。匹配括号内的一个字符。括号内的^表示否定,“-”表示范围,

  • 如果想在shell路径名扩展中正常使用[A-Z]需要调整POSIX为传统export LANG=POSIX

“|” 或。echo "AAA" | grep AAA|BBB|CCC输出AAA

“?”、“*”、“+”、“{}” 限定符。分别表示匹配0或1次、0或多次、1或多次、匹配次数

9.2 grep

全称:global regular expression print 全局正则表达式打印(工具)

语法:grep [options] regex [file...]

例如:grep -i 'dog' txt //中的dog即使正则表达式,不过通过特殊符号可以让表达式匹配更多含义

选项:功能描述

  • -i :--ignore-case忽略大小写
  • -v :-invert-match不匹配。正常情况下,grep会输出匹配行,二该选项可使grep输出不包含匹配项的所有航
  • -c :--count指定输出匹配项目数(如果有-v选项,那就输出不匹配项目的数目)而不是直接输出匹配行本身
  • -l :--files-with-matches输出匹配文件名而不是直接输出匹配行本身
  • -L :--files-without-match输出不包含匹配项的文件名
  • -n :--line-number在每个匹配行前面加上该行在文件内的行号
  • -h :--nofilename进行多文件搜索时,抑制文件名输出
  • -r 遍历所有子目录(默认只能看文件)
  • -A 后面跟数字,过滤出符合要求的行以及下面n行
  • -B 同上,过滤出符合要求的行以及上面n行
  • -C 同上,同时过滤出符合要求的行以及上下各n行

grep/egrp示例

  • grep -n 'root' /etc/passwd
  • grep -nv 'nologin' /etc/passwd
  • grep '[0-9]' /etc/inittab
  • grep -v '[0-9]' /etc/inittab

eg.1 基本用法

[root@ax-01 ~]# grep -n 'root' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@ax-01 ~]# grep -nv 'nologin' !$
grep -nv 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
25:mysql:x:1000:1000::/home/mysql:/bin/bash
26:user1:x:1001:1001::/home/user1:/bin/bash
[root@ax-01 ~]# grep '[0-9]' /etc/inittab
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5


  • grep '^[^a-zA-Z]' test.txt
  • grep '.o' test.txt
  • grep 'ot*' test.txt
  • grep '.*' test.txt

eg.2 特殊符号

[root@ax-01 ~]# cat txt
xxx     Math English C++  Experiment  
Monkey  100   90     95   Good  
Cat     80    100    60   Perfect  
Dog     90    60     70   Great  
Tiger   95    85     90   Fantastic 

@http://blog.csdn.net/stpeace/article/details/46848873
# awk基本用法简介
2015-07-12 19:49 by stpeace
[root@ax-01 ~]# grep '^[^a-zA-Z]' txt
@http://blog.csdn.net/stpeace/article/details/46848873
# awk基本用法简介
2015-07-12 19:49 by stpeace
[root@ax-01 ~]# grep '.o' txt
Monkey  100   90     95   Good  
Dog     90    60     70   Great  
@http://blog.csdn.net/stpeace/article/details/46848873
[root@ax-01 ~]# grep 'ot*' txt
Monkey  100   90     95   Good  
Dog     90    60     70   Great  

  • grep 'o{2}' /etc/passwd
  • egrep 'o{2}' /etc/passwd
  • egrep 'o+' /etc/passwd
  • egrep 'oo?' /etc/passwd
  • egrep 'root|nologin' /etc/passwd
  • egrep '(oo){2}' /etc/passwd

eg.3 有些特殊符号需要加-E或者用egrep来实现grep预想的效果

[root@ax-01 ~]# grep -E 'o{2}' txt
Monkey  100   90     95   Good
[root@ax-01 ~]# egrep 'o{2}' txt
Monkey  100   90     95   Good
[root@ax-01 ~]# egrep 'o+' txt
Monkey  100   90     95   Good  
Dog     90    60     70   Great
@http://blog.csdn.net/stpeace/article/details/46848873

eg.4 连带显示后面-A,前面-B 前后-C

[root@lixiang01 grep]# grep -nA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nOloGin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

eg.5 不区分大小写-i

[root@lixiang01 grep]# grep -inA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nOloGin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/RooT:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

grep -n '[a-zA-Z]' inittab      #输出含字母的行
grep -nv '[a-zA-Z]' inittab     #输出不含字母的行
grep -n '^[a-zA-Z]' inittab     #输出字母为首的行
grep -n '^[^a-zA-Z]' inittab    #输出非字母为首的行
grep -nv '^[^a-zA-Z]' inittab   #输出字母为首的行
grep -nv '[^a-zA-Z]' inittab    #输出不含非字母的行
grep -nv '^[a-zA-Z]' inittab    #输出非字母为首的行
[root@lixiang01 grep]# cat -n 111.txt
     1	r rr rrr rrrr
     2	o oo ooo oooo
     3	ro or rr oo
     4	rrr
     5	rro
     6	roo
     7	ror
     8	orr
     9	oor
    10	ooo
    11	rrrr
    12	rrro
    13	rroo
    14	rooo
    15	orrr
    16	oorr
    17	ooor
    18	oooo
    19	roro
    20	oror
    21	roor
    22	orro
    23	rorroorrrooorrrroooorrrrrooooo
  • 中间匹配一个字符
[root@lixiang01 grep]# grep -n 'r.o' 111

image

  • o加任意个o
[root@lixiang01 grep]# grep -n 'oo*' 111

image

  • 通配
[root@lixiang01 grep]# grep -n '.*' 111

image

  • 两种取消{}特殊含义的用法
[root@lixiang01 grep]# grep -n 'o\{2\}' 111
[root@lixiang01 grep]# egrep -n 'o{2}' 111

image

  • “+” 代表有oo的同时有n个r n=1,2,3...;
  • ?代表有oo的同时有n个r n=0,1
[root@lixiang01 grep]# egrep -n 'oor+' 111
[root@lixiang01 grep]# egrep -n 'oor?' 111

image image

  • "|"表示或者
[root@lixiang01 grep]# egrep -n 'roo|ror|orr' 111

image

  • 代表oo组合两次
[root@lixiang01 grep]# egrep '(oo){2}' 111

image

扩展: 把一个目录下,过滤所有*.php文档中含有eval的行 grep -r --include="*.php" 'eval' /data/

[root@ax-01 ~]# grep -r --include="*txt" 'Dog' /root/
/root/txt:Dog     90    60     70   Great  
/root/test.txt:Dog
[root@ax-01 ~]# grep 'Dog' /root/*txt
/root/test.txt:Dog
/root/txt:Dog     90    60     70   Great 
共有 人打赏支持
粉丝 0
博文 72
码字总数 69742
×
阿想
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: