「原创首发」Linux命令核心技术:管道IO

RHEL7-I/0重定向及管道

本节所讲内容:

  • 文件描述符 0、1、2
  • 输入输出重定向使用
  • 管道的使用


linux下一切皆文件。文件又可分为:普通文件、目录文件、链接文件和设备文件

Linux系统中使用文件来描述各种硬件,设备资源等

例如:以前学过的硬盘和分区,光盘等设备文件

sda1 sr0

第1章 重定向的含义

文件描述符定义:

是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以标明每一个被进程所打开的文件,程序刚刚启动的时候,第一个打开的文件是0,第二个是1,依此类推。也可以理解为是一个文件的身份ID

用户通过操作系统处理信息的过程中,使用的交互设备文件(键盘,鼠标)

「原创首发」Linux命令核心技术:管道IO

[root@panda ~]#cd /proc/{PID}/fd --->查看一个进程打开了哪些文件

文件描述符限制:

因为文件描述符是系统的一个重要资源,一般来说系统有多少内存就可以打开多少的文件描述符,但是实际系统内核还是会做一些限制的,正常情况下一个系统最大打开文件数是内存的10%左右,我们也叫系统级限制,可以通过以下命令查看

「原创首发」Linux命令核心技术:管道IO

同时,系统内核为了不让某一个单独进程消耗掉所有的文件资源,它对单个的进程可以打开的最大文件数也做了限制,我们叫它用户级限制

1.1 输入输出标准说明

STDIN 标准输入 默认的设备是键盘 文件编号为:0

命令将从标准输入文件中读取在执行过程中需要输入的数据,数据来源于文件,

STDOUT 标准输出 默认的设备是显示器 文件编号为:1

命令执行后的输出结果,发送到标准输出文件,结果输出到文件

STDERR 标准错误 默认的设备是显示器 文件编号为:2

命令将执行期间的各种错误信息发送到标准错误文件,错误信息发送到文件

标准输入,标准输出和标准错误默认使用键盘和显示器作为关联设备与操作系统进行交互完成最基本的输入,输出操作.

1.2 重定向输出

定义:将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上

重定向输出使用”>” “>>” 操作符号

屏幕显示的内容(123) >> 新的文件 (a.txt)

  • 1>  覆盖文件内容
  • >> 追加内容
  • 若重定向的输出的文件不存在,则会新建该文件


例1:查看当前主机的CPU的类型保存到kernel.txt文件中(而不是直接显示到屏幕上)

「原创首发」Linux命令核心技术:管道IO

[root@panda ~]#uname –a > kernel.txt

例2:将内核的版本信息追加到kernel.txt

「原创首发」Linux命令核心技术:管道IO


<code>

1.3 重定向输入

将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入

从文件读取数据 操作符: “ < ” 等价于 0<

<< 表示结束输入的内容,常用来配合eof使用

好处:通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成

例1:

<code>[root@panda ~]# mail -s "nihao" alice

[root@panda ~]# mail -s "nihao" alice < /etc/hosts/<code>

例2:

<code>[root@panda ~]# grep root /etc/passwd

[root@panda ~]# grep root < /etc/passwd/<code>

例3:在脚本中我们可以通过重定向来打印消息菜单


<code>[root@panda ~]# vim xuegod.sh

#!/bin/bash

cat <
---------------------------

1.mysql

2.oracle

3.http

---------------------------

eof
/<code>

例4:mysql的数据导入

[root@panda ~]# mysql –uroot –p123456 < worepree.sql

1.4 错误重定向

将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器

作用:错误信息保存到文件

操作符: 使用2>

2指的是错误文件的编号 (在使用标准的输入和输出省略了1、0 编号)

在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中,以保持脚本输出的简洁

  • 例4: 使用tar命令进行备份的时候出现新的错误信息保存到err.log文件中
<code>[root@panda ~]# tar cf kernel.tar b.txt /a/aa/a xxx

[root@panda ~]# tar cf kernel.tar b.txt /a/aa/a xxx  2>err.log/<code>

注:使用 2> 操作符时,会像使用 > 一样覆盖目标文件的内容,若追加而不覆盖文件的内容即可使用 2>> 操作符

=======================================

从哪输出信息 > 输出到哪个地方

输出到哪个地方grep root < 从哪输出信息 /etc/passwd

========================================

输入一个 > 会造成文件内容覆盖

输入二个 >> 是属于追加,不会覆盖原有文件内容

========================================

1.5 null黑洞

把/dev/null看作"黑洞". 它等价于一个只写文件。所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而 /dev/null对命令行和脚本都非常的有用.

「原创首发」Linux命令核心技术:管道IO

<code>[root@panda ~]#rm a

[root@panda ~]# rm a 2> /dev/null/<code>

我们也可以通过echo $?来判断上条命令执行成功与否

还有一个特殊设备:/dev/zero , /dev/sr0

<code>[root@panda ~]# dd if=/etc/hosts of=a.txt

[root@panda ~]# dd if=/dev/zero of=file.txt bs=1M count=10/<code>

第2章 特殊符号

2.1 输出到不同文件

正确的写到一个文件,错误的再写到一个文件

[root@panda ~]# ls /tmp/xxxxx > a.txt 2> b.txt

2.2 &>符号

&> 混合输出 & :表示等同于的意思

例1:把正确和错误的信息都输入到相同的位置

1>&2 意思是把标准输出重定向到标准错误

2>&1 意思是把标准错误输出重定向到标准输出

「原创首发」Linux命令核心技术:管道IO

<code>[root@panda ~]# ls /home/  /aaaaa >list.txt 2>&1

[root@panda ~]# ls xxxx /root 2>err.log 1>&2/<code>

例2:把正确和错误的信息都输入到相同的位置

&> filename 意思是把标准输出和标准错误输出都重定向到文件filename中

「原创首发」Linux命令核心技术:管道IO

注:它是不分正确的还是错误的

[root@panda ~]# ls oracle /root &> c.txt

生产中的例子写法

「原创首发」Linux命令核心技术:管道IO


<code>[root@localhost ~]# ls /mnt /xxx 2>&1 | tee c.txt/<code>

#讲标准输出和标准错误输出都输出到屏幕 且 都保存在一个文件中

2.3 管道-|

语法:command-a | command-b | command-c | ......

「原创首发」Linux命令核心技术:管道IO

注意:

1、管道命令只处理前一个命令正确输出,不处理错误输出

2、管道命令右边命令,必须能够接收标准输入的数据流命令才行

3、管道符可以把两条命令连起来,它可以链接多个命令使用

[root@panda ~]# ps aux | grep httpd | head -4 | wc –l

下面这个是不可以的,因为ls不支持标准输入,它只支持命令行参数

因为管道的作用是把它左边的应该在屏幕上显示的内容传递给(或者说流向右边),所以只有右边的命令支持标准的输入流才可以

<code>[root@panda ~]# cat /etc/hosts

[root@panda ~]# cat /etc/hosts | ls   ---->出来的结果是我们想要的吗?/<code>

如果加上xargs,它表示把前面的内容的数据流转换为一个个命令参数,然后传给ls使用

<code>

2.3.1 管道与重定向的区别

  • 管道

左边的命令应该有标准输出 | 右边的命令应该接受标准输入

管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行

管道两边都必须是shell命令

  • 重定向

左边的命令应该有标准输出 > 右边只能是文件(可以是普通文件、文件描述符、设备文件)

左边的命令应该需要标准输入 < 右边只能是文件

<code>[root@panda ~]# grep alias < .bashrc^C

[root@panda ~]# grep alicas < .bashrc |tail -2/<code>

第3章 tee命令

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

语法:tee [-a][--help][--version][文件...]

参数:

  • -a或 --append  追加
  • --help  在线帮助
  • --version  显示版本信息

tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件

「原创首发」Linux命令核心技术:管道IO

  • 例1:将用户登陆信息输入到who.out文件
<code>[root@panda ~]# df -h|tee file-1|grep boot|awk '{print $5}'

[root@panda ~]# df -h|grep boot|tee file-2|awk '{print $5}'

[root@panda ~]#df -h|grep boot|awk '{print $5}'|tee /dev/pts/2/<code>
  • 例2:追加内容到文件
<code>[root@panda ~]# df -h|tee -a file-1|grep dev|awk '{print $5}'/<code>



分享到:


相關文章: