通配符和特殊符号

为什么学通配符

一、为什么要学习通配符?

  1. 提高文件搜索效率
    • 在计算机的文件系统中,当你需要查找一批具有相似文件名的文件时,通配符能发挥巨大作用。例如,你有一系列的文档文件,名字分别是“报告1.docx”、“报告2.docx”、“报告3.docx”等。如果想一次性找到所有这些报告文件,使用通配符(如“报告*.docx”)可以快速定位它们,而不用逐个输入文件名进行搜索。
  2. 文本处理和编辑便捷性
    • 在文本编辑器或者编程环境中,通配符可以用于匹配和操作大量相似的文本内容。比如在处理大量的日志文件时,你可能需要查找所有包含某个特定错误代码(如“ERROR - 404”)的行,通过通配符可以方便地构建搜索模式,快速定位到相关内容,然后进行修改、统计等操作。
  3. 编程中的模式匹配
    • 在编程领域,通配符用于字符串处理和模式匹配。以正则表达式为例(正则表达式中有多种通配符的用法),它可以用于验证用户输入的数据是否符合特定格式。例如,验证用户输入的电子邮件地址是否有效。通过使用通配符模式,程序可以检查输入的字符串是否具有类似“[用户名]@[域名].[后缀]”的格式,从而提高程序的健壮性和数据的准确性。

二、什么是通配符?

通配符是一种特殊字符,主要用于代替一个或多个字符。在不同的环境(如操作系统的文件搜索、文本编辑器、数据库查询语言等)下,通配符的具体规则和使用方式可能会有所不同。

  1. 常见的通配符类型
    • 星号(*):在许多系统中,星号是最常用的通配符。它可以代表零个、一个或多个字符。例如,在文件搜索中,“.txt”表示匹配所有以“.txt”为扩展名的文件,文件名部分可以是任意长度的字符串(包括空字符串)。在文本处理中,如果要查找所有以“a”开头的单词,可以使用“a”这样的模式。
    • 问号(?):问号通配符通常代表一个单个字符。例如,在文件搜索中,“file?.txt”可以匹配“file1.txt”、“file2.txt”等,但不能匹配“file11.txt”,因为问号只能代表一个字符。
    • 在正则表达式中还有更多复杂的通配符,如“[ ]”(用于匹配方括号内的任意一个字符)、“^”(用于匹配字符串的开头)、“$”(用于匹配字符串的结尾)等。例如,“[abc]”可以匹配“a”、“b”或者“c”;“^hello”可以匹配以“hello”开头的字符串;“world$”可以匹配以“world”结尾的字符串。

三、怎么学习通配符?

  1. 熟悉使用场景
    • 先确定你要在哪个环境中使用通配符,是操作系统的文件搜索(如Windows的资源管理器搜索功能、Linux的命令行文件搜索)、文本编辑器(如Notepad++、Sublime Text等)还是编程环境(如Python中的re模块用于正则表达式)。了解不同环境下通配符的支持程度和具体规则。
    • 例如,在Windows资源管理器的搜索框中,你可以使用星号和问号通配符来查找文件。而在Linux命令行中,像“ls”命令结合通配符可以列出符合特定模式的文件,如“ls *.c”会列出当前目录下所有以“.c”为扩展名的文件。
  2. 学习基本语法规则
    • 从简单的通配符开始学起,如星号和问号。掌握它们在不同环境下如何代表字符。
    • 以文本处理为例,假设你有一个文本文件,内容是很多单词,每行一个单词。如果你想找到所有长度为5个字符的单词,在一些支持简单通配符的文本编辑器中,你可以使用“?????”作为搜索模式,编辑器会找到所有符合这个长度的单词。
    • 然后学习更复杂的正则表达式通配符(如果需要在编程或者高级文本处理中使用)。可以通过阅读相关的文档或者教程,学习“[ ]”、“^”、“$”等字符的用法。例如,学习如何用“^[A - Z]”来匹配以大写字母开头的字符串。
  3. 实践操作
    • 进行大量的练习,在文件搜索中,尝试用通配符搜索不同类型的文件。例如,在你的计算机存储照片的文件夹中,用“.jpg”和“ - 旅游.jpg”等模式来搜索照片,观察匹配的结果。
    • 在文本处理中,找一些简单的文本文件,如小说、新闻稿等。用通配符查找特定的词汇模式。比如,在一部小说文件中,使用“[A - Z][a - z]+”这样的正则表达式通配符模式(在支持正则表达式的文本编辑器中)来查找所有的英文单词(假设小说中有英文内容),看看是否能够准确地匹配。
    • 在编程环境中,通过编写一些简单的程序来巩固通配符(特别是正则表达式)的知识。例如,在Python中,使用“re”模块来验证用户输入的手机号码是否符合正确的格式(假设手机号码格式是固定的,如11位数字,开头是1等),可以通过编写如下代码来实现:
      import re
      phone_number = input("请输入手机号码:")
      pattern = "^1[3 - 9]\d{9}$"
      if re.match(pattern, phone_number):
        print("手机号码格式正确")
      else:
        print("手机号码格式错误")
      
  4. 参考资料学习
    • 阅读操作系统的用户手册,如Linux系统的“man”命令文档,其中有关于文件搜索通配符的详细介绍。对于文本编辑器,查看编辑器自带的帮助文档,许多文本编辑器都有关于查找和替换功能中如何使用通配符的部分。
    • 在网上有很多关于通配符学习的资源,包括博客文章、教程视频等。例如,在一些知名的编程学习网站上,有专门针对正则表达式通配符的教程,从基础语法到高级应用案例都有详细讲解。

通配符

首先,以于超老师的的编程经验告诉新人,学通配符,或是正则,请记住

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

什么是通配符

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

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

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

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

基本字符 通配符 模糊匹配的字符内容
yu * yuchao
yucccc
yuuuuuuu
yuddididididi
chao ? chaog
?? chao1
??? chao-
chao.
chao_

注意,文件名一般是不带特殊字符的

通配符语法

  1. 星号(*)通配符语法
    • 在文件搜索和许多文本处理场景中,星号代表零个、一个或多个字符。
    • 例如,在操作系统的文件搜索中,如果要查找所有扩展名为“.pdf”的文件,无论文件名是什么,都可以使用“.pdf”作为搜索条件。这里的“”表示文件名部分可以是任意长度的字符串(包括空字符串)。如果是在文本处理软件中查找以某个单词开头的句子,比如以“The”开头的句子,在支持简单通配符的软件中可以使用“The*”作为查找模式。
    • 在一些数据库查询语言中,星号也有类似的作用。例如在SQL的“SELECT”语句中,“SELECT FROM table_name”表示选择表“table_name”中的所有列。这里的“”是对列的一种通配,表示全部列。
  2. 问号(?)通配符语法
    • 问号通常代表一个单个字符。
    • 在文件搜索中,如“file?.txt”可以匹配“file1.txt”、“file2.txt”等,因为“?”只代表一个字符位置。如果文件名是“file11.txt”,则不符合这个模式。在文本处理中,如果想查找三个字符的单词,且第二个字符是“a”,可以使用“?a?”作为查找模式。
  3. 方括号([ ])通配符语法(常用于正则表达式)
    • 方括号用于,匹配方括号内的,任意一个字符。
    • ``
    • 例如,“[abc]”可以匹配“a”、“b”或者“c”。可以通过范围来指定更多的字符,如“[a - z]”匹配所有小写字母,“[A - Z]”匹配所有大写字母,“[0 - 9]”匹配所有数字。更复杂的用法可以是组合不同的范围和单个字符,如“[a - zA - Z0 - 9]”匹配所有字母和数字。
    • 还可以使用否定形式,在方括号内的开头加上“^”符号来表示不匹配方括号内的字符。例如,“abc”表示不匹配“a”、“b”和“c”的任何一个字符。
  4. 脱字符(^)通配符语法(常用于正则表达式)
    • 当用于字符串开头时,脱字符用于匹配字符串的开头。
    • 例如,“^Hello”可以匹配以“Hello”开头的字符串。如果有一个文本文件,里面有多行文字,使用支持正则表达式的工具查找“^The”,就会找到所有以“The”开头的行。在某些编程语言的正则表达式模块中,这个字符的用法可能会根据具体的函数和上下文略有不同,但基本的含义是用于定位字符串的开头。
  5. 美元符号($)通配符语法(常用于正则表达式)
    • 用于匹配字符串的结尾。
    • 例如,“world$”可以匹配以“world”结尾的字符串。如果要检查一个句子是否以“.”结尾,可以使用“.$”作为正则表达式模式。在编程环境中,比如在Python的正则表达式模块“re”中,当使用“re.search”等函数时,这个符号能帮助精准地定位到符合条件的字符串结尾部分。
  6. 点号(.)通配符语法(常用于正则表达式)
    • 在正则表达式中,点号代表除换行符之外的任意一个字符。
    • 例如,“a.c”可以匹配“abc”、“a1c”等,只要中间是一个字符就行。但是如果想匹配真正的点号字符,在正则表达式中需要对其进行转义,通常是使用“.”来表示真正的点号。例如,要匹配一个网址中的“.”,如“www.example.com”,如果要精确匹配这个网址结构,可能会使用类似“www.[a - zA - Z0 - 9]+.com”这样的正则表达式模式,其中“.”就是对真正点号的转义。
字符 说明 示例
* 匹配任意字符数。 您可以在字符串中使用星号 (*)。 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。
^ 同感叹号、在方括号中排除字符 b[^ae]ll,找不到ball,找不到bell,能找到bcll
* 匹配任意(0或多个)字符串,包括空字符串
? 匹配任意1个字符,且只有一个字符
[abcd] 匹配方括号里的abcd任意一个字符,abcd可以是其他不连续的字符如[aqwd]
[a-z] 匹配方括号里a到z之间的任意一个字符,也可以是连续的数字[1-9]
[!abcd] 不匹配方括号里的任意字符,也可以写为连续的字符,如[!a-z],也就是不匹配a到z任意的一个字符,且!符可以用^替代,写成[^abcd]

1.练习通配符

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

* 匹配任意字符

找出所有txt结尾的文件
[www.yuchoait.cn  root /test]#ls *.txt
cc.txt  yuchao.txt  yuc.txt

查看以sh结尾的文件
[www.yuchoait.cn  root /test]#ls *.sh
cc.sh

查看以yu开头、txt结尾的文件
[www.yuchoait.cn  root /test]#ls yu*.txt
yuchao.txt  yuc.txt

查看以yu开头、log结尾的文件
[www.yuchoait.cn  root /test]#ls yu*.log
yuchao01.log  yuyu.log

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

找出以c开头的文件
[www.yuchoait.cn  root /test]#ls c*
cc.sh  cc.txt

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

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

除非你去创建一个
[www.yuchoait.cn  root /test]#touch c.sh
[www.yuchoait.cn  root /test]#ls ?.sh
c.sh

所以,作用不大,只用于特定场景

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

你只能多写几个问号
[www.yuchoait.cn  root /test]#ls ?.sh
c.sh
[www.yuchoait.cn  root /test]#
[www.yuchoait.cn  root /test]#ls ??.sh
cc.sh

再比如找出所有txt
[www.yuchoait.cn  root /test]#ls ??.txt
cc.txt
[www.yuchoait.cn  root /test]#ls ??????.txt
yuchao.txt
[www.yuchoait.cn  root /test]#
[www.yuchoait.cn  root /test]#ls ???.txt
yuc.txt

[] 匹配方括号里的内容

创建测试数据,如
[www.yuchoait.cn-  root /test]#touch {a..g}.log
[www.yuchoait.cn-  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
[www.yuchoait.cn-  root /test]#


找出文件名是a-z之间任意一个字符的txt

[www.yuchoait.cn-  root /test]#ls [a-z].txt
ls: cannot access [a-z].txt: No such file or directory
报错了,因为没有


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


找出a-c之间任意一个字符的log
[www.yuchoait.cn-  root /test]#ls [a-c].log
a.log  b.log  c.log


创建测试数据
[www.yuchoait.cn-  root /test]#touch yu{1..5}.log
[www.yuchoait.cn-  root /test]#touch yc{1..5}.log
[www.yuchoait.cn-  root /test]#
[www.yuchoait.cn-  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
[www.yuchoait.cn-  root /test]#


找出以yu1  yu2 yu3 相关的log文件
[www.yuchoait.cn-  root /test]#ls yu[1-3].log
yu1.log  yu2.log  yu3.log


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

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

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

[www.yuchoait.cn  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文件
[www.yuchoait.cn  root /test]#ls [!abcd]*.log
e.log  f.log  g.log  yc1.log  yc2.log  yc3.log  yc4.log  yc5.log  yu1.log  yu2.log  yu3.log  yu4.log  yu5.log  yuchao01.log  yuyu.log
作用同上,必须是连续的数字
[www.yuchoait.cn  root /test]#ls [!a-d]*.log


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


排除所有名字里包含y和u的文件
[www.yuchoait.cn  root /test]#ls [!yu]*
a.log  b.log  cc.sh  cc.txt  c.log  c.sh  d.log  e.log  f.log  g.log


排除所有名字里包含y和u的sh文件
[www.yuchoait.cn  root /test]#ls [!yu]*.sh
cc.sh  c.sh

2.通配符 find 综合练习

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


*hosts    xxxxxxhosts
*hosts*   xxxxxxhostsxxxxx

hosts*   hostsxxxxx


[lamp-server root ~]$find /etc/ -type f -name '*hosts*'
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny


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

[lamp-server root ~]$find /etc/ -type f -name 'ifcfg*'
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-ens33


只查找以数字结尾的网卡配置文件
[lamp-server root ~]$find /etc/ -type f -name 'ifcfg*[0-9]'
/etc/sysconfig/network-scripts/ifcfg-ens33

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

升级,找到磁盘+分区呢?

[www.yuchoait.cn root ~]$find /dev -name  'sd[a-d]'
/dev/sdd
/dev/sdc
/dev/sdb
/dev/sda

#找找sdb硬盘有几个分区,多种写法
[www.yuchoait.cn root ~]$ls /dev/sdb?
/dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4  /dev/sdb5  /dev/sdb6  /dev/sdb7

[www.yuchoait.cn root ~]$ls /dev/sdb[0-9]
/dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4  /dev/sdb5  /dev/sdb6  /dev/sdb7

注意*是和上面不同的
[www.yuchoait.cn root ~]$ls /dev/sdb*
/dev/sdb  /dev/sdb1  /dev/sdb2  /dev/sdb3  /dev/sdb4  /dev/sdb5  /dev/sdb6  /dev/sdb7

通配符练习二

测试数据源准备
[www.yuchoait.cn root ~/test_shell]$touch {a..h}.log
[www.yuchoait.cn root ~/test_shell]$touch {1..10}.txt
[www.yuchoait.cn root ~/test_shell]$ls
10.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt  a.log  b.log  c.log  d.log  e.log  f.log  g.log  h.log
[www.yuchoait.cn root ~/test_shell]$



找出a到e的log文件
[www.yuchoait.cn root ~/test_shell]$ls [a-e].log
a.log  b.log  c.log  d.log  e.log


找出除了3到5的txt文件
[www.yuchoait.cn root ~/test_shell]$ls [!3-5].txt
1.txt  2.txt  6.txt  7.txt  8.txt  9.txt

找出除了2,5,8,9的txt文件
[www.yuchoait.cn root ~/test_shell]$ls [!2,5,8,9].txt
1.txt  3.txt  4.txt  6.txt  7.txt
同理写法
[www.yuchoait.cn root ~/test_shell]$ls [^2,5,8,9].txt
1.txt  3.txt  4.txt  6.txt  7.txt


找出除了a,e,f的log文件
[www.yuchoait.cn root ~/test_shell]$ls [!a,e,f].log
b.log  c.log  d.log  g.log  h.log
同理写法
[www.yuchoait.cn root ~/test_shell]$ls [^a,e,f].log
b.log  c.log  d.log  g.log  h.log

3.特殊符号

  1. 通配符相关特殊符号

    • 星号(*):在Linux中,它用于文件和目录名的匹配。例如,“ls .txt”命令会列出当前目录下所有以“.txt”为扩展名的文件。这是因为“”代表零个、一个或多个字符,在这里文件名部分可以是任意长度的字符串(包括空字符串)。
    • 问号(?):它代表一个单个字符。例如,“ls file?.txt”会列出当前目录下文件名符合“file”后接一个字符且扩展名为“.txt”的文件,像“file1.txt”、“file2.txt”等,但不会列出“file11.txt”。
    • 方括号([ ]):用于匹配方括号内的任意一个字符。例如,“ls [abc]”会列出当前目录下文件名以“a”或“b”或“c”开头的所有文件。也可以使用范围,如“[a - z]”匹配所有小写字母,“ls [a - z]”就会列出以小写字母开头的所有文件。
  2. 重定向相关特殊符号

    • 大于号(>):用于将命令的输出重定向到一个文件中。例如,“echo 'Hello World' > output.txt”,这个命令会将“Hello World”这个字符串输出到“output.txt”文件中。如果文件不存在,会创建一个新文件;如果文件已经存在,会覆盖原有文件的内容。
    • 大于等于号(>>):和“>”类似,但它是将命令的输出追加到一个文件的末尾。例如,“echo 'New Line' >> output.txt”会在“output.txt”文件的末尾添加“New Line”这一行内容。
    • 小于号(<):用于将文件内容作为命令的输入。例如,在一些需要从文件读取数据进行处理的命令中,“sort < input.txt”会读取“input.txt”文件中的内容,并对这些内容进行排序。
  3. 管道相关特殊符号

    • 竖线(|):管道符用于将一个命令的输出作为另一个命令的输入。例如,“ls -l | grep '.txt'”,首先“ls -l”会列出当前目录下详细的文件信息(长格式),然后通过管道将这些输出传递给“grep”命令,“grep”会筛选出其中包含“.txt”的行,这样就得到了所有扩展名为“.txt”的文件的详细信息。
  4. 引号相关特殊符号

    • 单引号('):在单引号中的内容会被原封不动地使用。例如,“echo '$HOME'”会直接输出“$HOME”,因为单引号阻止了变量的展开。
    • 双引号("):双引号中的内容会进行变量展开等操作。例如,“echo "$HOME"”会输出当前用户的主目录路径,因为“$HOME”是一个环境变量,双引号允许这个变量被替换为其实际的值。
    • 反引号(`):反引号中的内容会被当作命令来执行,并且将执行结果替换反引号中的内容。例如,“echo date”会输出当前的日期和时间,因为“date”命令的执行结果(当前日期和时间)被替换了反引号中的内容。
  5. 其他特殊符号

    • 波浪号(~):代表当前用户的主目录。例如,“cd ~”会切换到当前用户的主目录。它也可以用于指定其他用户的主目录,如“~user”代表用户“user”的主目录。
    • 分号(;):用于在一行中分隔多个命令。这些命令会依次执行。例如,“cd /tmp; ls”会先切换到“/tmp”目录,然后列出该目录下的文件。
    • 井号(#):在脚本或命令行中,井号后面的内容通常被视为注释。例如,在一个Shell脚本中,“# This is a comment”这一行是注释内容,不会被执行。

什么是特殊符号

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

路径相关

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

引号相关

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

重定向符号

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

<            stdin重定向

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

命令执行

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

转义符

Linux 转义符的解释

被转换意思的符号。

在 Linux 中,转义符(escape characters)是一种用来处理特殊字符的方法。通过在字符前加上反斜杠(\),可以改变它的原始含义,让 shell 按特定的方式解释它。


常用转义符及其含义

转义符 含义 示例 输出结果
\n 换行 echo -e "Hello\nWorld" Hello
World
\t 制表符(Tab) echo -e "Hello\tWorld" Hello World
\\ 表示反斜杠本身 echo -e "\\\\path" \path
\" 表示双引号 echo -e "\"Quoted\"" "Quoted"
\' 表示单引号 echo -e "\'Single\'" 'Single'
\b 退格(删除前一个字符) echo -e "Hello\bWorld" HellWorld
\a 警告声音(响铃,终端会发声) echo -e "\a" 发出警告音
\v 垂直制表符 echo -e "Hello\vWorld" Hello
World
\$ 输出 $ 字符 echo -e "\$HOME" $HOME
\ 空格的转义(路径中常用) cd /path\ with\ spaces 跳转到带空格的路径

转义符的用法场景

  1. 防止字符被解释为特殊意义
    如果你需要输出特殊字符(如 $", 空格等),可以使用反斜杠转义。
    示例:echo "\$HOME" 会输出 $HOME 而不是变量值。

  2. 生成格式化的输出
    借助转义符(如 \n, \t),可以控制输出的格式。
    示例:echo -e "Name\tAge\nJohn\t25"

  3. 路径中的特殊字符处理
    在文件路径中,空格或其他特殊字符可以通过 \ 来转义。
    示例:cd /path\ with\ space

  4. 脚本或命令行中转义引号
    当字符串包含引号时,可以用 \"\' 来避免冲突。
    示例:echo "This is a \"quoted\" word"


注意事项

  • 使用 -e 参数时,echo 会解析转义字符。没有 -e 时,转义符会被当作普通字符处理。
  • 转义符的行为在不同的 shell 中可能略有差异(如 Bash 与 Zsh)。

以上就是 Linux 转义符的基本解释和常用方法。

4.引号练习

单引号

例如使用date练习

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

[www.yuchoait.cn root ~/test_shell]$date
Sat Apr  2 17:06:01 CST 2022
[www.yuchoait.cn root ~/test_shell]$
[www.yuchoait.cn root ~/test_shell]$echo 'date'
date
[www.yuchoait.cn root ~/test_shell]$echo '$(date)'
$(date)

结论、单引号是所见即所得,单引号里面是什么,输入就是什么,没有任何改变,特殊符号也都失去了其他作用。

反引号

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

依然是date命令

[www.yuchoait.cn root ~/test_shell]$date
Sat Apr  2 17:32:56 CST 2022
[www.yuchoait.cn root ~/test_shell]$
[www.yuchoait.cn root ~/test_shell]$echo `date`
Sat Apr 2 17:32:59 CST 2022
[www.yuchoait.cn root ~/test_shell]$echo `pwd`
/root/test_shell

[www.yuchoait.cn root ~/test_shell]$echo "于超老师的外号是`echo 超哥`"
于超老师的外号是超哥

总结

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

双引号

[www.yuchoait.cn root ~/test_shell]$echo "date"
date
[www.yuchoait.cn root ~/test_shell]$echo "`date`"
Sat Apr  2 17:39:52 CST 2022
[www.yuchoait.cn root ~/test_shell]$
[www.yuchoait.cn root ~/test_shell]$echo "$PATH"
/opt/jdk/BIN:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin:/opt/jdk/bin:/root/bin
[www.yuchoait.cn root ~/test_shell]$

[www.yuchoait.cn root ~/test_shell]$name="超哥"
[www.yuchoait.cn root ~/test_shell]$
[www.yuchoait.cn root ~/test_shell]$echo "于超老师的外号是$name"
于超老师的外号是超哥

[www.yuchoait.cn root ~/test_shell]$echo "于超老师的外号是$name,当前的linux工作路径是$PWD"
于超老师的外号是超哥,当前的linux工作路径是/root/test_shell

结论

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

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

无引号

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

[www.yuchoait.cn root ~/test_shell]$echo 于超老师的外号是 $name
于超老师的外号是 超哥

[www.yuchoait.cn root ~/test_shell]$echo 于超老师的外号是 $name 当前的工作路径是 $PWD
于超老师的外号是 超哥 当前的工作路径是 /root/test_shell

[www.yuchoait.cn root ~/test_shell]$echo "于超老师的外号是 $name 当前的工作路径是 $PWD"
于超老师的外号是 超哥 当前的工作路径是 /root/test_shell


[www.yuchoait.cn root ~/test_shell]$echo '于超老师的外号是 $name 当前的工作路径是 $PWD'
于超老师的外号是 $name 当前的工作路径是 $PWD

5.特殊符号练习

重定向符号

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

; 分号

  • 表示命令的结束
  • 多个命令之间的分隔符
  • 某些配置文件的注释符
[www.yuchoait.cn root ~/test_shell]$pwd;mkdir hehe;cd hehe;pwd
/root/test_shell
/root/test_shell/hehe
[www.yuchoait.cn root ~/test_shell/hehe]$

# 符

注释符号
如命令的注释
[www.yuchoait.cn root ~/test_shell/hehe]$# hello super man
[www.yuchoait.cn root ~/test_shell/hehe]$
[www.yuchoait.cn root ~/test_shell/hehe]$# ls /opt


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

#user  nobody;
worker_processes  1;

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

#pid        logs/nginx.pid;

| 管道符

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

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


[www.yuchoait.cn root ~/test_shell/hehe]$ifconfig |grep inet
        inet 192.168.0.240  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::4913:8ad0:3a1:c439  prefixlen 64  scopeid 0x20<link>
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>


[www.yuchoait.cn root ~/test_shell/hehe]$netstat -tunlp|grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1063/sshd
tcp6       0      0 :::22                   :::*                    LISTEN      1063/sshd

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

&& 符

创建目录成功后,才执行后面的命令
[www.yuchoait.cn root ~/test_shell/hehe]$mkdir /chaoge_data && cd /chaoge_data
[www.yuchoait.cn root /chaoge_data]$
[www.yuchoait.cn root /chaoge_data]$
[www.yuchoait.cn root /chaoge_data]$mkdir /chaoge_data && cd /chaoge_data
mkdir: cannot create directory ‘/chaoge_data’: File exists

如果前面命令失败,后面命令不执行

[www.yuchoait.cn root /chaoge_data]$mkdir /chaoge_data && pwd
mkdir: cannot create directory ‘/chaoge_data’: File exists

只有前面成功,后面才执行
[www.yuchoait.cn root /chaoge_data]$mkdir /chaoge_data2 && pwd
/chaoge_data

|| 符

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

[www.yuchoait.cn root /chaoge_data]$mkdir /chaoge_data ||  pwd
mkdir: cannot create directory ‘/chaoge_data’: File exists
/chaoge_data

前面成功了,后面不执行

[www.yuchoait.cn root /chaoge_data]$mkdir /chaoge_data222 ||  pwd

$() 符

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

[www.yuchoait.cn root /chaoge_data]$touch nginx_access_$(date +%F).log
[www.yuchoait.cn root /chaoge_data]$
[www.yuchoait.cn root /chaoge_data]$ll
total 0
-rw-r--r-- 1 root root 0 Apr  2 18:03 nginx_access_2022-04-02.log

找到当前的txt文件,然后删掉

[www.yuchoait.cn root ~/test_shell]$rm -f $(find . -name '*.txt')

等同写法

[www.yuchoait.cn root ~/test_shell]$rm -f `find . -name '*.log'`

{} 符

生成连续的数字序列
[www.yuchoait.cn root ~/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



生成字母序列
[www.yuchoait.cn root ~/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

特殊用法,拷贝文件的简写

[www.yuchoait.cn root ~/test_shell]$ll /etc/sysconfig/network-scripts/ifcfg-ens33*
-rw------- 1 root root 408 Mar 19 14:59 /etc/sysconfig/network-scripts/ifcfg-ens33
-rw-r--r-- 1 root root 408 Apr  2 18:17 /etc/sysconfig/network-scripts/ifcfg-ens33.bak

作为变量的分隔符

[www.yuchoait.cn root ~/test_shell]$touch ${name}_`date +%F`.log
[www.yuchoait.cn root ~/test_shell]$ll
total 0
-rw-r--r-- 1 root root 0 Apr  2 18:18 超哥_2022-04-02.log

通配符和正则表达式

  1. 概念范围

    • 通配符:是一种简单的模式匹配符号,主要用于在文件名、目录名或简单文本内容中进行快速、基本的匹配。它的语法相对简单,通常在操作系统的文件搜索功能、简单的文本编辑器查找功能等场景下使用。例如,在Windows或Linux的文件搜索中,使用“”和“?”来匹配文件名。“”可以代表零个、一个或多个字符,“?”代表一个字符。像“*.txt”就可以匹配所有扩展名为“.txt”的文件。
    • 正则表达式:是一种强大的、用于描述字符模式的工具。它的语法更复杂,能够实现高度灵活和精确的文本匹配、查找、替换等操作。正则表达式不仅可以用于简单的文件搜索和文本处理,还广泛应用于编程语言、文本处理软件、数据验证等众多领域。例如,在验证用户输入的电子邮件地址是否符合格式要求时,正则表达式可以精确地检查是否包含“@”符号、域名部分是否合理等复杂的模式。
  2. 语法复杂度

    • 通配符:语法比较简洁。通常只有几个基本的符号,如星号()、问号(?)、方括号([ ])等。以文件搜索为例,“[abc].txt”这种通配符模式,表示文件名以“a”或“b”或“c”开头,然后可以是任意字符,并且扩展名为“.txt”的文件。其规则相对容易理解和掌握。
    • 正则表达式:语法非常丰富。除了有类似通配符的一些符号外,还有很多用于精确控制匹配的特殊字符和语法结构。例如,“^”用于匹配字符串的开头,“$”用于匹配字符串的结尾,“\d”用于匹配数字,“\w”用于匹配字母数字下划线等。一个简单的正则表达式如“^\d{3}-\d{4}-\d{4}$”可以用于验证电话号码是否是“三位 - 四位 - 四位”的格式。而且正则表达式还可以进行分组、重复次数指定等复杂操作。
  3. 功能和应用场景

    • 通配符
      • 文件和目录操作:在操作系统的文件系统中,通配符主要用于文件搜索和目录操作。比如在Linux的“ls”命令中,“ls *.c”可以快速列出当前目录下所有以“.c”为扩展名的文件,帮助用户快速定位文件。
      • 简单文本查找:在一些简单的文本编辑器中,通配符可以用于基本的文本查找。例如,查找以某个单词开头的句子,使用简单的通配符可以实现初步的筛选。
    • 正则表达式
      • 文本处理和验证:在文本处理软件中,正则表达式可以对文本内容进行深度的处理,如提取符合特定模式的文本、替换复杂的文本模式等。在编程语言中,用于验证用户输入的数据是否符合特定格式,如验证密码强度(是否包含字母、数字、特殊字符等)、验证身份证号码、邮政编码等格式。
      • 数据提取和转换:对于大量的文本数据,正则表达式可以用于提取关键信息。例如,从网页的HTML代码中提取所有的链接地址,或者从日志文件中提取特定的错误代码和相关信息。还可以用于数据的转换,如将文本中的日期格式从“YYYY - MM - DD”转换为“DD/MM/YYYY”。
Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2025-01-12 18:46:55

results matching ""

    No results matching ""