Linux 面试必备 -IO 重定向及管道高级进阶 | 学习笔记

简介: 快速学习Linux 面试必备 -IO 重定向及管道高级进阶

开发者学堂课程【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 |...

将命令1STDOUT 发送给命令2STDIN,命令2STDOUT 发送到命令3STDIN

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  命令删除。

相关文章
|
4月前
|
Linux 数据处理 C语言
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(下)
71 0
|
4月前
|
Linux 编译器 C语言
【Linux】基础IO----理解缓冲区
【Linux】基础IO----理解缓冲区
59 0
【Linux】基础IO----理解缓冲区
|
4月前
|
缓存 网络协议 算法
【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)
在Linux环境下,主要存在四种IO模型,它们分别是阻塞IO(Blocking IO)、非阻塞IO(Non-blocking IO)、IO多路复用(I/O Multiplexing)和异步IO(Asynchronous IO)。下面我将逐一介绍这些模型的定义:
166 1
|
5月前
|
算法 安全 网络协议
java高级面试题_java面试题大全带答案_线程面试题_java面试宝典2019
java高级面试题_java面试题大全带答案_线程面试题_java面试宝典2019
|
5月前
|
Linux C++
c++高级篇(三) ——Linux下IO多路复用之poll模型
c++高级篇(三) ——Linux下IO多路复用之poll模型
|
4月前
|
Linux C语言 C++
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
【Linux】基础IO----系统文件IO & 文件描述符fd & 重定向(上)
45 0
|
4月前
|
监控 Unix Linux
Linux中AWK命令的高级应用与案例分析
Linux中AWK命令的高级应用与案例分析
|
5月前
|
Linux 网络安全 开发工具
【linux】基础IO |文件操作符
【linux】基础IO |文件操作符
38 0
|
5月前
|
人工智能 运维 中间件
Linux 常用进阶指令
Linux 常用进阶指令
37 0
|
5月前
|
算法 Linux Shell
c++高级篇(一) —— 初识Linux下的进程控制
c++高级篇(一) —— 初识Linux下的进程控制