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

相关文章
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
355 0
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
670 1
Linux C/C++之IO多路复用(aio)
|
6月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
113 0
|
6月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
98 0
|
10月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
460 34
|
缓存 安全 Linux
Linux 五种IO模型
Linux 五种IO模型
|
12月前
|
Linux API C语言
Linux基础IO
Linux基础IO操作是系统管理和开发的基本技能。通过掌握文件描述符、重定向与管道、性能分析工具、文件系统操作以及网络IO命令等内容,可以更高效地进行系统操作和脚本编写。希望本文提供的知识和示例能帮助读者更深入地理解和运用Linux IO操作。
247 14
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
492 0
Linux C/C++之IO多路复用(poll,epoll)