学习时间是2020年3月下旬,疫情居家隔离期间。 学习视频是,学堂在线上,颜晨阳老师讲的Linux系统管理。
重定向
本讲介绍linux中输入输出重定向。
unix 发明人总结的的设计准则是,一次只做一件事,并且做到最好。(Do one thing, and do it well)
一个好的程序,应该满足:
- 一次只做一件事,并做到最好。
- 能够与其他程序协同工作。
- 能够处理文本流。
为了让Linux 程序有效地协同工作,就需要对命令输入输出重定向。
用户与Linux 的交互,通过shell实现。
Bash 有三种标准输入输出流,并且分别有各自的文件标识号
- 标准输入流 stdin,一般指终端键盘,文件描述符为 0
- 标准输出流 stdout,一般指终端屏幕,或图形界面上的终端窗口,文件描述符为 1
- 错误输出流 stderr,一般也是指终端屏幕,或图形界面上的终端窗口,文件描述符为 2
简而言之:
-
输出重定向就是,将默认的stdout 或者stderr 转而将命令输出到某个文件中。
-
输入重定向就是,将默认的stdin 转而使用来自某个文件进行输入。
Linux shell中输出重定向的实现命令
- Linux 中使用右箭头符,或双右箭头符来重定向标准输出
#标准输出流
ls /tmp/example/
# 错误输出流
ls /tmp/example/file04
# 输出重定向, 1表示被重定向的是标准输出,>后为跟的要输出为的文件名称,若stdout.txt文件不存在,则被创建。若stdout.txt已存在,则覆盖原文件。若将>改为>>,则是将输出内容追加至文件内容后面。
ls -l /tmp/example/ 1> ./stdout.txt
ls -l /tmp/example/ 1>> ./stdout.txt
# 重定向错误输出流,将文件标识符1改为2即可
ls -l /tmp/example/file04 2> ./stderr.txt
ls -l /tmp/example/file04 2>> ./stderr.txt
# 同时重定向命令的标准输出流和错误输出流为不同文件。使用&> 将1 2 输出重定向为一个文件。
ls -l /tmp/example/file01 /tmp/example/file04 1>> ./stdout.txt 2>> ./stderr.txt
ls -l /tmp/example/file01 /tmp/example/file04 &> ./stdouterr.txt
结合echo 命令(将内容回显在终端屏幕上)和输出重定向,可以实现创建指定内容的文本文件,举例
# echo命令,-e选项表示输出转义字符
echo -e "1 apple\n2 pear\n3 banana"
echo -e "1 apple\n2 pear\n3 banana" >fruit.txt
cat ./fruit.txt
利用输出重定向命令,来实现忽略命令的错误输出(即屏幕不显示命令的错误输出)。即错误输出到 /dev/null 文件中,/dev/null非常特殊,可以视为一个“系统的黑洞”,写入到这个文件中的内容都被丢弃了。举例:
ls -l /tmp/example/file01 /tmp/example/file04 2>>/dev/null
Linux shell中输入重定向的实现命令
- Linux 中使用左箭头符,或双左箭头符来重定向标准输入
# 将标准输入重定向为外部的文件
# 介绍替换命令 tr命令和输入重定向的联合使用
# tr [准备要被替换的字符] [要替换成的字符]
# 替换fruit.txt文件的空格为制表符
tr ' ' '\t' <./fruit.txt
# 将外部文件输入重定向为标准输入
# 介绍排序sort命令和输入重定向的联合使用
# sort -k [关键字字段序号] [要排序的文本文件]
sort -k2 <<EOF
1 apple
2 pear
3 banana
EOF
#例子中的EOF 是界定符,可以自定义为其他字符(不过要注意结尾的界定符要顶格写,前后不能有任何字符或空格)。通过界定符,就将原本sort命令中需要的文本文件,重定向为标准输入。
管道
本讲介绍管道使用,管道就是一种特殊的输入输出重定向,即将一个命令的标准输出作为下一个命令的标准输入。
管道操作符是 竖线 | , 构造管道只需要使用竖线将命令连起来即可。 |
需要注意的是,管道操作符右边的命令必须要能够接受标准输入流才可以。能够接收标准输入流的命令并不多,一般为文本操作命令,常用的有 grep cut head tail less more wc tr sort
接下来介绍grep cut wc命令
举例
# 对命令的输出进行分页查看,可以逐行逐页地查看命令输出
ls -al /etc |less
# grep 是文本查找命令,兼容正则表达式
# grep [待查找文本] [待查找文件]
# 查找ls输出中带有ssh字样的行
ls -al /etc |grep 'ssh'
# 文本提取和统计, wc cut
# cut为文本切割命令, -c选项后紧跟的数字表示切割的字符列序号,可以切割多列,数字之间用逗号隔开
cat ~/install.log| cut -c1,2
# cut -d 和-f 选项,实现按指定分隔符分开的文本来切割文本。-d后紧跟分隔符,-f后紧跟的数字表示切割的字段序列号。以下命令表示,切割cat输出内容的第一个字段,字段是用冒号隔开的。
cat /etc/passwd | cut -f1 -d":"
# wc 命令,统计文本文件或者标准输出中的文本行数、单词数和字节数
# wc -l 选项表示仅统计文本行数
# 举例,统计当前用户家目录下所有目录文件的数目 (切割每一行中的第一字符列,d 表示文件类型为目录文件)
ls -al ~ | cut -c1 | grep "d" | wc -l
提醒,管道不会传递错误输出。如果不希望看到管道中的错误输出,可以将其中的某一步重定向到dev/null文件中。
ls -al /bin/sbni 2>/dev/null | wc -l