通配符和特殊符号
为什么学通配符
一、为什么要学习通配符?
- 提高文件搜索效率
- 在计算机的文件系统中,当你需要查找一批具有相似文件名的文件时,通配符能发挥巨大作用。例如,你有一系列的文档文件,名字分别是“报告1.docx”、“报告2.docx”、“报告3.docx”等。如果想一次性找到所有这些报告文件,使用通配符(如“报告*.docx”)可以快速定位它们,而不用逐个输入文件名进行搜索。
- 文本处理和编辑便捷性
- 在文本编辑器或者编程环境中,通配符可以用于匹配和操作大量相似的文本内容。比如在处理大量的日志文件时,你可能需要查找所有包含某个特定错误代码(如“ERROR - 404”)的行,通过通配符可以方便地构建搜索模式,快速定位到相关内容,然后进行修改、统计等操作。
- 编程中的模式匹配
- 在编程领域,通配符用于字符串处理和模式匹配。以正则表达式为例(正则表达式中有多种通配符的用法),它可以用于验证用户输入的数据是否符合特定格式。例如,验证用户输入的电子邮件地址是否有效。通过使用通配符模式,程序可以检查输入的字符串是否具有类似“[用户名]@[域名].[后缀]”的格式,从而提高程序的健壮性和数据的准确性。
二、什么是通配符?
通配符是一种特殊字符,主要用于代替一个或多个字符。在不同的环境(如操作系统的文件搜索、文本编辑器、数据库查询语言等)下,通配符的具体规则和使用方式可能会有所不同。
- 常见的通配符类型
- 星号(*):在许多系统中,星号是最常用的通配符。
它可以代表零个、一个或多个字符
。例如,在文件搜索中,“.txt”表示匹配所有以“.txt”为扩展名的文件,文件名部分可以是任意长度的字符串(包括空字符串)。在文本处理中,如果要查找所有以“a”开头的单词,可以使用“a”这样的模式。 - 问号(?):问号通配符通常代表一个单个字符。例如,在文件搜索中,“file?.txt”可以匹配“file1.txt”、“file2.txt”等,但不能匹配“file11.txt”,因为问号只能代表一个字符。
- 在正则表达式中还有更多复杂的通配符,如“[ ]”(用于匹配方括号内的任意一个字符)、“^”(用于匹配字符串的开头)、“$”(用于匹配字符串的结尾)等。例如,“[abc]”可以匹配“a”、“b”或者“c”;“^hello”可以匹配以“hello”开头的字符串;“world$”可以匹配以“world”结尾的字符串。
- 星号(*):在许多系统中,星号是最常用的通配符。
三、怎么学习通配符?
- 熟悉使用场景
- 先确定你要在哪个环境中使用通配符,是操作系统的文件搜索(如Windows的资源管理器搜索功能、Linux的命令行文件搜索)、文本编辑器(如Notepad++、Sublime Text等)还是编程环境(如Python中的re模块用于正则表达式)。了解不同环境下通配符的支持程度和具体规则。
- 例如,在Windows资源管理器的搜索框中,你可以使用星号和问号通配符来查找文件。而在Linux命令行中,像“ls”命令结合通配符可以列出符合特定模式的文件,如“ls *.c”会列出当前目录下所有以“.c”为扩展名的文件。
- 学习基本语法规则
- 从简单的通配符开始学起,如星号和问号。掌握它们在不同环境下如何代表字符。
- 以文本处理为例,假设你有一个文本文件,内容是很多单词,每行一个单词。如果你想找到所有长度为5个字符的单词,在一些支持简单通配符的文本编辑器中,你可以使用“?????”作为搜索模式,编辑器会找到所有符合这个长度的单词。
- 然后学习更复杂的正则表达式通配符(如果需要在编程或者高级文本处理中使用)。可以通过阅读相关的文档或者教程,学习“[ ]”、“^”、“$”等字符的用法。例如,学习如何用“^[A - Z]”来匹配以大写字母开头的字符串。
- 实践操作
- 进行大量的练习,在文件搜索中,尝试用通配符搜索不同类型的文件。例如,在你的计算机存储照片的文件夹中,用“.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("手机号码格式错误")
- 参考资料学习
- 阅读操作系统的用户手册,如Linux系统的“man”命令文档,其中有关于文件搜索通配符的详细介绍。对于文本编辑器,查看编辑器自带的帮助文档,许多文本编辑器都有关于查找和替换功能中如何使用通配符的部分。
- 在网上有很多关于通配符学习的资源,包括博客文章、教程视频等。例如,在一些知名的编程学习网站上,有专门针对正则表达式通配符的教程,从基础语法到高级应用案例都有详细讲解。
通配符
首先,以于超老师的的编程经验告诉新人,学通配符,或是正则,请记住
- 正则、通配符是为了解决某问题
- 先有问题场景,再琢磨如何写通配符
- 不要先去写奇怪的通配符或正则,再去琢磨它是什么含义,这是外星人的做法。
什么是通配符
当你在查找特定文件名,却不记得如何拼写时,通配符是帮你寻找的神器。
通配符是专门用于处理文件名的特殊字符,而不是文件内容!
可以方便查找类似、但是不相同的文件名。
通配符是shell的内置语法、大部分linux命令都认识通配符
基本字符 | 通配符 | 模糊匹配的字符内容 |
---|---|---|
yu | * | yuchao |
yucccc | ||
yuuuuuuu | ||
yuddididididi | ||
chao | ? | chaog |
?? | chao1 | |
??? | chao- | |
chao. | ||
chao_ |
注意,文件名一般是不带特殊字符的
通配符语法
- 星号(*)通配符语法
- 在文件搜索和许多文本处理场景中,星号代表零个、一个或多个字符。
- 例如,在操作系统的文件搜索中,如果要查找所有扩展名为“.pdf”的文件,无论文件名是什么,都可以使用“.pdf”作为搜索条件。这里的“”表示文件名部分可以是任意长度的字符串(包括空字符串)。如果是在文本处理软件中查找以某个单词开头的句子,比如以“The”开头的句子,在支持简单通配符的软件中可以使用“The*”作为查找模式。
- 在一些数据库查询语言中,星号也有类似的作用。例如在SQL的“SELECT”语句中,“SELECT FROM table_name”表示选择表“table_name”中的所有列。这里的“”是对列的一种通配,表示全部列。
- 问号(?)通配符语法
- 问号通常代表一个单个字符。
- 在文件搜索中,如“file?.txt”可以匹配“file1.txt”、“file2.txt”等,因为“?”只代表一个字符位置。如果文件名是“file11.txt”,则不符合这个模式。在文本处理中,如果想查找三个字符的单词,且第二个字符是“a”,可以使用“?a?”作为查找模式。
- 方括号([ ])通配符语法(常用于正则表达式)
- 方括号用于,匹配方括号内的,任意一个字符。
- ``
- 例如,“[abc]”可以匹配“a”、“b”或者“c”。可以通过范围来指定更多的字符,如“[a - z]”匹配所有小写字母,“[A - Z]”匹配所有大写字母,“[0 - 9]”匹配所有数字。更复杂的用法可以是组合不同的范围和单个字符,如“[a - zA - Z0 - 9]”匹配所有字母和数字。
- 还可以使用否定形式,在方括号内的开头加上“^”符号来表示不匹配方括号内的字符。例如,“abc”表示不匹配“a”、“b”和“c”的任何一个字符。
- 脱字符(^)通配符语法(常用于正则表达式)
- 当用于字符串开头时,脱字符用于匹配字符串的开头。
- 例如,“^Hello”可以匹配以“Hello”开头的字符串。如果有一个文本文件,里面有多行文字,使用支持正则表达式的工具查找“^The”,就会找到所有以“The”开头的行。在某些编程语言的正则表达式模块中,这个字符的用法可能会根据具体的函数和上下文略有不同,但基本的含义是用于定位字符串的开头。
- 美元符号($)通配符语法(常用于正则表达式)
- 用于匹配字符串的结尾。
- 例如,“world$”可以匹配以“world”结尾的字符串。如果要检查一个句子是否以“.”结尾,可以使用“.$”作为正则表达式模式。在编程环境中,比如在Python的正则表达式模块“re”中,当使用“re.search”等函数时,这个符号能帮助精准地定位到符合条件的字符串结尾部分。
- 点号(.)通配符语法(常用于正则表达式)
- 在正则表达式中,点号代表除换行符之外的任意一个字符。
- 例如,“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.特殊符号
通配符相关特殊符号
- 星号(*):在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]”就会列出以小写字母开头的所有文件。
重定向相关特殊符号
- 大于号(>):用于将命令的输出重定向到一个文件中。例如,“echo 'Hello World' > output.txt”,这个命令会将“Hello World”这个字符串输出到“output.txt”文件中。如果文件不存在,会创建一个新文件;如果文件已经存在,会覆盖原有文件的内容。
- 大于等于号(>>):和“>”类似,但它是将命令的输出追加到一个文件的末尾。例如,“echo 'New Line' >> output.txt”会在“output.txt”文件的末尾添加“New Line”这一行内容。
- 小于号(<):用于将文件内容作为命令的输入。例如,在一些需要从文件读取数据进行处理的命令中,“sort < input.txt”会读取“input.txt”文件中的内容,并对这些内容进行排序。
管道相关特殊符号
- 竖线(|):管道符用于将一个命令的输出作为另一个命令的输入。例如,“ls -l | grep '.txt'”,首先“ls -l”会列出当前目录下详细的文件信息(长格式),然后通过管道将这些输出传递给“grep”命令,“grep”会筛选出其中包含“.txt”的行,这样就得到了所有扩展名为“.txt”的文件的详细信息。
引号相关特殊符号
- 单引号('):在单引号中的内容会被原封不动地使用。例如,“echo '$HOME'”会直接输出“$HOME”,因为单引号阻止了变量的展开。
- 双引号("):双引号中的内容会进行变量展开等操作。例如,“echo "$HOME"”会输出当前用户的主目录路径,因为“$HOME”是一个环境变量,双引号允许这个变量被替换为其实际的值。
- 反引号(`):反引号中的内容会被当作命令来执行,并且将执行结果替换反引号中的内容。例如,“echo
date
”会输出当前的日期和时间,因为“date”命令的执行结果(当前日期和时间)被替换了反引号中的内容。
其他特殊符号
- 波浪号(~):代表当前用户的主目录。例如,“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 |
跳转到带空格的路径 |
转义符的用法场景
防止字符被解释为特殊意义
如果你需要输出特殊字符(如$
、"
, 空格等),可以使用反斜杠转义。
示例:echo "\$HOME"
会输出$HOME
而不是变量值。生成格式化的输出
借助转义符(如\n
,\t
),可以控制输出的格式。
示例:echo -e "Name\tAge\nJohn\t25"
路径中的特殊字符处理
在文件路径中,空格或其他特殊字符可以通过\
来转义。
示例:cd /path\ with\ space
脚本或命令行中转义引号
当字符串包含引号时,可以用\"
或\'
来避免冲突。
示例: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
通配符和正则表达式
概念范围
- 通配符:是一种简单的模式匹配符号,主要用于
在文件名、目录名
或简单文本内容中进行快速、基本的匹配。它的语法相对简单,通常在操作系统的文件搜索功能、简单的文本编辑器查找功能等场景下使用。例如,在Windows或Linux的文件搜索中,使用“”和“?”来匹配文件名。“”可以代表零个、一个或多个字符,“?”代表一个字符。像“*.txt”就可以匹配所有扩展名为“.txt”的文件。 - 正则表达式:是一种强大的、用于描述字符模式的工具。它的语法更复杂,能够实现高度灵活和
精确的文本匹配、查找、替换等操作。
正则表达式不仅可以用于简单的文件搜索和文本处理,还广泛应用于编程语言、文本处理软件、数据验证等众多领域。例如,在验证用户输入的电子邮件地址是否符合格式要求时,正则表达式可以精确地检查是否包含“@”符号、域名部分是否合理等复杂的模式。
- 通配符:是一种简单的模式匹配符号,主要用于
语法复杂度
- 通配符:语法比较简洁。通常只有几个基本的符号,如星号()、问号(?)、方括号([ ])等。以文件搜索为例,“[abc].txt”这种通配符模式,表示文件名以“a”或“b”或“c”开头,然后可以是任意字符,并且扩展名为“.txt”的文件。其规则相对容易理解和掌握。
- 正则表达式:语法非常丰富。除了有类似通配符的一些符号外,还有很多用于精确控制匹配的特殊字符和语法结构。例如,“^”用于匹配字符串的开头,“$”用于匹配字符串的结尾,“\d”用于匹配数字,“\w”用于匹配字母数字下划线等。一个简单的正则表达式如“^\d{3}-\d{4}-\d{4}$”可以用于验证电话号码是否是“三位 - 四位 - 四位”的格式。而且正则表达式还可以进行分组、重复次数指定等复杂操作。
功能和应用场景
- 通配符:
- 文件和目录操作:在操作系统的文件系统中,通配符主要用于文件搜索和目录操作。比如在Linux的“ls”命令中,“ls *.c”可以快速列出当前目录下所有以“.c”为扩展名的文件,帮助用户快速定位文件。
- 简单文本查找:在一些简单的文本编辑器中,通配符可以用于基本的文本查找。例如,查找以某个单词开头的句子,使用简单的通配符可以实现初步的筛选。
- 正则表达式:
- 文本处理和验证:在文本处理软件中,正则表达式可以对文本内容进行深度的处理,如提取符合特定模式的文本、替换复杂的文本模式等。在编程语言中,用于验证用户输入的数据是否符合特定格式,如验证密码强度(是否包含字母、数字、特殊字符等)、验证身份证号码、邮政编码等格式。
- 数据提取和转换:对于大量的文本数据,正则表达式可以用于提取关键信息。例如,从网页的HTML代码中提取所有的链接地址,或者从日志文件中提取特定的错误代码和相关信息。还可以用于数据的转换,如将文本中的日期格式从“YYYY - MM - DD”转换为“DD/MM/YYYY”。
- 通配符: