Linux--I/O重定向与管道

发布时间 2023-11-27 22:28:12作者: oushijiel
  • 首先用一个例子来描述重定向的含义:

  在生产环境中,每天凌晨需要备份娄据库,这时工作人员会编写一个简单的脚本创建计划任务,把脚本执行结果放到一个或几个文件中以便第二天查看,这个过程就叫重定向。在使用“psaux”命令时,为了快速找到所需信息,经常使用grep命令进行过滤,此时就需要使用管道符。

 下面是一些进行I/O重定向的基本命令操作:

1.查看自己是第几个终端:

[root@qfedu~]# tty

2.显示当前时间:

[root@qfedu~]# date

如果在date后面添加>指向此文件,即定向于此文件:

[root@qfedu~]# date > date.txt

3.在输入ls查看/proc虚拟文件时,文件后面经常有->符号,以及0,1,2这三个数字,这些又代表什么含义呢?

其实这些是绝大多数进程都有的,其中0表示标准输入,可以理解为键盘输入;1表示标准输出,输出到终端;2表示标准错误,输出到终端;3及以上为常规文件的描述符。

具体如下图:

 

 例如,date命令在默认情况下将输出结果显示在终端,此时文件描述符为1。现在改变输出的方向,从终端改为date.txt文件,这个行为叫作重定向,具体如下所示。

4.重定向:[root@qfedu~]# date 1> date.txt

改变文件描述符为2(标准错误),如果命令正确,结果在终端显示,如果命令错误,结果会输出在终端上,再重新定向到date文件中,即将错误信息写入文件中。

[root@qfedu~]# date 2> date.txt

显示时间

[root@qfedu~]# linux 2> date.txt

[root@qfedu~]# cat date.txt

bash:linux:未找到命令...(错误信息)

文件描述符为0,表示为标准输入:

[root@qfedu~]# cat 0< (重定向的路径)

文件描述符的含义见下图:

 输出重定向分为正确与错误输出两种:

正确输出:1>,1>>;(1可省略)

错误输出:2>,2>>;

>表示覆盖,>>表示追加。

5.输出重定向(覆盖)

 [root@qfedu~]# date 1> date.txt  (date结果输出到date文件)

6.输出重定向(追加)

[root@qfedu~]# date >> date.txt(在文件尾部追加)

7.错误重定向:

[root@qfedu~]# ls /home/linux 2> error.txt (前提是/home/linux不存在,这样才会输出错误信息)

综合应用:

8.正确结果与错误结果都输出到相同位置:

[root@qfedu~]# ls /home/ /linux &>list.txt

9.正确结果与错误结果都输出重定向到相同位置:

[root@qfedu~]#  ls /home/ /linux >list.txt 2>&1

>&n 使用系统调用 dup (2) 复制文件描述符 n 并把结果用作标准输出
<&n 标准输入复制自文件描述符 n
<&- 关闭标准输入(键盘)
>&- 关闭标准输出
n<&- 表示将 n 号输入关闭
n>&- 表示将 n 号输出关闭

10.输入重定向:

使用grep命令过滤root,输入端默认为键盘,接着将输入重定向到/etc/passwd。

[root@qfedu~]#  grep ‘root’

linux

wwww.qfedu.com

[root@qfedu~]#  grep 'root' </etc/passwd

11.dd命令读取数据:

[root@qfedu~]# dd if = /dev/zero of=/file01.txt bs=1M count2  (bs为每次写入多大的信息,count是一共写多少次)

拓展:

cmd >a 2>a 和 cmd >a 2>&1 为什么不同?
cmd >a 2>a :stdout和stderr都直接送往文件 a ,a文件会被打开两遍,由此导致stdout和stderr互相覆盖。
cmd >a 2>&1 :stdout直接送往文件a ,stderr是继承了FD1的管道之后,再被送往文件a 。a文件只被打开一遍,就是FD1将其打开。

他们的不同点在于:
cmd >a 2>a 相当于使用了FD1、FD2两个互相竞争使用文件 a 的管道;
而cmd >a 2>&1 只使用了一个管道FD1,但已经包括了stdout和stderr。
从IO效率上来讲,cmd >a 2>&1的效率更高。
重定向综合案例:

利用重定向建立多行文件(命令行)。
(1)使用 echo 命令重定向并不能建建立多行文件,一般使用cat 命令,在键盘上输入文本按回车键换行,完成后按组合键Ctrl+d 结束。

“>”表示覆盖,但在此处是指覆盖原来的file03.txt,输入的3 行文本一次输出到 file03.txt。如果退出后再次输出,那将覆盖掉先前的文本内容,此时就需要用“>>”进行追加。
(2)每次写入文本都需要按组合键Ctr 1+d 结束显得比较烦琐,用户可以自定义 个结束的符号,通常使用“EOF”。

利用重定向建立多行文件(脚本)。
(3)命令行和脚本都可以操纵Shell。 在命令行中可以用组合键Ctrl+d退出, 但在脚本中不可以。下面利用脚本创建多行文件,在脚本文件中写入文本,并加入“EOF”结束符号。

 (4)使用bash执行脚本

 (5)在编写脚本时,为排版整齐,经常在EOF前面使用tab键缩进,同时输入重定向符后添加“-”。

 多条命令输出重定向

(6)如果需要将两条命令输出都重定向,则需要添加括号:

 (7)让命令在后台运行,并且输出重定向到文件。

(8)终止后台程序:

 

管道综合案例

管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制车输出到其他程序。管道的作用是把上一个进程的]输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起
将/etc/passwd中的用户按UID数值大小排序并显示前3行

 统计出最占CPU的5个进程

   

以上就是关于Linux--I/O重定向与管道的一些基本内容了。