CentOS-7 系统特殊符号和通配符

477 阅读4分钟

1. 与路径有关的特殊符号

1.1 波浪线 ~

代表用户的家目录,普通用户为 /home/username,root 用户为 /root

[admin@node ~]$ cd ~
[admin@node ~]$ pwd
/home/admin

[root@node ~]# cd ~
[root@node ~]# pwd
/root

1.2 中划线 -

代表用户所在的上一个目录

$ pwd
/home/admin
$ cd /tmp
$ cd /opt

$ cd - 
/tmp

$ cd -
/opt

说明:- 其实是引用了 OLDPWD 这个环境变量中记录的上一级目录

[admin@node ~]$ echo $OLDPWD
/tmp

1.3 点 .

代表当前目录

$ pwd
/home/admin

$ cd .
$ pwd
/home/admin

$ find . -type f 
./.bash_logout
./.bash_profile
./.bashrc
./.bash_history
./.zinc/0.3.15/compiler-interface-2.11.12-52.0/compiler-interface.jar
./log.txt
./.viminfo
./err.txt
./file.txt

1.4 双点 ..

代表上一级目录

[admin@node ~]$ mkdir dir
[admin@node ~]$ cd dir
[admin@node dir]$ pwd
/home/admin/dir
[admin@node dir]$ cd ..
[admin@node ~]$ pwd
/home/admin

2. 引号系列

2.1 反引号 ` 和 $()

作用:当待处理的字符串用反引号引起来的时候,系统会首先将反引号里的字符串当做命令进行解析。

$ date
Sun Jul  2 14:54:27 CST 2023

$ echo date
date

$ echo `date`
Sun Jul 2 14:54:40 CST 2023

$ echo `aa`
-bash: aa: command not found

$ touch `date +%F`.txt
$ ls
2023-07-02.txt

$ ls -l `which cat`
-rwxr-xr-x 1 root root 54080 Nov 17  2020 /usr/bin/cat

# 反引号与 $() 的作用相同
$ echo $(date)
Sun Jul 2 14:57:28 CST 2023

2.2 单引号 '

特点:强引用,输出的信息“所见即所得”。

$ echo '$LANG'
$LANG

$ echo '`date`'
`date`

2.3 双引号 "

特点:弱引用,如果双引号中的内容有变量的引用、反引号括着的命令、转义字符,则要先把变量、命令和转义字符解析出结果,然后再输出最终内容。

$ echo "$LANG"
en_US.UTF-8

$ echo "`date`"
Sun Jul  2 15:02:38 CST 2023

2.4 无引号

无引号,和双引号的作用类似,但是由于没有引号,很难确定字符串的边界,因为操作很容易出现各种未知的错误。

$ echo "today is `date +%F`"
today is 2023-07-02
$ echo today is `date +%F`
today is 2023-07-02

$ touch hello world.txt
$ ll
-rw-rw-r-- 1 admin admin  0 Jul  2 15:08 hello
-rw-rw-r-- 1 admin admin  0 Jul  2 15:08 world.txt


$ touch "hello world.txt"
$ ll
-rw-rw-r-- 1 admin admin  0 Jul  2 15:08 hello
-rw-rw-r-- 1 admin admin  0 Jul  2 15:08 hello world.txt
-rw-rw-r-- 1 admin admin  0 Jul  2 15:08 world.txt

注意:双引号无法识别有些通配符的信息,这是只能使用无引号

$ echo "{1..3}"
{1..3}
$ echo {1..3}
1 2 3

3. 重定向符号

标准输入(stdin),代码:0

标准输出(stdout),代码:1

标准错误输出(stderr),代码:2

# 标准输出重定向
# 覆盖写
$ echo hello 1>log.txt
$ cat log.txt 
hello
$ echo world 1>log.txt 
$ cat log.txt 
world
$ echo nihao 1>>log.txt
$ cat log.txt 
world
nihao
# 代码 1 可以省略
$ echo mmm >log.txt
$ echo nnn >>log.txt
mmm
nnn

# 标准错误输出重定向
$ cho 2>err.txt 
$ cat err.txt 
-bash: cho: command not found

# 将标准输出和标准错误输出输出(覆盖)到不同文件中
$ echo "stdout" 1>stdout.txt 2>stderr.txt
$ cat stdout.txt 
stdout
$ ech "stdout" 1>stdout.txt 2>stderr.txt
$ cat stderr.txt
-bash: ech: command not found

# 将标准输出和标准错误输出输出(以追加为例)到一个文件中的 3 种方法
$ echo "stdout and stderr" 1>>echo.log 2>>echo.log
# 这个命令的意思是,将标准错误输出重定向到标准输出,标准输出重定向到文件中
$ echo "stdout and stderr" >>echo.log 2>&1
$ echo "stdout and stderr" &>>echo.log

# 标准输入重定向
# 将标准输入重定向到 stdout.txt,即将 stdout.txt文件中的内容作为输入,然后输出到标准输出
$ echo 1 2 3 > stdout.txt
$ cat 0<stdout.txt 
1 2 3
# 0 可以省略
$ cat <stdout.txt 
1 2 3

# 标准输入重定向案例1:将文件中内容作为标准输入,替换空格为换行符
$ tr " " "\n" <stdout.txt 
1
2
3

# 标准输入重定向案例2:将文件中内容作为标准输入,传递给 xargs 参数进行转换
$ xargs -n 1 <stdout.txt
1
2
3

# 标准输入重定向案例3:使用标准输入重定向功能发送邮件
# mail?-s '邮件标题内容' 收件人地址 <邮件内容
$ mail?-s '服务器hosts文件内容' tom@qq.com </etc/hosts

# 标准输入重定向案例4:向文件中写入多行内容
~ cat >file.txt <<EOF
> Hello World
> Hello Linux
> EOF

4. 逻辑操作符

选项说明
&&前一个命令执行成功,再执行后一个命令
||前一个命令执行失败,再执行后一个命令
!取反
# 创建 ~/dir3 目录并且在该目录下创建一个 log.txt 文件
# 在创建目录成功后,再创建文件
mkdir -p ~/dir3 && touch ~/dir3/log.txt
# 无论前一条命令执行成功与否,后一条命令都会执行
mkdir -p ~/dir3 ; touch ~/dir3/log.txt

$ cho "执行成功" && echo "执行失败"
-bash: cho: command not found

$ cho "执行成功" || echo "执行失败"
-bash: cho: command not found
执行失败

# 取反
# 在当前目录下查找修改时间比 file1.txt 新但比 file2.txt 旧的文件
$ find . -newer file1.txt ! -newer file2.txt

5. 其他特殊符号

5.1 美元符 $

作用一:普通用户的命令提示符

命令提示符.png

命令之前的一整个字符串称作命令提示符,即:[admin@node ~]$ 是一个命令提示符,其中:

  • admin 是当前登录的用户名
  • node 是主机名
  • @ 是用户名和主机名之间的分隔符
  • ~ 代表目前所在的目录是用户的家目录,如果不是用户的家目录,就是显示上一级目录名
  • $ 是普通用户命令提示符的结尾符,root 用户命令提示符的结尾符号是 #

作用二:取出变量中的内容

$ VAR=123
$ echo $VAR
123

作用三:awk 命令取出指定列的信息

$ cat hello.txt 
Hello World

$ awk '{print $2}' hello.txt 
World

5.2 感叹号 !

作用一:表示取反或者排除

# 在当前目录下查找修改时间比 file1.txt 新但比 file2.txt 旧的文件
$ find . -newer file1.txt ! -newer file2.txt

作用二:取出最近的命令并执行

[admin@node ~]$ ls .
dir  err.txt  file.txt  log.txt
[admin@node ~]$ ls -l .
total 8
drwxrwxr-x 2 admin admin  6 Jul  2 16:25 dir
-rw-rw-r-- 1 admin admin 30 Jul  2 16:01 err.txt
-rw-rw-r-- 1 admin admin 24 Jul  2 16:13 file.txt
-rw-rw-r-- 1 admin admin  0 Jul  2 16:00 log.txt

# 找出最近一次以 ls 开头的命令并运行
[admin@node ~]$ !ls
ls -l .
total 8
drwxrwxr-x 2 admin admin  6 Jul  2 16:25 dir
-rw-rw-r-- 1 admin admin 30 Jul  2 16:01 err.txt
-rw-rw-r-- 1 admin admin 24 Jul  2 16:13 file.txt
-rw-rw-r-- 1 admin admin  0 Jul  2 16:00 log.txt

作用三:表示强制操作处理

vim 编辑文件后,使用 wq! 强制保存并退出,使用 q! 强制退出。

5.3 管道符 |

管道符:在命令和命令之间需要用管道符衔来处理数据流,常与 xargs 命令一起使用。

注意: 管道符虽然使用方便,但效率不高,执行命令时能一次出结果就不要使用管道符多次处理。

案例1:找到符合条件的文件进行删除

find / -type f -name "app_log*.log" | xargs rm
find / -type f -name "app_log*.log" -exec rm -rf {} \;
find / -type f -name "app_log*.log" -delete

说明:xargs 命令后面的命令会自动使用原始命令而不用别名,所以执行 rm 命令不需要加 -f 选项也没有打印确认信息。

案例2:找到符合条件的文件进行移动

find / -type f -name "app_log*.log" | xargs -i mv {} /tmp
find / -type f -name "app_log*.log" | xargs mv -t /tmp
find / -type f -name "app_log*.log" -exec mv {} /tmp \;

5.4 井号 #

作用一:root 用户的命令提示符

[root@node ~]#
[admin@node ~]$

作用二:注释

[admin@node ~]$ cat /etc/selinux/config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

5.5 分号 ;

如果需要一次执行多条命令,可以在命令之间使用 ; 连接。

$ echo "执行命令 pwd 开始" ; pwd ; echo "执行命令 pwd 结束"
执行命令 pwd 开始
/home/admin
执行命令 pwd 结束

5.6 大括号 {}

作用一:生成序列

$ echo {1..3}
1 2 3
$ echo {a..c}
a b c
$ echo A{1..3}
A1 A2 A3
# 逗号分隔,列出来
$ echo {h,e,l,l,o}
h e l l o
$ echo A{,B}
A AB

# 生成的序列补零
$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
$ echo {01..100}
001 002 003 004 005 ... 100

# 设置步长
$ echo {1..10..2}
1 3 5 7 9
$ echo {2..10..2}
2 4 6 8 10

# 组合序列
$ echo {a..c}{1..2}
a1 a2 b1 b2 c1 c2
$ echo {a..b}{1..2}{c..d}
a1c a1d a2c a2d b1c b1d b2c b2d

应用:快速备份文件

$ sudo cp /etc/ssh/sshd_config{,.bak}

$ ls /etc/ssh | grep sshd_config
sshd_config
sshd_config.bak

# 还原
sudo mv /etc/ssh/sshd_config{.bak,}

作用二:变量分隔符

$ str="hello"
$ echo $str_world

$ echo ${str}_world
hello_world

5.8 &

待完善

6. 通配符

通配符通常用于基于模糊匹配的规则来查找文件,通配符是 bash 的内置功能,几乎适用于所有的 Linux 命令。

6.1 *

匹配任意字符(0个或多个,包括空字符串)

$ ls
dir  dir3  err.txt  file.txt  log.txt

$ rm -f *.txt

$ ls
dir  dir3

6.2 ?

匹配任意一个字符

$ touch a.txt aa.txt aaa.txt

$ ls ?.txt
a.txt

$ ls ??.txt
aa.txt

$ ls ???.txt
aaa.txt

6.3 []

作用:匹配中括号的任意一个字符

$ ls
a.txt  c.txt  e.txt  g.txt  i.txt  k.txt  m.txt  o.txt  q.txt  s.txt  u.txt  w.txt  y.txt
b.txt  d.txt  f.txt  h.txt  j.txt  l.txt  n.txt  p.txt  r.txt  t.txt  v.txt  x.txt  z.txt

# 匹配 abc 这 3 个字符中的任意一个字符
$ ls [abc].txt
a.txt  b.txt  c.txt

# 匹配 a-g 这个范围内的字符中的任意一个字符
$ ls [a-g].txt
a.txt  b.txt  c.txt  d.txt  e.txt  f.txt  g.txt

6.4 取反 ! 和 ^

# 匹配除 abc 这 3 个字符外的任意一个字符
$ ls [!abc].txt
d.txt  f.txt  h.txt  j.txt  l.txt  n.txt  p.txt  r.txt  t.txt  v.txt  x.txt  z.txt
e.txt  g.txt  i.txt  k.txt  m.txt  o.txt  q.txt  s.txt  u.txt  w.txt  y.txt
$ ls [^abc].txt
d.txt  f.txt  h.txt  j.txt  l.txt  n.txt  p.txt  r.txt  t.txt  v.txt  x.txt  z.txt
e.txt  g.txt  i.txt  k.txt  m.txt  o.txt  q.txt  s.txt  u.txt  w.txt  y.txt

# 匹配在 [a-w] 这个范围之外的任意一个字符
$ ls [!a-w].txt
x.txt  y.txt  z.txt
$ ls [^a-w].txt
x.txt  y.txt  z.txt

练习:在 /etc 目录下查找文件,要求文件名的第一个字符是任意字符,第二个字符是 o、p、q 这 3 个字符中的任意一个,第三个字符不能是 a-r 之间的任意一个,结尾是 ts。

find /etc -type f -name "?[opq][^a-r]ts"