通配符与正则表达式的区别
- 说通配符一般只用于文件名匹配,它是由shell解析的,比如find,ls,cp,mv等。
- 正则表达式是用来匹配字符串的,针对文件内容的文本过滤工具里,大都用到正则表达式,如vi,grep,awk,sed等。简单点来说,正则表达式是对一组正在处理的文本的描述。
- 通配符和正则表达式看起来有点像,不能混淆。可以简单的理解为通配符只有*,?,[],{}这4种,而正则表达式复杂多了。
常见通配符
* //代表0个或无穷多个任意字符
? //代表一定有一个任意字符
[ ] //一定有一个在括号内,如[abc]匹配abc任意一个字母
[ - ] //在编码顺序内的所有字符,如 [0-9] 代表 0 到 9 之间的所有数字
[^ ] //表示『反向选择』,[^abc]匹配任意一个非abc的字母
{str1,str2} //匹配其中任意一个字符串
//通配符可以与任一个使用文件名为参数的命令一起使用
ls ./h* //表示列出当前目录以h开头的所有文件
ls -d ./????? //列出当前目录下目录名长度为5的所有目录
find b*.txt //匹配b开头,txt结尾的文件
[abc] //匹配abc任一个开头的文件
a{abc,xyz,123}b //列出aabcb,axyzb,a123b
= 设定变量
$ 取变量值或取运算值
> 重定向 stdout
< 重定向 stdin
| 管道符号
& 重导向 file descriptor ,或将命令置于背景执行
( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换
{ } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围
; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令
&& 在前一个命令结束时,若返回值为 true,继续执行下一个命令
|| 在前一个命令结束时,若返回值为 false,继续执行下一个命令
! 运算意义上的非(not)的意思
# 注释,常用在脚本中
\ 转移字符,去除其后紧跟的元字符或通配符的特殊意义
常见正则表达式
^ 指向一行的开头
$ 指向一行的结尾
. 任意单个字符
[] 字符范围。如[a-z]
? 最多一次
* 必须匹配0次或多次
+ 必须匹配1次或多次
{n} 必须匹配n次
{n,} 必须匹配n次或以上
{n,m} 匹配次数在n到m之间,包括边界
//在文件中搜寻特定字符串 将文件中包含like的行输出
//显示行号 并突出like的颜色
grep -n --color=auto like a.txt
//寻找包含good或food的行
grep -n '[fg]ood' a.txt
//只搜寻以food结尾的行
grep -n 'food$' a.txt
//只搜寻以good开头的行
grep -n '^food' a.txt
//fd之间可以有两个o或三个o
grep -n 'fo\{2,3\}d' a.txt