通配符和正则表达式-grep,egrep,fgrep
通配符和正则表达式,通配符用于文件名匹配,命令支持ls,cp,rm等;正则为通用匹配,命令支持grep,awk,sed,vi,find等。文本过滤工具grep,fgrep
通配符
* 匹配零个或多个任意字符
? 匹配单个任意字符
[] 匹配指定范围内的一个字符,[]括号中的 字符间隔符 可以省略,如,\=:等等。举例[1:2=3,5\7] = [12357],也推荐使用这种省略写法作为标准
^ 取反,表示非。注意:非数字即包含字母、特殊字符和汉字,非字母即包含数字、特殊字符和汉字。一个汉字属于一个字符
通配符举例:
[1]
[123]
[1-5]
[135]
[1-3,79] = [1-379]
8[0-9] 匹配数字80-89,首位8为固定匹配,第二位为顺序匹配0-9
1[0-9][0-9] 匹配数字100-199,首位1为固定匹配,第二位和第三位为顺序匹配0-9
[^123]
[^12,5] = [^125]
[^1-5,9] = [^1-59]
[0-9] 匹配数字0-9
[^0-9] 非数字,即匹配所有大小写字母和特殊字符
[a-Z] 匹配所有大小写字母,排序为a,A,b,B,c,C...z,Z
[0-Z] 零到大写Z,即匹配所有数字和大小写字母,顺序为0-9,a,C...y,Y,z,Z
[^0-Z] 匹配特殊字符
[a-z] 注意这里并非匹配的是a-z,而是除了大写Z之外的字母
[A-Z] 注意这里并非匹配的是A-Z,而是除了小写a之外的字母
[abc] 匹配a,c
[a-c] 匹配a,c
[a-C] 匹配a,C
[A-C] 匹配A,C
[ACdf] 匹配A,C,d,f
[^a-d] 匹配除了a,d
[wang] 匹配列表中的任意一个字符w,n,g
[^wang] 匹配列表中的所有字符以外的字符
[5-9a-CZ] 数字字母支持混合,匹配5-9,Z
[[:lower:]] 匹配小写字母a,d...
[[:upper:]] 匹配大写字母A,D...
预定义的字符类 可通过man 7 glob查看
[[:alnum:]] 匹配任意一个字母或数字,同[0-Z]零-大写Z
[[:alpha:]] 任意一个大小写字母,同[a-Z]小写a-大写Z
[[:lower:]] 任意小写字母
[[:upper:]] 任意大写字母
[[:blank:]] 水平空白字符(空格和制表符)
[[:space:]] 水平或垂直空白字符(比[:blank:]包含的范围广),同[\t\r\n\v\f]
[[:cntrl:]] 任意一个控制字符(ASCII字符集中的前32个字符,退格,删除,警铃...),不可打印字符
[[:digit:]] 任意一个数字,同[0-9]
[[:xdigit:]] 任意一个十六进制数,同[0-9a-F]
[[:graph:]] 任意一个可打印的非空白字符
[[:print:]] 任意一个可打印字符
[[:punct:]] 任意标点符号
字符位说明
[0-9]或[a-Z]或[0-Z] 表示匹配一个字符位,如0,1,9,Z
[a-Z][0-9] 表示匹配两个字符位,且首位为字母,第二位为数字,如a1,b2,c9,Z8,K6
[0-9]?? 表示匹配三个字符位,且首位为数字,如010,2ai,98h,66Z
[0-9]* 表示匹配一个或多个字符位,且首位为数字,如1,12,800,10ab,39KEaL
[^0-9]* 表示匹配一个或多个字符位,且首位不是数字,如a,ab,a102,NCo3la
案例:
touch{A..z}创建大小写字母和5个特殊字符"`_^][",注意这里的大括号{A..z}并不是通配符 touch{0..9}创建数字0-9 touchf{A..z} touchf{0..9} touchf汉f汉字 touchf.log touchf21f23f24f234f32f35f63f-1f-12fa_bf4422faaa4d35faaa4d3rr5
touch /root/d1/-al 创建-al文件,注意-开头的文件增删改查必须指定绝对路径,而且-文件无法用通配符匹配过滤,可匹配到的即自动认为是命令参数直接运行
ls ??l 显示为执行后的结果,即匹配到-al后自动作为ls的参数执行ls -al
lsf[1,2,3]显示f1,f2,f3 lsf[123]显示f1,f3 lsf[23]显示f2,f3 lsf[2323]显示f2,f3 lsf[2,3,23]显示f2,f3 lsf[23]*显示f2f21f23f234f24f3f32f35 lsf[23]?显示f21f23f24f32f35,同f2?andf3? lsf*[23]?显示f21f23f234f24f32f35f4422faaa4d35,同f*2?andf*3? lsf*3*显示f23f234f3f32f35f63faaa4d35faaa4d3rr5 lsf*[123]显示f1f-1f-12f2f21f23f3f32f4422f63 lsf?[123]显示f-1f21f23f32f63 ls[aBZ]显示aBZ ls[^aBZ]显示非a,Z之外的单个字符,包括数字和大小写字母,以及特殊符号,还有汉字 ls[^aBZ5-9]显示非a,Z,5-9之外的单个字符 lsf?//可以匹配到f汉,说明一个汉字也属于一个字符 lsf????//可以匹配到f.log,说明后缀也属于字符长度 ls*.*匹配所有带有后缀名的文件,或者文件名中有.的文件 ls*-*匹配所有文件名中带有-的文件 ls*_*匹配下划线 ls-d/etc/*.d显示/etc下的所有以.d结尾的文件和目录
创建文件: mkdir~/d1 cd~/d1 touch{0..9} touch{A..z} 第一种删除: touch/root/d1/-rf ls rm??fabcABC123 rm??f[^0-9]//删除非数字字符 mv9999 rm???//自动删除999,即删除与-rf位数匹配(都是3位)的文件 rm???*//删除所有,但是无法删除-rf文件 rm-rf*//此命令同上,无法删除-rf文件,需添加绝对路径 rm???~/d1/-rf//成功删除 第二种删除: touchrm\\-rf\\*//创建rm-rf*这个文件 lsrm*//可以匹配到rm-rf*这个文件,是否可以执行呢 ls[r]*[r]???//同上 lsrm*|/bin/bash//用管道交给bash执行
#########################
linux文本处理三剑客
grep:文本过滤工具(模式:pattern),egrep,fgrep(不支持正则表达式搜索)
sed:stream editor,文本编辑工具
awk:Linux上实现gawk,文本报告生成器
grep:Global search REgular expression and Print out the line
作用:文本搜索工具,根据用户指定的模式对目标文本进行逐行匹配检查,并打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
格式和选项
grep[OPTIONS]PATTERN[FILE...] grep[OPTIONS][-ePATTERN|-fFILE][FILE...] 注意:PATTERN如果是表达式或者多个单词的,需要用引号引用.可以是单引号''也可双引号"",区别是单引号无法引用变量而双引号可以. --color=auto:对匹配到的文本着色显示 -v:显示没有匹配到的行,即排除关键字行 -i:忽略字符大小写 -n:显示匹配到的行,并显示行号 -c:统计匹配到的行的行数,有几行 -o:仅显示匹配到的字符串 -q:静默模式,不输出任何信息,0表示有匹配到,1表示未匹配到 -A#:after,同时显示匹配到行的后#行 -B#:before,前#行 -C#:context,前后各#行,可简写为-# -e:实现多个选项间的逻辑或关系,grep-e'cat'-e'dog'file -w:整行匹配整个单词,单词包括字母,数字和下划线_,一个汉字也是一个单词 -l:同时搜索匹配多个文件时,列出匹配到的文本在哪些文件中 -E:使用ERE,相当于egrep -F:相当于fgrep,不支持正则表达式 -d动作参数:指定要查找的是目录而非文件,动作参数有:read,recurse,skip -r:递归搜索,效果同"-drecurse"参数
匹配用户名的5种写法
greproot/etc/passwd grep'root'/etc/passwd//''显示为字符串,即效果同上,用于匹配包含特殊符号的内容,如'/root' grep"$USER"/etc/passwd//""可以引用变量 grep`whoami`/etc/passwd grep$(whoami)/etc/passwd
案例:
cp/etc/passwd~/ grep"name"f1f2f3...在多个文件中查找匹配 greprootpasswd|grepnologin且 grep-eroot-euserapasswd或 grep-iROOTpasswd grep-wrootpasswd//完全匹配单词root的行,不包括rooter用户 grep-v"nologin"passwd echoabcisacb|grep-o"abc" grep-crootpasswd grep-nrootpasswd grep-labcpasswdgroup #greproot.-r-n//在当前目录下递归搜索匹配root并显示文件名和匹配内容的行号 ./passwd:1:root:x:0:0:root:/root:/bin/bash ./passwd:10:operator:x:11:0:operator:/root:/sbin/nologin ./group:1:root:x:0: ./a/abc:1:root,ala grep-qrootpasswd greprootpasswd&>/dev/null功能同上 echo$?正确为0,错误执行显示为非0,可能是1或2,127... greprrootpasswd&>/dev/null未匹配到内容,显示为1 greprootpass&>/dev/null文件名错误,显示为2 geprootpasswd&>/dev/null命令错误,显示为127 在grep搜索结果中包括或者排除指定文件: 1.只在目录中所有的.PHP和.html文件中递归搜索字符"main()" #grep"main()".-r--include*.{PHP,html} 2.在搜索结果中排除所有README文件 #grep"main()".-r--exclude"README" 3.在搜索结果中排除filelist文件列表里的文件 #grep-nA6rootpasswd//同时显示匹配到行的后6行 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 4-adm:x:3:4:adm:/var/adm:/sbin/nologin 5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6-sync:x:5:0:sync:/sbin:/bin/sync 7-shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown -- 10:operator:x:11:0:operator:/root:/sbin/nologin 11-games:x:12:100:games:/usr/games:/sbin/nologin 12-ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin 13-nobody:x:99:99:Nobody:/:/sbin/nologin 14-systemd-bus-proxy:x:999:997:systemdBusProxy:/:/sbin/nologin 15-systemd-network:x:192:192:systemdNetworkManagement:/:/sbin/nologin 16-dbus:x:81:81:Systemmessagebus:/:/sbin/nologin timecmd//计算cmd执行的时长
###########################
基本正则表达式
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配符的功能。
正则表达式(regular expression)就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征。
正则表达式的组件可以是单个字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
分两类:基本正则BRE(grep),扩展正则ERE(grep -E,egrep)
查看正则表达式:man 7 regex
基本正则表达式的特殊符号需要转义,如[]()|\*,表示为:"\(\)","\[\]","\|""\\"在扩展正则表达中不需要加\
字符匹配:
. 匹配除换行符(\n)之外的任意单个字符
[] 匹配指定范围内的任意单个字符
[^] 匹配指定范围之外的任意单个字符
匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数
? 匹配前面的字符0次或1次,即≤1次
* 匹配前面的字符0次或多次,即≥0次
+ 匹配前面的字符1次或多次,即≥1次
* 匹配前面的字符任意次,包括0次,同\{0,\}。grep默认为贪婪模式:尽可能长的匹配
注意区别:通配符的*指的是匹配零个或多个任意字符,正则表达式的*指的是匹配前一个字符零次或多次
.* 匹配任意长度的任意字符
\? 匹配其前面的字符0或1次,同\{0,1\}
\+ 匹配其前面的字符至少1次,同\{1,\}
\{n\} 匹配前面的字符n次
\{n,m\} 匹配前面的字符至少n次,至多m次,包括n次和m次,即[n-m]
\{,m\} 匹配前面的字符至多m次,即m次以下,包括m次和0次
\{n,\} 匹配前面的字符至少n次,即n次以上,包括n次
[0-9]
[a-z]
[A-Z]
[:alnum:] 匹配任意一个字母或数字,同[a-zA-Z0-9]
[:alpha:] 任意一个大小写字母,同[a-zA-Z]
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:blank:] 水平空白字符(空格和制表符)
[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广),同[\t\r\n\v\f]
[:cntrl:] 任意一个控制字符(ASCII字符集中的前32个字符,退格,删除,警铃...),不可打印字符
[:digit:] 任意一个数字,同[0-9]
[:xdigit:] 任意一个十六进制数,同[0-9a-fA-F]
[:graph:] 任意一个可打印的非空白字符
[:print:] 任意一个可打印字符
[:punct:] 任意标点符号
[[:alpha:]] = [a-zA-Z]
[[:digit:]mage] = [0-9mage]
位置锚定:定位出现的位置
^word 行首锚定^,开始标记
word$ 行尾锚定$,结束标记
^pattern$ 用于模式匹配整行,^$ 空行, ^[[:space:]]*$ 空白行,即包括空格或tab等的行
\ 斜杠表示匹配转义后的字符,如\/,即匹配/
\< 或 \b 词首锚定,匹配单词开始
\> 或 \b 词尾锚定,匹配单词结束
\<pattern\> 匹配整个单词
| 竖线表示或,如a|b,即匹配a或b
单词边界:除了字母,数字和下划线_以外的字符
注意:\<^[^0-9]..host\> //第一个^表示行首锚定,第二个在[]里的^表示非,即排除数字。
分组:表示为\(\) 将一个或多个字符捆绑在一起,当做一个整体进行处理,如\(root\)\+
分组括号中的模式匹配到的内容会被正则表达式引擎记录与内部的变量中,这些变量的命名方式为:\1,\2,\3...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
() 标记匹配的字符串,将候选的所有元素放在()中,用|隔开,如a(1|2|3)b,即匹配a1b,a2b,a3b
案例:
greprooo*tpasswd注意o*包括0次,0次即为空 o*包括:空,o,oo,ooo,oooo,oooo... vigle.txt gle ggle gogle google abc goooogle goooooooooogle goooooo00000gle grepgooo*glegle grepg...*glegle grep"go\?gle"gle grep"go\{4\}gle"gle grep"go\{1,6\}gle"gle grep"go\{,6\}gle"gle grep"go\{2,\}gle"gle echoarbrcr|grep"[ab]r" echoarbrcr|grep"[^ab]r" echoaaabbbccc|grepa*b grep[a-g]apasswd grepr.*tpasswd grep"ro\{2\}t"passwd grep-or..tpasswd echorororo|grep"\(ro\)\{2,\}"//匹配2次以上的ro,可以匹配到 echorororo|grep"\(ro\)\{4,\}"//匹配4次以上的ro,则匹配不到 echoacbc|grep"a\|b"//匹配a或b echoacbcabcb|grep"\(a\|b\)c"//匹配ac或bc grep':[0-9][0-9][0-9]:'passwd//匹配包含连续3个数字的行 grep^rootpasswd grepbash$passwd grep-n^$f1//匹配空行 grep-v^#/etc/fstab//匹配#号注释的行 grep-n"^[[:space:]]*$"f1//匹配空白行,-v取反 grep'^r.*n$'/etc/passwd//匹配以r开头n结尾的行 grep'^r.*n'/etc/passwd//匹配以r开头的行 grep"\(r..t\).*\1"passwd grep"\(a.c\).*\(1.3\).*\1.*\2"/etc/passwd nmap-v-sP172.17.252.0/24|grep-B"Hostisup"|grepfor>ipup moreipup|cut-d""-f5 nmap-v-A172.17.0.1//扫描服务端口 grep'#[[:space:]]*[^[:space:]]'/etc/inittab grep'^\(1\|2\)'/etc/inittab或grep-E'^(1|2)'/etc/inittab ifconfig|grep'inet'|grep-v'127.0.0.1'|tr-s''|cut-d''-f3//centos73截取IP ifconfigeth0|grepMask|cut-d:-f2|cut-d""-f1//centos6截取IP ifconfig|grep-A1"^eth0"|grep"\<[0-9.]\{1,\}|cut-d:-f2 df|grep/dev/sd|tr-s''%|cut-d%-f5|sort-nr|head-1 echo"efc:ab_2344cdef"|grep"\<efc\>" echo"hi,Lily,Lucy,Tom."|grep"\bhi\b.*\bLucy\b" echo"010-12345678021-238982640215-892343951"|egrep"\b0[0-9]{2,3}-[0-9]{8}\b" //匹配固话:3或4位区号-8位电话号码
扩展的正则表达式
egrep = grep -E
字符匹配:无需转义
. 任意单个字符
[] 指定范围的字符
[^] 不包含指定范围的字符
次数匹配:无需转义
*:匹配前面字符任意次,包括0次
?:0或1次
+:1次或多次
{n}:匹配n次
{n,m}:至少n,至多m次,包含nm次
位置锚定:同基本正则
^:行首
$:行尾
\<或\b:语首
\>或\b:语尾
分组:
():user(a|b),匹配usera或userb
后项引用:最多可以匹配9个模式,即\1...\9
(...)(...)\1\2:模式匹配,\1代表前一个括号模式,\2代表后一个括号模式
或
a|b|c:a或b或c
(C|c)at:Cat或cat
案例:
egrp"go+gle"gle egrp"go{1,3}gle"gle egrep'^+'f1以一个或者多个空格开头的行 grep'^*'f1同上 egrep'user(aa|bb)'f1包含useraa或userbb的行 egrep'(ab)+'f1包含至少一个ab的行 egrep'x[0-9]?'f1包含x或者x后面跟着0个或者多个数字的行 egrep'fun\.$'*所有文件里面以fun.结尾的行 egrep'[A-Z]+'f1至少包含一个大写字母的行 egrep'[0-9]'f1至少一个数字的行 egrep'[A-Z]...[0-9]'f1包含五个字符,第一个是大写字母,最后一个是数字的行 egrep'[tT]est'f1包含单词test或Test的行 egrep'kensun'f1包含kensun的行 egrep-v'marry'f1不包含marry的行 egrep-i'sam'f1不考虑sam的大小写,含有sam的行 egrep-l"root"*在当前目录中查找包含root的文件并显示文件名 egrep-ntomf1包含tom的行并显示行号 egrep-s"$name"f1找到变量名$name的不打印而是显示退出状态.0表示找到.1表示没找到,2表示文件没找到