bash
通配符:
*:
?:
[]:
所有以m,n,r开头的以.conf结尾的文件
eg:[mnr].conf
[^]:非[]中的
[[:space:]]
[[:upper:]]
[[:lower:]]
[[:alnum:]]
[[:digit:]]
[[:punct:]]
通配符:需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。
而且涉及的只有,*,? [] ,{} 这几种。
字符 含义 实例
* 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。
? 匹配 任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。
[list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。
[!list] 匹配 除list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。
[c1-c2] 匹配 c1-c2 中的任意单一字符 如[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。
{string1,string2,...}匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。
tips:
[root@localhost test]# ls -1 f[A-b]*
fA
fb
[root@localhost test]# ls -1 f[a-b]*
fA
fa
fb
从上面可以看出排序的方式是a,A,b,B,....z,Z;所以[a-z]表示的并不是a-z,也会匹配到的是除Z外的所有大小写字母
文本处理工具:
Linux上文本处理三剑客:
grep:文本过滤工具
sed:stream editor,流编辑器
awk:Linux上的实现为gawk,文本报告生成器
正则表达式:
基本正则表达式:BRE
扩展正则表达式:EBR
正则表达式引擎:grep是贪婪模式
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN|-f FILE][FILE...]
OPTIONS:
--color=auto :对匹配到的文本着色后高亮显示
-i: 忽略字符的大小写
-c:显示匹配的行数
-o:仅显示匹配到的字符串本身
-v:显示不能被模式匹配到的行
-E:支持使用拓展的正则表达式元字符;
-q: 静默模式,即不输出任何信息
-w 只显示全字符合的列。
-n:显示匹配到的行在文件中的行号
[root@localhost test]# cat f1 | grep "car"
who care
i have a car
carry
whocare
[root@localhost test]# cat f1 | grep -w "car"
i have a car
-R:递归搜索目录
-x 只显示全列符合的列
[root@localhost test]# grep "carr" f1
carry ha
[root@localhost test]# grep -x "carr" f1
-A #:after,后#行
-B #:before 前#行
-C #: 前后都多显示#行 ,也可用-1,-2表示
基础正则表达式元字符:
字符匹配:
. :匹配任意单个字符
[] :匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符。
[:digit:][:lower:][:upper:][:alpha:][:alnum:]
[:punct:] 表示所有的标点符号
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数
*:匹配其前面的字符任意次,0,1,多次;
.*:匹配任意长度字符任意次
\?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
例如:grep "x\?y"
abxy
aby
xxxxy
yab
\+:匹配前面的字符1次或多次,即前面的字符至少要出现1次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配前面的字符至少m次,至多n次
\{0,n\}:至多n次
\{m,\}:至少m次
位置锚定:
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^$:空白行;
^[[:space:]]*$ 有空格或者无空格的空白行
单词:非特殊字符组成的连续字符都称为单词
\<,\b: 词首锚定,用于单词模式的左侧
\>,\b;词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配完整单词;
练习:
1.显示/etc/passwd文件中不以/bin/bash结尾的行;
grep -v "/bin/bash$" /etc/passwd
2.找出/etc/passwd文件中的两位数和三位数
grep "\<[0-9]\{2,3\}\>" /etc/passwd 这里需要限定为单个单词,否则四位数等也会被匹配到
3.找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面有非空白字符的行;
grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
4.找出“netstat -tan”命令的结果中以“LISTERN"后跟0,1,或多个空白字符结尾的行;
netstat -tan| grep "LISTERN[[:space:]]*$"
分组及引用:
\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理
\(xy\)*ab:
分组括号中的模式匹配到的内容会被正则表达式自动记录到内部变量中,这些变量为:
括号可以嵌套不可以交叉
后向引用,引用前面的分组括号中的模式所匹配到的字符
\1:模式从左侧起,第一个左括号以及匹配的右扩号之间的模式所匹配到的字符
\2:模式从左侧起,第一个左括号以及匹配的右扩号之间的模式所匹配到的字符
或:
a\|ab:a或者ab
\(c\|b\)at: cat或者bat
grep "pattern1 \| pattern2" files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
eg: 找出前后对应的,比如like 对likers
[root@localhost ~]# cat lovers.txt
he lovers his lover
he like his likers
he love his likers
he like his lovers
[root@localhost ~]# grep "\(l..e\).*\1" lovers.txt
he lovers his lover
he like his likers
egrep:
拓展正则表达式元字符:
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符。
[:digit:][:lower:][:upper:][:alpha:][:alnum:]
匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数
*:匹配其前面的字符任意次,0,1,多次;
.*:匹配任意长度字符任意次
?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的;
例如:grep "x?y"
abxy
aby
xxxxy
yab
+:匹配前面的字符1次或多次,即前面的字符至少要出现1次
{m}:匹配其前面的字符m次
{m,n}:匹配前面的字符至少m次,至多n次
{0,n}:至多n次
{m,}:至少m次
位置锚定:
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^$:空白行;
^[[:space:]]*$
单词:非特殊字符组成的连续字符都称为单词
\<,\b: 词首锚定,用于单词模式的左侧
\>,\b;词尾锚定,用于单词模式的右侧
\<PATTERN\>:匹配完整单词;
分组及引用:
():将一个或多个字符捆绑在一起,当做一个整体进行处理
(xy)*ab:
分组括号中的模式匹配到的内容会被正则表达式自动记录到内部变量中,这些变量为:
括号可以嵌套不可以交叉
后向引用,引用前面的分组括号中的模式所匹配到的字符
\1:模式从左侧起,第一个左括号以及匹配的右扩号之间的模式所匹配到的字符
\2:模式从左侧起,第一个左括号以及匹配的右扩号之间的模式所匹配到的字符
或:
a|ab:a或者ab
(c|b)at: cat或者bat
练习:
1.找出/proc/meminfo文件中,所有以大写或者小写s开头的行,至少三种实现方式。
[root@localhost ~]# grep -E "^(S|s)+" /proc/meminfo
[root@localhost ~]# grep "^[Ss]" /proc/meminfo
[root@localhost ~]# grep -i "^s" /proc/meminfo
2.显示当前系统上root,centos或user1用户相关信息;
grep "^\(root\|centos\|user1\)\>" /etc/passwd
3.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
[root@localhost ~]# egrep "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4.使用echo命令输出一条绝对路径,使用egrep取出基名
[root@localhost ~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
相关小命令
取基名
]#basename /PATH/TO/SOMEFILE
SOMEFILE
取路径名
]#dirname /PATH/TO/SOMEFILE
/PATH/TO/
5,找出ifconfig命令结果中的1-255间的数值
[root@localhost ~]# ifconfig | grep -E -o "\b[0-9]|[0-9][0-9]|1[0-9][0-9]|2(0|1|2|3|4)[0-9]|25(0|1|2|3|4|5)\b
6.课外作业:找出ifconfig命令结果中的地址
[root@localhost ~]# ifconfig | grep "\<inet\>"|awk -F' ' '{print $2}' | cut -d: -f2
7.找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
[root@localhost ~]# netstat -tan | grep "\<LISTEN[[:space:]]*"
8.添加用户bash,testbash,basher以及nologin,找出用户名和shell相同的用户
[root@localhost ~]# grep -E "^([^:]+\>).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:2012:2015::/home/bash:/bin/bash
[root@mypc]# ls –l |grep “^d…..x..x” (#查询其他用户和用户组成员有可执行权限的目录集合)
[root@mypc oid2000]# ls –l |grep “^d[d]” (#在一个目录中查询不包含目录的所有文件)
grep的拓展:
-R:选项
grep -R main src就会搜索src目录下所有文件中是否包含 main 这个字符串。因此grep -R "main" *.c 中的 -R 是没有意义的,因为你输入参数是 *.c 而不是目录名字
注意事项:
1.扩展的正则表达式和普通正则表达式不要混着用
2.一定要考虑锚定单个字符或者行首行尾的问题
3.找好恰当的分割符或者表示符号
4.一定要考虑实际情况