通配符和特殊符号

通配符和特殊符号学习

学习通配符或是正则:记住

正则,通配符是为了解决某问题
先是有问题场景,再琢磨如何写通配符
不要先去写奇怪的通配符或是正则,再去琢磨它是什么含义

什么是通配符

当你再查找特定文件名,却记不住如何拼写时,通配符是帮你寻找的神器

通配符是专门用于处理文件名的特殊字符,而不是文件内容

可以方便查找类似,但是不相同的文件名

通配符是shell的内置语法,大部分linux命令都认识通配符

注意:文件一般是不带特殊字符的
基本字符      通配符        模糊搜索的字符内容
wenjie        *              wenjie 1
                             wenjie jie
                             wenjie wenjie

li            ?            liwenjie
                            liwenjie、
                            liwenjie..
                            liwenjie123
                                  

通配符语法

*  匹配任意字符,可以再字符串中使用星号(*)  
“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,bbll

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

练习通配符

[root@bogon ~]# mkdir /test ; cd /test
[root@bogon test]# touch yuchao.txt yuc.txt cc.txt yuchao01.log yuyu.log cc.sh


* 匹配任意字符

找出所有txt结尾的文件
[root@bogon test]# ls *.txt
cc.txt  yuchao.txt  yuc.txt


查看以sh结尾的文件
[root@bogon test]# ls *.sh
cc.sh

查看以yu开头、txt结尾的文件
[root@bogon test]# ls yu*.txt
yuchao.txt  yuc.txt


查看以yu开头、log结尾的文件
[root@bogon test]# ls yu*.log
yuchao01.log  yuyu.log


查看所有以yu开头的文件
[root@bogon test]# ls yu*
yuchao01.log  yuchao.txt  yuc.txt  yuyu.log


找出以c开头的文件
[root@bogon test]# ls c*
cc.sh  cc.txt



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

[root@bogon test]# ls ?.sh
ls: cannot access ?.sh: No such file or directory
这个报错了,为什么?因为没有一个文件叫做 ?.sh

去创建一个
[root@bogon test]# touch  c.sh
[root@bogon test]# ls ?.sh
c.sh
作用不大,只用于特定场景

如何查找特定字符数量的文件?
比如找出sh脚本文件
[root@bogon test]# ls *.sh
cc.sh  c.sh


你只能多写几个问号
[root@bogon test]# ls ?.sh
c.sh
[root@bogon test]# ls ??.sh
cc.sh


找出所有txt
[root@bogon test]# ls ??.txt
cc.txt
[root@bogon test]# ls ??????.txt
yuchao.txt
[root@bogon test]# ls ???.txt
yuc.txt



[ ] 匹配方括号里的内容

创建测试数据

[root@bogon test]# touch  {a..g}.log
[root@bogon test]# ls
a.log  cc.sh   c.log  d.log  f.log  yuchao01.log  yuc.txt
b.log  cc.txt  c.sh   e.log  g.log  yuchao.txt    yuyu.log


找出文件名是a-z之间任意一个字符的txt
[root@bogon test]# ls [a-z].txt
ls: cannot access [a-z].txt: No such file or directory
报错了,因为没有


找出a-z之间任意一个字符的log
[root@bogon test]# ls [a-z].log
a.log  b.log  c.log  d.log  e.log  f.log  g.log


找出a-c之间任意一个字符的log
[root@bogon test]# ls [a-c].log
a.log  b.log  c.log



创建测试数据

[root@bogon test]# touch yu{1..5}.log
[root@bogon test]# touch yc{1..5}.log
[root@bogon test]# ls
a.log  cc.txt  d.log  g.log    yc3.log  yu1.log  yu4.log       yuchao.txt
b.log  c.log   e.log  yc1.log  yc4.log  yu2.log  yu5.log       yuc.txt
cc.sh  c.sh    f.log  yc2.log  yc5.log  yu3.log  yuchao01.log  yuyu.log



找出以yu1  yu2 yu3 相关的log文件
[root@bogon test]# ls yu[1-3].log
yu1.log  yu2.log  yu3.log


找出以y开头相关的log
[root@bogon test]# ls y*.log
yc1.log  yc3.log  yc5.log  yu2.log  yu4.log  yuchao01.log
yc2.log  yc4.log  yu1.log  yu3.log  yu5.log  yuyu.log



只找出文件名是三个字母的log文件
[root@bogon test]# ls [a-z][a-z][a-z0-9].log
yc1.log  yc3.log  yc5.log  yu2.log  yu4.log
yc2.log  yc4.log  yu1.log  yu3.log  yu5.log


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

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

[root@bogon test]# ls [!abcd]*.log
e.log  g.log    yc2.log  yc4.log  yu1.log  yu3.log  yu5.log       yuyu.log
f.log  yc1.log  yc3.log  yc5.log  yu2.log  yu4.log  yuchao01.log

作用同上,必须是连续的数字
[root@bogon test]# ls [!a-d]*.log
e.log  g.log    yc2.log  yc4.log  yu1.log  yu3.log  yu5.log       yuyu.log
f.log  yc1.log  yc3.log  yc5.log  yu2.log  yu4.log  yuchao01.log



找出除了abcd开头的单个字母的log文件
[root@bogon test]# ls [!abcd].log
e.log  f.log  g.log


排除所有以yu开头的文件
[root@bogon test]# ls [!yu]*
a.log  b.log  cc.sh  cc.txt  c.log  c.sh  d.log  e.log  f.log  g.log

排除所有以yu开头的sh文件
[root@bogon test]# ls [!yu]*.sh
cc.sh  c.sh


通配符 find练习

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

[root@bogon ~]# find /etc/ -type f -name '*hosts*'
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny


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

[root@bogon ~]# find /etc/ -type f -name 'ifcfg*'
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens33


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

[root@bogon ~]# find /etc/ -type f -name 'ifcfg*[0-9]'
/etc/sysconfig/network-scripts/ifcfg-ens33


找到系统中的第一块到第四块磁盘,注意磁盘的语法命名
[root@bogon ~]# find /dev  -name 'sd[a-d]'
/dev/sdd
/dev/sdc
/dev/sda
/dev/sdb



注意*是和上面不同的,没分盘,所以只找到了他自己本身
[root@bogon ~]# ls /dev/sdb*
/dev/sdb



通配符练习二

[root@bogon test_shell]# touch {a..h}.log
[root@bogon test_shell]# touch {1..10}.txt
[root@bogon test_shell]# ls 
10.txt  2.txt  4.txt  6.txt  8.txt  a.log  c.log  e.log  g.log
1.txt   3.txt  5.txt  7.txt  9.txt  b.log  d.log  f.log  h.log


找出a到e的log文件

[root@bogon test_shell]# ls [a-e].log
a.log  b.log  c.log  d.log  e.log


找出除了3到5的txt文件

[root@bogon test_shell]# ls [!3-5].txt
1.txt  2.txt  6.txt  7.txt  8.txt  9.txt


找出除了2,5,8,9的txt文件
[root@bogon test_shell]# ls [!2,5,8,9].txt
1.txt  3.txt  4.txt  6.txt  7.txt
同理写法
[root@bogon test_shell]# ls [^2,5,8,9].txt
1.txt  3.txt  4.txt  6.txt  7.txt


找出除了a,e,f的log文件
[root@bogon test_shell]# ls [!a,e,f].log
b.log  c.log  d.log  g.log  h.log
同理写法
[root@bogon test_shell]# ls [^a,e,f].log
b.log  c.log  d.log  g.log  h.log



特殊符号

什么是特殊符号

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

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

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


重定向符号
>     stdout覆盖重定向
>>    stdout追加重定向
<     stdin重定向

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


命令执行
command1 && command2    #command1成功后执行command2

command1 || command2    #command1失败后执行command2

command1 ; command2     #无论command1成功还是失败,后执行command2

\     #转义特殊字符,还原字符原本的含义

$()   #执行小括号里的命令

``    #反引号,和$()作用一样

|     #管道符

{}    #生成序列

引号练习

单引号
例如使用date练习

单引号是无法识别date命令的
[root@bogon test_shell]# date
Sat Apr  9 17:27:52 CST 2022
[root@bogon test_shell]# echo 'date'
date
[root@bogon test_shell]# echo '$(date)'
$(date)
单引号是所见即所得,单引号里面是什么,输入就是什么,没有任何改变,特殊符号也都失去了其他作用。


反引号
反引号中的linux命令是可以执行的,且反引号中只能写可执行的命令
[root@bogon test_shell]# date
Sat Apr  9 17:29:18 CST 2022
[root@bogon test_shell]# echo `date`
Sat Apr 9 17:29:28 CST 2022
[root@bogon test_shell]# echo `pwd`
/test_shell

[root@bogon test_shell]# echo "超哥还得是你啊`echo 超哥`"
超哥还得是你啊超哥

系统会首先执行反引号里的命令,然后再进行下一步的处理




双引号

[root@bogon test_shell]# echo "date"
date
[root@bogon test_shell]# echo "`date`"
Sat Apr  9 17:32:01 CST 2022

[root@bogon test_shell]# echo "$PATH"
/usr/local/mysql/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@bogon test_shell]# name="超哥"
[root@bogon test_shell]# echo "于超老师的外号是$name"
于超老师的外号是超哥

[root@bogon test_shell]# echo "于超老师的外号是$name,当前的linux工作路径是$PWD"
于超老师的外号是超哥,当前的linux工作路径是/test_shell

当输出双引号内的内容时,如果内容里有linux命令,或者变量,特殊转义符等
会优先解析变量,命令,转义字符,然后得到最终的内容


无引号

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

[root@bogon test_shell]# echo 于超老师的外号是 $name
于超老师的外号是 超哥
[root@bogon test_shell]# echo 于超老师的外号是 $name 当前的工作路径是 $PWD
于超老师的外号是 超哥 当前的工作路径是 /test_shell

[root@bogon test_shell]# echo "于超老师的外号是 $name 当前的工作路径是 $PWD"
于超老师的外号是 超哥 当前的工作路径是 /test_shell
[root@bogon test_shell]# echo '于超老师的外号是 $name 当前的工作路径是 $PWD'
于超老师的外号是 $name 当前的工作路径是 $PWD



特殊符号练习

; 分号
表示命令的结束
多个命令之间的分隔符
某些配置文件的注释符
[root@bogon test_shell]# pwd;mkdir hehe;cd hehe;pwd
/test_shell
/test_shell/hehe
[root@bogon hehe]# 


# 符
注释符号
如命令的注释
[root@bogon hehe]# #rm -rf /*
[root@bogon hehe]# #ls /opt
[root@bogon hehe]# #cd //etc

如配置文件的注释符
# nginx.conf

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;



| 管道符
Linux管道符 | 用于传输数据,对linux命令的处理结果再次处理,直到得到最终结果
[root@bogon hehe]# ifconfig |grep inet
        inet 192.168.0.167  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::eb65:9865:3f31:2f68  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>

[root@bogon hehe]# netstat -tunlp |grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1275/sshd           
tcp6       0      0 :::22                   :::*                    LISTEN      1275/sshd           

能一次出结果的命令,尽量不要二次加工,效率并不高


&& 符
创建目录成功后,才执行后面的命令
[root@bogon hehe]# mkdir /chaoge_data && cd /chaoge_data
[root@bogon chaoge_data]#

[root@bogon chaoge_data]# mkdir /chaoge_data && cd /chaoge_data
mkdir: cannot create directory ‘/chaoge_data’: File exists
如果前面命令失败,后面命令不执行

[root@bogon chaoge_data]# mkdir /chaoge_data && pwd
mkdir: cannot create directory ‘/chaoge_data’: File exists


只有前面成功,后面才执行
[root@bogon chaoge_data]# mkdir /chaoge_data2 && pwd
/chaoge_data


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

[root@bogon chaoge_data]# mkdir /chaoge_data || pwd
mkdir: cannot create directory ‘/chaoge_data’: File exists
/chaoge_data


前面成功了,后面不执行
[root@bogon chaoge_data]# mkdir /chaoge_data222 || pwd
[root@bogon chaoge_data]# 



$() 符

引用系统时间,创建文件名,脚本常见做法

[root@bogon chaoge_data]# touch nginx_access_$(date +%F).log
[root@bogon chaoge_data]# 
[root@bogon chaoge_data]# ll
total 0
-rw-r--r--. 1 root root 0 Apr  9 18:20 nginx_access_2022-04-09.log


找到当前的txt文件,然后删掉
[root@bogon test_shell]# rm -f `find . -name '*.txt'`


等同写法
[root@bogon test_shell]# rm -f `find . -name '*.log'`



{} 符

生成连续的数字序列
[root@bogon test_shell]# echo  {1..30}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30


生成字母序列
[root@bogon test_shell]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z


特殊用法,拷贝文件的简写
[root@bogon test_shell]# ll /etc/sysconfig/network-scripts/ifcfg-ens33*
-rw-r--r--. 1 root root 310 Mar  2 15:41 /etc/sysconfig/network-scripts/ifcfg-ens33


作为变量的分隔符

[root@bogon test_shell]# touch  ${name}_`date +%F`.log
[root@bogon test_shell]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr  9 18:09 hehe
-rw-r--r--. 1 root root 0 Apr  9 18:27 超哥_2022-04-09.log



posted @ 2022-04-11 21:19  并不是那么牛  阅读(300)  评论(0)    收藏  举报