开发者学堂课程【Linux企业运维实战 - 入门及常用命令:Linux 面试必备 -IO 重定向及管道高级进阶】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/550/detail/7607
Linux 面试必备 -IO 重定向及管道高级进阶
内容介绍:
一、把输出和错误重新定向到文件
二、tr 命令
三、从文件中导入 STDIN
四、把多行发送给 STDIN
五、管道
六、管道中 - 符号
七、重定向到多个目标( tee )
一、把输出和错误重新定向到文件
◆2>覆盖重定向错误输出数据流
◆2> >追加重定向错误输出数据流
◆标准输出和错误输出各自定向至不同位置
COMMAND > /path/to/file.out 2> /path/to/error.out
◆合并标准输出和错误输出为同一个数据流进行重定向
➢&>覆盖重定向
➢&>>追加重定向
➢COMMAND > /path/to/file.out 2>&1 (顺序很重要)
➢COMMAND >> /path/to/file.out 2>&1
➢():合并多个程序的 STDOUT
( cal 2007 ; cal 2008 ) > all.txt
回顾上节内容,一些基本命令,包括帮助的用法以及一些标准的 IO 重定向,其中标准IO重定向介绍了标准的输入输出,以及标准输入的重定向。
所谓重定向就是改变方向,我们默认情况下,标准输入设备、标准输出设备还有标准错误,这三个分别是用什么设备来实现功能的呢?标准输入默认是用键盘,标准输出以及错误都是终端窗口。
通常来讲,重定向用的最多的就是文件,可以用文件来代替默认设备,也就是标准输出和错误可以放到文件里面。命令为标准输出>文件名,将标准输出重定向到文件里。
两个“大于号”为追加,对于标准错误即为两个“>”。
如果在一个命令中想分别重定向到不同的文件中,可以写1>文件名,2>另一个文件名,这样标准输出和标准错误就被重定向到不同的文件中。
如果想重定向到同一个文件中,有好几种方法:cmd &> all. 1og; cmd >all. log 2>&1; cmd 2>all. log 1>&2。
标准输入的重定向为输入“aaaa”,又输出为“aaaa”,但不是你所有命令都有标准输出,要看他的具体命令,有些命令要求标准输入,有些命令有标准输出,有些命令什么都没有。
二、tr 命令
◆tr 转换和删除字符
◆tr [OPTION... SET1 [SET2]
◆选项:
-c -c --complement : 取字符集的补集
-d --delete : 删除所有属于第一字符集的字符
-S --squeeze-repeats : 把连续重复的字符以单独一个字符表示
-t --truncate-set1 : 将第一个字符集对应字符转化为第二个字符集对应的字符
◆[:alnum:] :字母和数字[:alpha:] :字母[:cntrl:] :控制(非打印)字符[:digit:] :数字
[:graph:] :图形字符[:lower:] :小写字母[:print:] :可打印字符[:punct:] :标点符号
[:space:] :空白字符[:upper:] :大写字母[:xdigit:] :十六进制字符
“tr”为“translate”或者“delate characters”转换、翻译或是删除的意思。
举例:
1.tr 什么也不跟,报错语法错误。
2.tr 跟SET1 [SET2]如 # tr ‘a-z’ ‘A-Z’,显示为等待输入,这时随便输入一些字符,回车后发现实现了转换功能,将第一个字符集转换为对应的第二个字符集,小写字母变为了大写字母。
3.用文件的重定向实现标准输入的重定向, tr ‘a-z’ ‘A-Z’ < 文件,可以将文件中的小写字母转换为大写字母,还可以同时又输出出来。还可以有别的定向,比如 tr ‘abcd’ ‘1234’ 即为将文件中的 abcd 都转换为1234。位数不匹配则按位数少的进行转换。
4.使用 tr 命令删除,比如 tr –d ‘abc’,则将输入中所有的 abc 删除后输出。
5.c 为取反, tr –dc ‘abc’ 为对 abc 取反后删除,意思为一串字符只留 abc。
6.-s 为压缩,即 tr –s ‘abc’ 命令之后,将重复连续的 acd 例如 aaaabbbbcccc 压缩为 abc,不连续则不压缩。
三、从文件中导入 STDIN
◆使用<来重定向标准输入
◆某些命令能够接受从文件中导入的 STDIN
tr 'a-z' 'A-Z'< /etc/issue
该命令会把 /etc/issue 中的小写字符都转换成写写字符
◆tr-d abc < /etc/fstab删除 fstab 文件中的所有 abc 中任意字符
◆cat > file .
mage
wangxiaochun
按 ctrl+d 离开,可以使用文件来代替键盘的输入
◆Cat > filea < fileb
使用 cat > f2 命令时,还未输入任何内容,回车后 f2 的内容被清空,如果输入字符再回车,就会拥有字符,只要回车就会进行重定向,这叫单行重定向。但是这种重定向效率不高。
四、把多行发送给 STDIN
◆使用“<<终止词”命令从键盘把多行重导向给 STDIN
➢直到终止词位置的所有文本都发送给 STDIN
➢有时被称为就地文本( heretext )
mail -s "Please Call" admin@ magedu.com <
> Hi Wang,
>
> Please give me a call when you get in. We may need
> to do some maintenance on server1.
>
> Details when you're on-site
> Zhang
> END
必须有多行开始和结束的标记,可以拿任意一个符号做终止符,从他开始就必须由同一个符号结束。
多行重定向就是写很多行,统一提交重定向。
mail 命令是用来发邮件的,比如说输入 mail –s ‘hello’ wang 命令回车之后就可以输入内容作为给 wang 账号发邮件的正文内容,注意正文内容输入结束之后敲“.”作为征文结束的符号。
切换 wang 账号登录,敲 mail 就会查看有无邮件,输“1”就可以接收邮件内容。当然发邮件也可以使用多行重定向,这时候就不用敲“.”。
也可以批量发邮件,比如现在写一个邮件正文,用 cat mail.txt 命令写完之后,就可以用 mial –s ‘hello’ wang
在标准重定向里也可以嵌入变量,嵌入命令以实现给不同的人发不同的邮件。
五、管道
◆管道(使用符号"|" 表示)用来连接命令
命令1 |命令2 |命令3 |...
➢将命令1的 STDOUT 发送给命令2的 STDIN,命令2的 STDOUT 发送到命令3的 STDIN
➢STDERR 默认不能通过管道转发,可利用2>&1或|&实现
➢最后一个命令会在当前 shell 进程的子shell 进程中执行用来
➢组合多种工具的功能
Is
| tr
'a-z' 'A-Z'
◆less : 一页一页地查看输入
Is-| /etc| less
◆mail :通过电子邮件发送输入
echo "test email" | mail -S "test" user@ example.com|
◆Ipr :把输入发送给打印机
echo "test print"| Ipr -P printer_ name
只有一个管道时,命令一可能有标准输出,命令二需要标准输入,正好把这两个组合起来,将命令一的标准输出正好作为命令二的标准输入。
比如说 hostname | tr 'a-z' 'A-Z' 就可以输出需要的,一次完成不了的还可以多次使用管道。
管道要求前面的必须有标准输出,而不是标准错误,错误不进行处理。但是有些命令会带有一些错误,现在希望就算有错也可以作为标准输入就可以使用 2>&1 命令使错的也识别成对的。
假如要算1+2+3…+100,出这种题目的人希望你用循环来做,但是其实普通的管道就可以实现,命令为 echo {1..100}丨tr ‘ ’ +丨bc,得出结果为5050.
但是实际上还有更简便的写法,seq 命令就可以实现,seq 1 10就是1到10,seq 1 100就是1到100,同时其中还可以加入分隔符。
用 seq –s + 100丨bc 就可以实现1到100相加,结果为5050.
六、管道中 - 符号
◆示例: .
将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将tar -cvf - /home传送给后面的tar -xvf - ,后面的这个-则是取前一个命令的stdout,因此,就不需要使用临时file了
◆tar -cvf - /home| tar -xvf –
Tar的功能是打包或者解包,可以把多个目录打包成一个文件,打包后再解包的话用同一个文件名,就可以用 – 代替。Cvf 就是打包,xvf 就是解包。
七、重定向到多个目标( tee )
◆命玲1| tee [-a]文件名| 命令2
把命令1的 STDOUT 保存在文件中,做为命令2的输入-a追加
◆使用:
➢保存不同阶段的输出
➢复杂管道的故障排除
➢同时查看和记录输出
一个命令被重定向到文件里,在屏幕上就不会进行显示,使用>就是说明标准输出重定向到后面的文件,如果既想把文件重定向又想显示,可以使用 tee 命令,使用 ls | tee ls.log 命令管道输出给 tee 命令就可以实现把 ls 既重定向又显示。
练习
◆1、将 /etc/issue 文件中的内容转换为大写后保存至 /tmp/issue.out 文件中
◆2、将当前系统登录用户的信息转换为大写后保存至 /tmp/who.out 文件中
◆3、一个 linux 用户给root发邮件,要求邮件标题为"help" , 邮件正文如下:
Hello, i am用户名,The system version is here,please help me to check it ,thanks!
操作系统版本信息
◆4、将 /root/ 下文件列表,显示成一行,并文件名之间用空格隔开
◆5、计算1+2+3+.. +99+ 100的总和
◆6、删除 Windows 文本文件中的 ‘^M’ 字符
◆7、处理字符串“xt.I 1 jr#!$mn2 c*/fe 3 uz 4”, 只保留其中的数字和空格
◆8、将 PATH 变量每个目录显示在独立的一-行
◆9、将指定文件中0-9分别替代成 a-j
◆10、将文件/etc/centos-release中每个单词 (由字母组成 )显示在独立的一行,并无空行
答案:
1、将 /etc/issue 文件中的内容转换为大写后保存至
/tmp/issue.out 文件中:
tr ‘[:lower:]’ ‘[:upper:]’ < /etc/issue > /tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至 /tmp/who.out 文件中:
who | tr ‘[:lower:]’ ‘[:upper:]’ > /tmp/who.out
3、一个 linux 用户给root发邮件,要求邮件标题为"help" , 邮件正文如下:
Hello, i am用户名,The system version is here,please help me to check it ,thanks!
操作系统版本信息:
用户名就是登录的名字
Lsb_release –a
当然如果要显示当前的用户名,系统中有一个变量支持,就是 user,就是使用 echo $user 命令,嵌入变量和命令使用 mail –s help root <<123,接着嵌入命令 Hello, i am $user,The system version is here,please help me to check it ,thanks!,接着操作版本使用 OS version :Lsb_release –a,接着用123结尾,整体为:
mail –s help root <<123,
> Hello, i am $user,The system version is here,please help me to check it ,thanks!
> OS version :Lsb_release –a
> 123
4、将 /root/ 下文件列表,显示成一行,并文件名之间用空格隔开:
默认情况下 ls 命令是用来换行的,命令为 ls | tr ‘\n’
5、计算1+2+3+.. +99+ 100的总和:
echo {1..100}丨tr ‘ ’ +丨bc 或者是 seq –s + 100丨bc
6、删除 Windows 文本文件中的 ‘^M’ 字符:
使用 cat –A win.txt 查看,再通过 tr –d ‘\r’ < win.txt > win4.txt 命令删除。