通配符和特殊符号

什么是通配符

通配符语法、作用

通配符用于搜索、匹配文件名

| 字符 | 说明 | 示例 | | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | * | 匹配任意字符数。 您可以在字符串中使用星号 (*****)。 | “wh*”将找到 what、white 和 why,但找不到 awhile 或 watch。 | | ? | 在特定位置中匹配单个字母。 | “b?ll ”可以找到 ball、bell 和 bill。 | | [ ] | 匹配方括号中的字符。 | “b[ae]ll”将找到 ball 和 bell,但找不到 bill。 | | ! | 在方括号中排除字符。 | “b[!ae]ll”将找到 bill 和 bull,但找不到 ball 或 bell。“Like “[!a]*””将找到不以字母 a 开头的所有项目。 | | - | 匹配一个范围内的字符。 记住以升序指定字符(A 到 Z,而不是 Z 到 A)。 | “b[a-c]d”将找到 bad、bbd 和 bcd。 | | # | 匹配任意单个数字字符。 | “1#3”将找到 103、113 和 123。 | | ^ | 同感叹号、在方括号中排除字符 | b[^ae]ll,找不到ball,找不到bell,能找到bcll |

* 匹配任意(0或多个)字符串,包括空字符串
? 匹配任意1个字符,且只有一个字符
[abcd] 匹配方括号里的abcd任意一个字符,abcd可以是其他不连续的字符如[aqwd]
[a-z] 匹配方括号里a到z之间的任意一个字符,也可以是连续的数字[1-9]
[!abcd] 不匹配方括号里的任意字符,也可以写为连续的字符,如[!a-z],也就是不匹配a到z任意的一个字符,且!符可以用^替代,写成[^abcd]

练习通配符

创建测试数据

[yuchao-linux-242 root /tmp]#mkdir /test ;cd /test
[yuchao-linux-242 root /test]#
[yuchao-linux-242 root /test]#touch yuchao.txt yuc.txt cc.txt yuchao01.log yuyu.log cc.sh

* 匹配任意字符

找出所有txt结尾的文件


查看以sh结尾的文件


查看以yu开头、txt结尾的文件


查看以yu开头、log结尾的文件


查看所有以yu开头的文件


找出以c开头的文件

? 匹配任意一个字符(用得少)

[yuchao-linux-242 root /test]#ls ?.sh
ls: cannot access ?.sh: No such file or directory
这个报错了,为什么?



如何查找特定字符数量的文件?
比如找出sh脚本文件


你只能多写几个问号


再比如找出所有txt


[] 匹配方括号里的内容

语法

[a,b,c]
[a-z]
[A-Z]
[a-zA-Z]
[1,3,4,7]
[0-9]
[a-zA-Z0-9]

实践

创建测试数据,如
[yuchao-linux-242 root /test]#touch {a..g}.log
[yuchao-linux-242 root /test]#ls
a.log  b.log  cc.sh  cc.txt  c.log  c.sh  d.log  e.log  f.log  g.log  yuchao01.log  yuchao.txt  yuc.txt  yuyu.log
[yuchao-linux-242 root /test]#


找出文件名是a-z之间任意一个字符的txt
为什么出错?
[yuchao-linux-242 root /test]#ls [a-z].txt
ls: cannot access [a-z].txt: No such file or directory



找出a-z之间任意一个字符的log


找出a-c之间任意一个字符的log



创建测试数据
touch yu{1..5}.log
touch yc{1..5}.log



找出以yu1  yu2 yu3 相关的log文件



找出以y开头相关的log


找出所有yu、yc相关的log文件

[!abcd] 取反方括号的内容

语法

[!a,b,c,d]
同上
[^abcd]

练习

[yuchao-linux-242 root /test]#ls
a.log  cc.sh   c.log  d.log  f.log  yc1.log  yc3.log  yc5.log  yu2.log  yu4.log  yuchao01.log  yuc.txt
b.log  cc.txt  c.sh   e.log  g.log  yc2.log  yc4.log  yu1.log  yu3.log  yu5.log  yuchao.txt    yuyu.log


找出除了以abcd开头的所有log文件


找出除了abcd开头的单个字母的log文件



排除所有以yu开头的文件

排除所有以yu开头的sh文件

2.通配符 find 综合练习

搜索/etc下所有包含hosts相关字符的文件



搜索/etc下的以ifcfg开头的文件(网卡配置文件)



只查找以数字结尾的网卡配置文件


找到系统中的第一块到第四块磁盘,注意磁盘的语法命名


找找sdb硬盘有几个分区,2种写法

注意*是和上面不同的

3.通配符练习二

测试数据源准备
[yuchao-linux01 root ~/test_shell]$touch {a..h}.log
[yuchao-linux01 root ~/test_shell]$touch {1..10}.txt




找出a到e的log文件



找出除了3到5的txt文件


找出除了2,5,8,9的txt文件

使用! 和^ 两个写法




找出除了a,e,f的log文件


4.特殊符号

什么是特殊符号

比起通配符来说,linux的特殊符号更加杂乱无章,但是一个专业的linux运维
孰能生巧,这些都不是问题

路径相关

| 符号 | 作用 | | ---- | ------------------------------------------ | | ~ | 当前登录用户的家目录 | | - | 上一次工作路径 | | . | 当前工作路径,或表示隐藏文件 .yuchao.linux | | .. | 上一级目录 |

引号相关

'' 单引号、所见即所得
"" 双引号、可以解析变量及引用命令
`` 反引号、可以解析命令
     无引号,一般我们都省略了双引号去写linux命令,但是会有歧义,比如空格,建议写引号

重定向符号

>          stdout覆盖重定向
>>         stdout追加重定向

<            stdin重定向

2>   stderr重定向
2>>  stderr追加重定向

命令执行

command1 && command2      #  command1成功后执行command2
command1 || command2      #  command1失败后执行command2
command1 ; command2         #  无论command1成功还是失败、后执行command2
\                # 转义特殊字符,还原字符原本含义
$()            # 执行小括号里的命令
``     # 反引号,和$()作用一样
|             # 管道符
{}         # 生成序列

5.引号练习

单引号

例如使用date练习

单引号是无法识别date命令的

反引号

反引号中的linux命令是可以执行的,且反引号中只能写可执行的命令

双引号

当输出双引号内的内容是,如果内容里有linux命令、或者变量、特殊转义符等

会优先解析变量、命令、转义字符,然后得到最终的内容

无引号

没有引号、很难确定字符串的边界,很容易出现各种故障

6.特殊符号练习

重定向符号

之前讲过重定向符号、以及数据流的结合用,这里就不重复了。

; 分号

# 符

| 管道符

如生活中的管道,能够传输物质

Linux管道符 | 用于传输数据,对linux命令的处理结果再次处理,直到得到最终结果

&& 符

前面成功、继续后面

|| 符

只有前面命令失败、才执行后面命令

$() 符

创建文件,以及系统时间命名

{} 符

生成序列符号

拷贝文件的便捷写法

变量分隔符

${var_name}