Linux——管道和重定向

一、Linux的文件

linux中奉行一切皆文件,包括目录、链接(类似windows的快捷方式)、设备文件。

在内核中,所有打开的文件都使用文件描述符(一个非负整数)标记。文件描述符的变化范围是0~OPEN_MAX – 1。早期的unix系统中,每个进程最多可以同时打开20个文件,就是说文件描述符的范围为0~19,但是现在很多系统将其增加到0~63。

二、重定向

Linux系统中标准的输入设备为键盘,输出设备为屏幕,有时,我们希望能从键盘以外的其他设备读取数据,或者将数据送到屏幕外的其他设备,这种情况叫做重定向。

为何要使用命令输出重

• 当屏幕输出的信息很重要,而且我们需要将他存下来的时候;

• 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;

• 一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望他可以存下来时;

• 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;

• 错误讯息与正确讯息需要分别输出时。

1.重定向符号

> 输出重定向到一个文件或设备 覆盖原来的文件。

>! 输出重定向到一个文件或设备 强制覆盖原来的文件。

>> 输出重定向到一个文件或设备 追加原来的文件

< 输入重定向到一个程序

2. 错误重定向

2>将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件b-shell

2>>将一个标准错误输出重定向到一个文件或设备 追加到原来的文件

2>&1将一个标准错误输出重定向到标准输出

>& 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件c-shell

3.命令重向示例

在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:

1. 标准输入;代码为 0 ;或称为 stdin ;

2. 标准输出:代码为 1 ;或称为 stdout;

3. 错误输出:代码为 2 ;或称为 stderr;

 [test @test test]# ls –al > list.txt

将显示的结果输出到 list.txt 文件中,若该文件存在则予以取代!

[test @test test]# ls –al >> list.txt

将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!

[test @test test]# ls –al  1> list.txt 2> list.err

将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err

[test @test test]# ls -al 1> list.txt 2> &1

将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!

[test @test test]# ls -al 1> list.txt 2> /dev/null

将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。

三、管道

管道是一种两个进程间进行单向通信的机制。因为管道传递数据的单向性,管道又称为半双工管道。管道的这一特点决定了器使用的局限性。管道是Linux支持的最初Unix IPC形式之一,具有以下特点:

数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道);如果要进行双工通信,需要建 立两个管道。

管道只能用于父子进程或者兄弟进程间通信。,也就是说管道只能用于具有亲缘关系的进程间通信。

除了以上局限性,管道还有其他一些不足,如管道没有名字(匿名管道),管道的缓冲区大小是受限制的。管道所传输的是无格式的字节流。这就需要管道输入方和输出方事先约定好数据格式。虽然有那么多不足,但对于一些简单的进程间通信,管道还是完全可以胜任的。

管道可以将第一个命令的输出通过管道传给第二个命令,作为第二个命令的输入,使用的符号是“|”

1.命令介绍:

tee的功能

功能说明:读取标准输入的数据,并将其内容输出成文件。

语   法:tee [-ai][--help][--version][文件…]

补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。我们可利用tee把管道导入的数据存成文件,甚至一次保存数份文件。

参   数:-a 附加到既有文件的后面,而非覆盖它。如果给予tee指令的文件名称已经存在,预设会覆盖该文件的内容。加上此参数后,数据会新增在该文件内容的最后面,而不会删除原先之内容。

-i 忽略中断信号

--help 在线帮助

--version 显示版本信息

|xargs

管道是实现“将前面的标准输出作为后面的标准输入”,xargs是实现“将标准输入作为命令的参数”,你可以试试运行代码:

之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令例如:

echo "--help"|cat

echo "--help"|xargs cat

例如:删除数量比较多的文件

ls | xargs -n 20 rm -fr

ls当然是输出所有的文件名(用空格分割)

xargs就是将ls的输出,每20个为一组(以空格为分隔符),作为rm -rf的参数

也就是说将所有文件名20个为一组,由rm -rf删除,这样就不会超过命令行的长度了。

三、练习

将当前目录中的所有文件信息保存到info文件中:

在当前目录下创建文件file1和file2,分别写入内容,并将两个文件合并为新文件newfile:

向文件newfile中追加内容“hello world!”:

查看/etc目录中的文件信息,如有错误,保存在error文件中:

 

统计当前目录下的newfile中含有“hello”单词的行数:

搜索当前目录下名字为“newfile”的文件,并用cat命令显示文件的内容:

列出文本文件newfile的内容,同时复制3份副本,文件名称分别为ss-copy1、ss-copy2、ss-copy3

猜你喜欢

转载自blog.csdn.net/qq_52117201/article/details/128378087