[Linux]基本I/O重定向

在我们设置定时任务的时候经常会使用标准输出和标准错误输出。这个在Linux是一个非常重要的概念,而且这个很有用。程序应该有数据库的来源端、数据的目的端,以及报告问题的地方,它们被称为标准输入、标准输出以及标准错误输出。

 

程序启动的时候,默认情况下,标准输出、输入都会已经打开,且已准备好供其使用。我们使用Xshell连接并登陆上服务器的时候,默认下终端就是标准输入、输出端。可以试试cat命令。

$ cat                                  #未指定任何的参数是,读取默认的标准输入、写入到默认的标准输出
建华是可以玩耍的小伙伴                    #用户输入(此时终端默认是标准输入)
建华是可以玩耍的小伙伴                    #程序将内容输出到标准输出(此时终端默认为标准输出)
^D                                     #输入Ctrl-D 告诉程序文件结尾

重定向与管道

Shell提供了数种语法,可以修改默认的IO的来源端和目的端,就是标准输入和输出的地方。

< 修改标准输入 sort < ucid.txt 默认下,标准输入为终端,此时可以更改为你想要的地方
<<   Command << delimiter 从标准输入中读入,直到遇到delimiter分割符
> 修改标准输出 ls -l > listinfo.txt 默认下,标准输出为终端,此时可以修改默认输出的地方。譬如可以将标准输出的内容写在文件中。
如果文件已存在,会被覆盖掉。
>>  输出附件到文件 ls -l >> listinfo.txt 与[>]不一样的是,[>]会清空原来的内容,而[>>]只是将标准输出追加到文件结尾处。
| 建立管道 program1 | program2 1. program1的标准输出为program2的标准输入;
2. 管道的执行效率比使用临时文件的程序起码高一个数量级;

 

[<]例子

场景:对文件内容的信息进行排序

[nemo@name tool]$ cat show.txt
2233803
1258962
[weiyg@name tool]$ sort < show.txt
2233803
8031001


[>]例子

场景:打印内容到文件

[weiyg@name script]$ ll
total 20
-rw-rw-r--. 1 weiyg weiyg 254 Dec 31 13:45 ssh.rb
-rw-r--r--. 1 weiyg weiyg 476 Dec 30 11:48 sshx.rb
-rw-rw-r--. 1 weiyg weiyg  12 Dec 26 16:57 test.rb
[weiyg@name script]$ ls -l > listinfo.txt
[weiyg@name script]$ cat listinfo.txt
total 20
-rw-rw-r--. 1 weiyg weiyg   0 Jan 22 21:35 listinfo.txt
-rw-rw-r--. 1 weiyg weiyg 254 Dec 31 13:45 ssh.rb
-rw-r--r--. 1 weiyg weiyg 476 Dec 30 11:48 sshx.rb
-rw-rw-r--. 1 weiyg weiyg  12 Dec 26 16:57 test.rb

在定时任务上面经常使用。因为定时任务执行的内容,不会打印到终端。如果需要查看结果的话就很麻烦。而打印到文件中的话,随时都可以查看了。不过这里往往用[>>]追加比较多。

 

[>>]例子

没啥好说的,跟[>]就是一个[>]会覆盖原有的文件,而[>>]只是追加。

 

[|]管道例子

场景:查询id为19217xxxx的玩家在1月15日使用道具的日志

[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 |grep '19217xxxx'
1389717003317|19217xxxx|2|304|305|0|
1389717005097|19217xxxx|2|303|304|0|

这是查询游戏日志的一个例子。默认下,系统会将游戏5天前的日志进行打包压缩。而此时需要查询5天前的日志的话,使用上面的方法无论在效率上还是方便上,管道都有使用临时文件无法比拟的又是。当然使用下面的方法:

[weiyg@name flash]$ bzcat *useprop.log.2014-01-15.bz2 > tem.log
[weiyg@name flash]$ grep '19217xxxx' tem.log
1389717003317|19217xxxx|2|304|305|0|
1389717005097|19217xxxx|2|303|304|0|

也可以达到相同的结果,但相比使用管道,一、需要使用临时文件,读写在磁盘需要时间;二、临时文件还需要手动删除,比较麻烦。

注:bzcat 可以直接显示压缩文件的内容

 

特殊文件:/dev/null 与/dev/tty

/dev/null  传送到此文件的数据都会被系统丢掉,,就是输出到一个空设备的意思。

/dev/tty   程序打开此文件时,Linux会自动将它重定向到一个终端。

 

文件描述符

在定时任务,我们经常在重定向的时候,喜欢这样操作。

33 1 * * * /home/weiyg/crontab/clear_logs.sh > /dev/null 2>&1

后面的 2>&1是什么意思呢,这里就要理解文件描述符和绑定重定向的概念了。

文件 文件描述符
输入文件——标准输入 0(默认为终端(网上有说默认为键盘的))
输出文件——标准输出 1(默认为终端)
错误输出文件——标准错误 2(默认为终端)

绑定重定向

Commond >&m 标准输出重定向到文件描述符m中
Command <&- 关闭标准输入
Command 0>&- 关闭标准输出

 

此时我们再去理解[2>&1],就容易多了。[2]是标准错误的文件描述符,而[>&1]的意思重定向到标准输出。那么定时任务的解释就是,将[clear_logs.sh]执行的标准输出和标准错误重定向到[/dev/null](就是丢掉输出的内容)。

我是这样理解(不一定正确)上面的定时任务的(分2部分):

clear_logs.sh > /dev/null     #将clear_logs.sh执行的标准输出输出到/dev/null
clear_logs.sh 2> /dev/null    #将clear_logs.sh执行的标准错误输出到/dev/null,只是clear_logs.sh不是执行了2次,只是1次。这里的&1代表的就是/dev/null

 //-----------------------

以上为本次学习I/O重定向的笔记。

参考资料:1. 《Shell脚本学习指南》 Arnold Robbins & Nelson H.F. Beebe著 机械工业出版社
              2. 《Linux shell的标准输入、输出和错误 》 http://blog.csdn.net/cjfeii/article/details/10084343

共勉之

时间: 2024-10-21 16:49:55

[Linux]基本I/O重定向的相关文章

ls-关于linux命令错误消息重定向

问题描述 关于linux命令错误消息重定向 这条命令ls /home/ha/a | awk '{doSomething}' 我现在想做到这种效果,如果/home/ha/a目录不存在,将错误消息输出到特定文件,但是 这个错误消息我想插入一些自己的内容,比如时间. 我知道这样做 ls /home/ha/a 2>file | awk '{doSomething}',也可以将错误消息 输出到文件,但是,这个错误消息是系统产生的,没有我自己的内容.我的意思就是说我想在这个错误消息里插入一些自己的内容.不知

linux 将debug信息重定向到LCD(屏幕)

/*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) * 说明: * 我们经常会想做的这件事就是将输出信息输出到屏幕,而不是需要debug口 * 来做这件事. * * 2016-10-4 深圳 南山平山村 曾剑锋 *********************************************************************

linux网关配置DNS重定向

1.网络拓扑: 需求:内网所有去往公网DNS流量,都转发到内网的一台DNS服务器. 源需求贴:http://bbs.51cto.com/thread-939762-1.html ----用linux测试,这种方式也可以算是一种DNS欺骗技术 2.配置步骤: A.linux网关配置: ①开启路由转发功能: echo "1" > /proc/sys/net/ipv4/ip_forward ②配置PAT: iptables -t nat -A POSTROUTING -o eth0 -

linux+nginx 301域名重定向跳转

先来看看关于 nginx 命令 last – 基本上都用这个Flag. break – 中止Rewirte,不在继续匹配 redirect – 返回临时重定向的HTTP状态302 permanent – 返回永久重定向的HTTP状态301 这个问题都会在服务器的程序码出错时出现. 第一种情况:访问A站定向到B站  代码如下 复制代码 server { server_name www.xx.com xx.com ; if ($host != 'www.xx.com' ) { rewrite ^/(

linux中nginx 301重定向跳转方法

第一种情况:访问aaaaaaa站定向到bbbbbbbbbbb站  代码如下 复制代码 •server { •server_naaaaaaame www.aaaaaaa.com ; •rewrite ^(.*) http://www.bbbbbbbbbbb.com$1 permaaaaaaanent; •} 第二种情况:不是访问aaaaaaa站的全部重定向到指定页面  代码如下 复制代码 •server { •server_naaaaaaame www.aaaaaaa.com; •if ($hos

nohup不输出日志信息的方法及linux重定向学习

起因 最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管, 过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导致硬 盘空间不足了. 解决方案 只输出错误信息到日志文件 nohup ./program >/dev/null 2>log & 什么信息也不要 nohup ./program >/dev/null 2>&1 & 知识补充,关于Linux的重定向 Linu

linux shell数据重定向(输入重定向与输出重定向)详细分析_linux shell

在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是:3-num,这个最大数字,跟用户的:ulimit –n 定义数字有关系,不能超过最大值. linux启动后,会默认打开3个文件描述符,分别是:标准输入standard input 0,正确输出standard output 1,错误输出:error outp

linux间进程通信

原文转自:http://www.cnblogs.com/linshui91/archive/2010/09/29/1838770.html 一.进程间通信概述 进程通信有如下一些目的:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.资源共享:多个进程之间

Linux下清空或删除大文件内容的5种方法

在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何 Linux 命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空文件内容的方法. 注意:在我们进一步深入了解这些方法之前,请记住: 由于在 Linux 中一切皆文件,你需要时刻注意,确保你将要清空的文件不是重要的用户文件或者系统文件.清空重要的系统文件或者配置文件可能会引发严重的应用失败或者系统错误. 前面已经说道,下面的这些方法都是从命令行中达到清空文件的目的