通配符和特殊符号

通配符和特殊符号学习

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

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

什么是通配符

当你再查找特定文件名,却记不住如何拼写时,通配符是帮你寻找的神器
通配符是专门用于处理文件名的特殊字符,而不是文件内容
可以方便查找类似,但是不相同的文件名
通配符是shell的内置语法,大部分linux命令都认识通配符
注意:文件一般是不带特殊字符的
基本字符 通配符 模糊搜索的字符内容
wenjie * wenjie 1
wenjie jie
wenjie wenjie
li ? liwenjie
liwenjie、
liwenjie..
liwenjie123

通配符语法

* 匹配任意字符,可以再字符串中使用星号(*)
wh*”将找到 whatwhitewhy,但是找不到awhile或者是watch
? 在特定位置中匹配单个字母
b?ll” 可以找到ballbellbill
[] 匹配方括号中的字符
b[ae]ll” 将找到ballbell,但找不到bill
! 在方括号中排除字符
b[!ae]ll” 将找到billbull,但找不到ballbell
Like[!a]*”” 将找到不到以字母a开头的所以项目
- 匹配一个范围内的字符,记住以升序指定字符(AZ,而不是ZA
b[a-c]d” 将找到badbbdbcd
# 匹配任意单个数字字符
1#3” 将找到 103113123
^ 同感叹号,在方括号中排除字符
b[^ae]ll 找不到ball,找不到bell,能找到bcllbbll
* 匹配任意(0或多个)字符串,包括空字符串
? 匹配任意1个字符,且只有一个字符
[abcd] 匹配方括号里的abcd任意一个字符,abcd可以是其他不连续的字符如[aqwd]
[a-z] 匹配方括号里az之间的任意一个字符,也可以是连续的数字[1-9]
[!abcd] 不匹配方括号里的任意字符,也可以写为连续的字符,如[!a-z],也就是不匹配az任意的一个字符,且!符可以用^替代,写成[^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
找出除了35的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 @   并不是那么牛  阅读(252)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示