命令行的通配符
通配符有点类似于正则表达式,可以代替某些字符。
linux中通配符及其含义:
通配符 | 含义 |
---|---|
* | 任意字符 |
? | 单个任意字符 |
[a-z] | 单个小写字母 |
[A-Z] | 单个大写字母 |
[a-Z] | 单个字母 |
[0-9] | 单个数字 |
[[:alpha:]] | 任意字母 |
[[:upper:]] | 任意大写字母 |
[[:lower:]] | 任意小写字母 |
[[:digit:]] | 所有数字 |
[[:alnum:]] | 任意字母加数字 |
[[:punct:]] | 标点符号 |
在/dev目录下找到以sda开头的文件:
[root@linuxprobe ~]# ll /dev/sda*
brw-rw----. 1 root disk 8, 0 Sep 21 17:15 /dev/sda
brw-rw----. 1 root disk 8, 1 Sep 21 17:15 /dev/sda1
brw-rw----. 1 root disk 8, 2 Sep 21 17:15 /dev/sda2
[root@linuxprobe ~]#
如果我想匹配的式sda后面有一个字符的:
[root@linuxprobe ~]# ll /dev/sda?
brw-rw----. 1 root disk 8, 1 Sep 22 10:53 /dev/sda1
brw-rw----. 1 root disk 8, 2 Sep 22 10:53 /dev/sda2
如果我只想匹配数字:
[root@linuxprobe ~]# ll /dev/sda[0-9]
brw-rw----. 1 root disk 8, 1 Sep 22 10:53 /dev/sda1
brw-rw----. 1 root disk 8, 2 Sep 22 10:53 /dev/sda2
将文本的字母内容全部换成大写:
[root@linuxprobe ~]# cat initial-setup-ks.cfg | tr a-z A-Z
#VERSION=RHEL8
# X WINDOW SYSTEM CONFIGURATION INFORMATION
XCONFIG --STARTXONBOOT
# LICENSE AGREEMENT
EULA --AGREED
# USE GRAPHICAL INSTALL
GRAPHICAL
# NETWORK INFORMATION
NETWORK --BOOTPROTO=DHCP --DEVICE=ENS160 --ONBOOT=OFF --IPV6=AUTO --ACTIVATE
NETWORK --BOOTPROTO=DHCP --HOSTNAME=LINUXPROBE.COM
——————以下信息省略——————
这里的a-z A-z 也可以替换成[:lower:] [:upper:]
除了用在查看文本上面,通配符还能用在创建文件上面,可以一次性创建多个文件:
[root@linuxprobe ~]# touch {Afile.txt,Bfile.txt,Cfile.txt}
[root@linuxprobe ~]# ll *file.txt
-rw-r--r--. 1 root root 0 Sep 22 11:23 Afile.txt
-rw-r--r--. 1 root root 0 Sep 22 11:23 Bfile.txt
-rw-r--r--. 1 root root 0 Sep 22 11:23 Cfile.txt
还可以输出一些特定的信息:
[root@linuxprobe ~]# echo file{1,2,3,4,5,6,7}
file1 file2 file3 file4 file5 file6 file7
常用转义字符
除了通配符,转义字符也可以用来处理特殊数据,可以灵活的使用变量,命令执行结果。
4个常见的转义符:
- 反斜杠(\):使反斜杠后面的变量变为普通的字符串
- 单引号(‘’):转义其中的所有变量变为普通的字符串
- 双引号(“”):保留其中的变量属性,不进行转义处理
- 反引号(``):把其中的命令执行后的结果返回
我们先定以一个变量,然后使用双引号输出:
[root@linuxprobe ~]# PRICE=5
[root@linuxprobe ~]# echo "price is $PRICE"
price is 5
如果我们想要输出price is $5怎么办?这样吗?
[root@linuxprobe ~]# echo "price $$PRICE"
price 2791PRICE
这是个什么东西?怎么跟我们想的不一样?原来$$的作用是显示当前程序的进程号码,刚好冲突了,我们需要另外想办法。
使用反斜杠来转义就好了:
[root@linuxprobe ~]# echo "price is \$$PRICE"
price is $5
[root@linuxprobe ~]#
来试试反引号的作用:
[root@linuxprobe ~]# echo `uname -a`
Linux linuxprobe.com 4.18.0-80.el8.x86_64 #1 SMP Wed Mar 13 12:02:46 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@linuxprobe ~]# uname -a
其实对于双引号来说,我们不加双引号也是同样的效果:
[root@linuxprobe ~]# echo AA BB CC
AA BB CC
[root@linuxprobe ~]# echo "AA BB CC"
AA BB CC
那么我们如何区分呢?这跟命令的参数有关,比如第一个命令,我们就不知道它的参数到底有几个,是一个还是三个。基于这种情况,我们对有空格的参数最好加上双引号