重定向
标准输入、标准正确输出、标准错误输出
进程在运行的过程中根据需要会打开多个文件,每打开一个文件会有一个数字标识。这个标识叫文件描述符。 进程使用文件描述符来管理打开的文件(FD----file descriptors). 文件描述符:每打开一个程序都会有文件描述
0,标准输入(键盘) 1,标准输出 2,标准错误, 3+,进程在执行过程中打开的其他文件。 &:表示正确错误混合输出
; #分隔符,可在同一行执行多条命令,每条命令以‘;’ 分割, 命令之间没有逻辑关系 && #逻辑与(and),可在同一行执行多条命令,&&之前的命令执行成功,才会执行&&之后的命令,反之则不执行 || #逻辑或,可在同一行执行多条命令,||之前的命令执行失败,才会执行||之后的命令,反之则不执行
文件描述符是一个整数,代表一个文件,每个进程自动打开3个文件:stdin,stdout,stderr。目前我的电脑上每个进程可以打开的文件描述符是1024个(通过“ulimit -n”命令查询)。
在 shell 程式中,最常使用的 文件描述符FD (file descriptor) 大概有三个, 分别是:
文件描述符 | 缩写 | 描述 | 含义 |
---|---|---|---|
0 | STDIN (Standard Input) | 标准输入 | 键盘 |
1 | STDOUT (Standard Output) | 标准正确输出 | 显示屏 |
2 | STDERR (Standard Error Output) | 标准错误输出 | 显示屏 |
在标准情况下, 这些FD分别跟如下设备关联: stdin(0): keyboard 键盘输入,并返回在前端 stdout(1): monitor 正确返回值 输出到前端 stderr(2): monitor 错误返回值 输出到前端
输出重定向
输出重定向是指命令的结果不再输出到显示器上,而是输出到其它地方,一般是文件中。这样做的最大好处就是把命令的结果保存起来,当我们需要的时候可以随时查询。
<覆盖重定向>
shell : > 输出的内容会覆盖已有文件的内容
<追加重定向>
shell : >> 输出的内容追加到已有的文件中
>a.txt 标准正确输出重定向,即将正确结果追加到a.txt文件 1>a.txt 标准正确输出重定向,与上一条命令相同,1可以省略不写 2>a.txt 标准错误输出重定向,即将错误结果追加到a.txt文件 &>a.txt 混合输出重定向,即将标准正确输出重定向与标准错误输出重定向共同追加到a.txt文件例:在dir1目录下存在01.txt与02.txt文件
图一中使用的命令是正确的,所以01.txt的内容被追加到了02.txt文件
图二中使用的因为是混合输出重定向,03.txt文件不存在,存在错误的返回值,所以在02.txt文件可以看到正确的内容与错误的内容
1>&2 正确返回值传递给2输出通道 &2表示2输出通道 2>&1 错误返回值传递给1输出通道, 同样&1表示1输出通道这个就比较好理解了03.txt文件不存在,此时存在错的返回值。2>&1 错误返回值传递给1输出通道,此时02.txt接收的是正确返回值的内容,所以02.txt中会存在错误内容。
而01.txt文件存在且有内容,1>&2 正确返回值传递给2输出通道,1>02.txt此时02.txt接收的是正确返回值的内容,所以查看02.txt时不存在内容
1>&2 正确返回值传递给2输出通道,2>02.txt此时02.txt接收的是错误返回值的内容,所以查看02.txt时会存在内容。
拓展
在一条命令中,使用多个重定向时,会有一个先后顺序,在下面这个例子中,分别将正确输出,混合输出,错误输出重定向到了三个文件中,按命令来看,三个文件中都会存在相应的内容,但这是错误的。
例:cat a.txt 1.txt 2.txt >zq.txt &>hunhe.txt 2>cw.txt
上面这个例子中a.txt与1.txt都存在并有内容,2.txt不存在
可以从上图看到,存有错误输出的cw.txt中有相应的内容,存有混合输出的hunhe.txt中只有正确输出的内容,而存有正确输出的zq.txt中则没有内容。
由此可以得出,“例:cat a.txt 1.txt 2.txt >zq.txt &>hunhe.txt 2>cw.txt”中重定向内容从右到左,分别被重定向至文件中,错误输出先被重定向至cw.txt中,例子中就只剩下正确输出了,而剩下的正确输出则被混合重定向至hunhe.txt中,到正确输出重定向时已经没有需要输出重定向的内容了
输入重定向
shell : < 将文件的内容重定向命令中,作为命令的输入 shell : << 输入不需要文件进行重定向,只需要在命令行中指定用于输入重定向的数据即可
通过输入重定向创建文件
EOF是一种特殊的输入重定向操作符。它的作用是在命令行中指定一个多行输入,并将其作为标准输入传递给命令。在编写 shell 脚本时,经常用来在命令行中提供多行输入,尤其常用于需要交互式输入的场景。 #可以写到脚本或者文件里面 命令 <<EOF 交互命令1 交互命令2 EOF 命令 <<ABC 交互命令1 交互命令2 ABC 在任意一个命令后方加入 <<EOF,在下一行编写需要交互的命令,最后以 EOF 结尾。 这个 EOF 命令不是固定的,可以是任意字符,但结尾字符必须与开始字符一致。且结尾的EOF 必须顶格书写
管道
语法:command1 | command2 | command3 | ......
一个进程将正确输出结果通过管道符以标准输入传递给下一个进程
通产用法:过滤内容
#查询所有安装的软件包,过滤包含MySQL的包
例:rpm -qa | grep mysql
#查询本机IP,以下两个例子仅作用于学习环境下的虚拟机,工作中的网卡名一般为eth0
例:ip a | grep 'ens33' | awk 'NR==2 {print $2}' | awk -F'/' '{print $1}'
例:ip a | grep 'ens33' | awk 'NR==2 {print $2}' | cut -d'/' -f1
例:cat /etc/passwd | wc -l #查看/etc/passwd并统计该文件有多少行内容
参数传递:xargs
对:ls cp rm 管道不能执行。所以通过xargs。
#实例中出现的a.txt和file.txt文件中的内容为路径,仅为演示xargs的使用方法 示例: cat a.txt | xargs -i cp {} /目录 {}:前面传过来的内容 -i :为了让大括号生效 目录时 -r 解释:前面传过来的东西交给大括号 cat file.txt |xargs ls -l 前面是目录或者目录的路径。 ls - l 后面可以不加大括号,直接执行。
拓展
文本工具,以下三者都可以配合管道来使用,可以帮助我们快捷的对文本进行编辑或查询
grep 更适合单纯的查找或匹配文本
sed 更适合编辑匹配到的文本
awk 更适合格式化文本,对文本进行较复杂格式处理
本次使用的为grep还有awk,先做简单了解,awk功能十分强大,再此处仅做文本处理的介绍:
例:ip a | grep 'ens33' | awk 'NR==2 {print $2}' | awk -F'/' '{print $1}'
上边的例子是用来取虚拟机IP的。awk 命令中默认以一个空格为分隔符,可以使用-F指定分隔符,NR==2的意思是取文本内容的第二行, {print $2}意味截取指定分割符分割的第二列内容
在上面的实例中,还展示了一种文本分割截取的命令:cut
例:ip a | grep 'ens33' | awk 'NR==2 {print $2}' | cut -d'/' -f1
同样是截取ip。 cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
-d:指定分隔符,默认分隔符为‘Tab’(制表符)
-f:指定截取分割符分割的第几列内容
显示每个文件和目录的磁盘使用空间
du命令 也是查看使用空间的
du -s /usr #查看文件的大小 du -sh /usr #查看文件的大小,人性化显示
du -h --max-depth=1 $dirname 显示目录下的一层所有文件的大小
wc -w#统计单词数
wc -l #统计行号