IO重定向及管道操作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO重定向及管道操作相关的知识,希望对你有一定的参考价值。
运算器、控制器: CPU
存储器:RAM
输入/输出设备
程序:指令和数据
控制器:指令
运算器
存储器:
地址总线:内存寻址
数据总线:传输数据
控制总线:控制指令
寄存器:CPU内部的一个暂时存储器
I/O
INPUT设备
OUTPUT设备
如果程序没有指定设备,就从默认输入设备获取,输出时则输出到默认输出设备
系统设定:
默认输出设备:标准输出:STDOUT ,1
默认输入设备:标准输入:STDIN , 0
标准错误输出:STDERR , 2
标准输入:键盘
标准输出和错误输出:显示器
I/O重定向:
改变了数据的输入来源或者输出来源
对Linux而言:
输出重定向 >,会覆盖原有内容,因此称为 覆盖输出
>>, 追加输出,能够保留原有内容,在原内容底部追加新内容
输入重定向 < ,
set -C :禁止对已经存在文件使用覆盖重定向
强制覆盖输出可以使用 >|
set +C :关闭上述功能
2> :重定向 错误输出
2>> : 追加方式
既正确重定向也错误重定向 eg: ls /varr > /tmp/var3.out 2> /tmp/var3.out
&> :重定向标准输出或错误输出至同一个文件
< : 输入重定向
<< :Here Document 在此处生产文档
既能将输入的字符输出到显示器上,也能够保存在文档中?
管道:命令
命令1的输出当做命令2的输入,可以使用n重管道
命令1 | 命令2 | 命令3 ........
练习:
1.统计/usr/bin下的目录个数
#ls /usr/bin | wc -l
2.取出当前系统中所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示:
#cut -d: -f7 /etc/passwd |sort -u
3.思考:如何显示/var/log下每个文件的内容类型
#file /var/log/*
4.取出/etc/inittab文件的第6行
# head -6 /etc/inittab|tail -1
5.取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中
#tail -9 /etc/passwd |cut -d: -f1,7|tee /tmp/users
6.显示/etc目录下所有以pa开头的文件,并统计其个数
#ls -d /etc/pa*
7.不使用文本编辑器,将 alias cls=clear 一行内容添加至当前用户的.bashrc 中
#echo "alias cls=clear" >> .bashrc
在Linux系统中,数据流可分为三类:数据输入、数据输出和错误输出。相应地,每一个进程也都有三个特殊的文件描述指针:标准输入(standard input,文件描述指针为0)、标准输出(standard output,文件描述指针为1)和标准错误输出(standard error,文件描述指针为2)。这三个特殊的文件描述指针使进程能在通常情况下接受标准输入设备的输入,并让标准输出设备显示输出。
标准输入通常指传给一个命令的键盘输入。例如运行命令"ls -al",其中"-al"是传给ls命令的标准输入。标准输出是一个命令的执行结果,例如运行"cat /file1.doc"命令后所看到的文件内容就是标准输出。标准输出通常被定向到显示器。如果在执行命令的过程中发生错误,可能会生成一条错误消息,这是标准错误数据流,通常也被定向到显示器。如在上例中,如果file1.doc文件不存在,则系统会提示"cat:/file1.doc:没有此文件或目录",并从显示器输出。
有两种基本的方法可以用来重定向标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。可以利用管道把这些数据流之一输送给另外一条命令;也可以利用I/O重定向把这些数据流之一重定向到一个文件。管道及I/O重新定向是Linux系统中特有的概念。所谓管道是指将某个命令的输出结果传送到另一个命令,当成另外一个命令的输入,其代表符号是"|"。所谓I/O重定向是指将命令执行的结果重新导出到其他的设备或文件(以">"或">>"来表示),或者重新导入到其他的设备或文件(以"<"或"<<"来表示)。常用输入输出重定向命令格式与说明如表6.28所示。
表6.28 常用输入输出重定向命令格式与说明
命 令 行
说 明
命令1 > 文件1
将命令1的输出结果重定向到文件1
命令1 &> 文件1
将命令1的输出结果和标准
错误输出一起重定向到文件1
命令1 >> 文件1
将命令1的输出结果追加到文件1中
命令1 2> 文件1
将命令1的标准错误输出的
结果重定向到文件1中
命令1 < 文件1
将文件1作为命令1的标准输入
命令1 << 字符串1
允许连续输入数据,直到接收到字符串1
1.输出重定向(>)
在Linux下执行任何命令或程序时,默认情况下都将把结果输出到屏幕,但是有时用户希望将标准输出保存到一个文件中,此时就可以使用输出重定向的功能。例如为/etc目录下的所有文件建立一个清单,并保存到/etc_list文件中,命令行为:
# ls /etc > /etc_list
# cat /etc_list //查看建立的列表文件
a2ps.cfg
a2ps-site.cfg
acpi
adjtime
... ...
在执行上例中的"ls"命令时,由于原来的输出对象的输出内容都已重新定向到/etc_list文件中,因此屏幕不会再显示任何输出结果。重定向的文件,如本例中的/etc_list,不需预先创建,系统在执行此命令时若发现重新定向的文件不存在,则会自动生成命令中指定的文件。若文件已经存在,则会进行写覆盖。可以使用附加输出重定向(>>)把新添加的数据追加到已存在文件的尾部,以避免写覆盖的发生。
利用前面介绍过的"cat"命令,配合输出重定向操作,可以将数据直接从键盘录入到文件中,例如创建file1.doc文件并录入"Hello world !!!", 按Ctrl+c或Ctrl+d组合键可以结束文件的编辑。相应命令行为:
# cat > file1.doc
Hello World!!! //按Enter键
按或组合键
#
在输入完毕后先按Enter键(否则最后一行不会存储),再按Ctrl+c或Ctrl+d组合键就可结束文件的编辑,系统会将此内容以file1.doc文件名进行存储。
2.附加输出重定向(>>)
如果重新定向的文件原来已经存在,那么在使用输出重定向(>)给文件输入新的数据后,新数据将覆盖所有旧的数据。在硬盘空间足够的条件下,为了避免覆盖旧数据,可以采用Linux提供的"附加输出重定向"(>>)技术。附加输出重定向操作可以将新输入的数据附加(Append)在原有旧数据之后,表示符号为">>"。从下例中可以看出输出重定向与附加输出重定向的区别:
# cat file1.doc
Hello World!!! //源文件内容
# cat > file1.doc
This is a new world!
# cat file1.doc
This is a new world! //源文件内容被覆盖
# cat >> file1.doc
I like this world.
# cat file1.doc //附加在源文件后
This is a new world!
I like this world.
3.输入重定向(<)
输出重定向与输入重定向相反,前者是将命令或程序的执行结果通过屏幕或文件来输出,后者是将输入设备(如键盘或文件)提供给命令来执行。例如下面的程序对/etc目录进行备份,其中使用了输入重定向来读入file文件的内容:
#!/bin/sh
i=0;
find / -name etc > file;
while read LINE
do
DIRS=$LINE
BACKUP="/tmp/backup${i}.tar.gz"
tar -zcvf $BACKUP $DIRS
i=$(($i+1))
done < file
4.附加输入重定向(<<字符串)
附加输入重定向经常用于电子邮件系统中,可以让用户自行定义一个字符串,例如exit,系统在收到此字符串前,会持续地将数据输入文件。下面是一个编写电子邮件的范例,定义的结束字符串是"exit",用户可以连续输入邮件内容,直到输入"exit":
# mail [email protected] << exit
> This mail is a test.
> exit
5.错误输出重定向(2>)
输出重定向(>)操作在命令执行发生错误时,将把错误信息直接显示在屏幕上,并且不记录到文件中。而错误输出重定向(2>)会在命令执行发生错误时,将错误信息直接输入到文件中,不会再将信息结果显示在屏幕上。例如:
# ls
cal_txt finger2_txt groups_txt last_txt
newgrp_txt suple_txt who.txt
file1.doc finger3_txt groups_txt2 ll
suple3_txt suple_txt~ w.txt
file2.doc finger_txt id_txt ln
suple3_txt~ w
# ls exec
ls: exec: 没有那个文件或目录
# ls exec 2> example
# cat example
ls: exec: 没有那个文件或目录
6.标准输出与错误输出重定向(&>)
标准输出与错误输出重定向(&>)可以将标准输出和错误输出信息一并重定向到文件,屏幕上不会显示任何信息,例如:
# ls
cal_txt file2.doc finger_txt id_txt
ln suple3_txt~ w
example finger2_txt groups_txt last_txt
newgrp_txt suple_txt who.txt
file1.doc finger3_txt groups_txt2 ll
suple3_txt suple_txt~ w.txt
# ls id_txt file
ls: file: 没有那个文件或目录
id_txt
# ls id_txt file 2> doc //将错误输出重定向到文件doc
id_txt
# cat doc
ls: file: 没有那个文件或目录
# ls id_txt file &> doc //将标准输出与错误输出一并重定向到文件doc
# cat doc
ls: file: 没有那个文件或目录
id_txt
7.管道(Pipe)
在Linux系统中,管道的主要功能是将其他程序的输出结果直接导出到另一个程序来做输入数据,即将前一个程序的输出作为后一个程序的输入,符号表示为"|"。管道的语法格式为:
命令1 | 命令2 [ | 命令3 … ]
可以将标准错误输出一起送入管道,命令格式为:
命令1 |& 命令2 [ |& 命令3 … ]
例如将ps命令的输出结果作为more命令的输入,以实现分页查看进程信息,命令行为:
#ps -aux | more
再如以长格式查看/etc目录下的所有文件。由于/etc目录下的文件很多,因此直接使用"1s -al"命令显示的内容会很快卷过屏幕,无法仔细查看。可以利用管道将"1s -al"命令的执行结果输入more或less命令,实现分页显示,命令行为:
#ls -al | less
本文出自 “11862607” 博客,请务必保留此出处http://11872607.blog.51cto.com/11862607/1851381
以上是关于IO重定向及管道操作的主要内容,如果未能解决你的问题,请参考以下文章