Linux之重定向,管道符,通配符,转义字符
日期: 2019-02-23 分类: 个人收藏 362次阅读
1、shell重定向介绍
重定向是指修改原来默认的一些东西,对原来系统命令的默认执行方式进行改变,比如说简单的我不想看到在显示器的输出而是希望输出到某一文件中就可以通过重定向来进行这项工作。重定向是很重要的,比如在程序运行过程中,会有一些关键的信息,比如异常、错误、接口调用情况等等,这些都会写到日志文件里。
文件描述符
当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:
类型 | 文件描述符 | 默认情况 | 对应文件句柄位置 |
标准输入(standard input) | 0 | 从键盘获得输入 | /proc/slef/fd/0 |
标准输出(standard output) | 1 | 输出到屏幕 | /proc/slef/fd/1 |
标准错误(error output) | 2 | 输出到屏幕 | /proc/slef/fd/2 |
所以我们平时在执行shell命令中,都默认从键盘获得输入,并且将结果输入到屏幕上。但是我们可以通过更改文件描述符默认的指向,从而实现输入输出的重定向。
2、输入输出重定向
输入重定向就是指把文件导入到命令中。(使用频率低)
该命令等同于cat a.txt | wc -l,显示a.txt文本的行数。(中间的"|"表示管道符,简称“任意门”)
输出重定向是指把原本要输出在屏幕上的信息写入到指定文件。(使用频率高)
对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。
[root@localhost test]# ls -l a.txt > message.txt
[root@localhost test]# cat message.txt
-rw-------. 1 root root 1218 Feb 23 21:46 a.txt
虽然都是输入重定向,但是不同命令的标准输出和错误输出还是有区别的。假设要看一个文件(a.txt)的信息,如果这个文件是存在的,那么使用标准输出即可将原本输出在屏幕上的信息写入到文件中,而用错误输出重定向则依然会把信息输出在屏幕上。所以选择输出重定向的时候要根据适用场景做出合适的选择。
错误重定向很实用,因为它可以把脚本执行过程中的错误信息都记录到文件中,方便之后的排错工作。
覆盖(清空)写入和追加写入的区别在于:覆盖写入会把写入的文件中之前的数据全部清空再写入新的数据;追加写入则会在写入的文件数据之后继续写入,不会清空之前的数据。
3、管道符
管道符为键盘上的shift+\键,其执行格式为“命令A | 命令B”,管道符的作用为“把前一个命令(A)原本要输出在屏幕上的标准正常数据作为后一个命令(B)的标准输入”。
假如我们想要看/etc目录下所有文件的详细信息,但是/etc目录下的文件特别多,我们想要一页一页翻着看,这时候就可以用到管道命令符了,看详细信息命令为ls -al /etc,它的输出就是该目录下的所有文件信息,这时候我们使用管道符把它的输出信息作为less(可以翻阅信息)命令的标准输入。
[root@localhost test]# ls -al /etc | less
4、通配符
当我们在遍历某些文件时,恰巧用只记得文件前几个字母的时候,我们就可以使用到通配符,当然通配符的作用不仅如此。
符号 | 作用 |
* | 匹配的信息可以是0个或多个字符(0-无穷多) |
? | 匹配的信息只能是一个字符(1) |
[0-9] | 匹配0-9之间的单个数字 |
[a,b,c] | 匹配a,b,c中的任意一个 |
[a-z] | 匹配字母 |
[a-z,A-Z] | 匹配大小写字母 |
下边我们使用通配符来查找一下硬盘信息。
5、转义字符
为了能更好的理解用户的表达,shell解释器提供了丰富的转义字符来处理输入的特殊数据。
符号 | 作用 |
反斜杠(\) | 使反斜杠后面的一个变量为单纯的字符串 |
单引号('') | 转义其中所有的变量为单纯的字符串 |
双引号("") | 保留其中的变量属性,不进行转义处理 |
反引号(``) | 把其中的命令执行后返回结果 |
我们定义一个变量PRICE=5,然后输出用双引号括起来的字符串和变量信息:
[root@localhost test]# PRICE=5
[root@localhost test]# echo "Price is $PRICE"
Price is 5
如果我们想输出Price is $5,就可以使用反斜杠(\)进行一个$的转义:
[root@localhost test]# echo "Price is \$$PRICE"
Price is $5
如果使用单引号(‘’)会有什么结果呢?结果是$PRICE也会被认为是一个单纯的字符串:
[root@localhost test]# echo 'Price is $PRICE'
Price is $PRICE
反引号(``)意思就是执行其中的命令,当然反引号里面应该是一个可执行命令:
[root@localhost test]# echo "ls -l"
ls -l
[root@localhost test]# echo `ls -l`
total 8 -rw-------. 1 root root 27 Feb 23 22:05 a.txt -rw-r--r--. 1 root root 46 Feb 23 22:35 message.txt
[root@localhost test]# echo `Price is $PRICE`
bash: Price: command not found...
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:Linux
上一篇: 阿里巴巴薪水级别一览
精华推荐