Linux基础知识之IO重定向及管道详解,快速清空
分类:系统操作

高效清空linux下文件文件内容

1.[[email protected] huage]# : > filename
:是贰个占位符,不会生出别的输入

2.[[email protected] huage]# > filename
同样不会生出另外输出

3.[[email protected] huage]# echo "" > filename
会看到一行空行,文件大小是1byte

4.[[email protected] huage]# echo > filename
会看出一行空行,文件大小是1byte

5.[[email protected] log]# cat /dev/null > filename
文件不会发生其余输出

1.[[email protected] huage]# : filename :是三个占位符,不会爆发任何输入 2.[[email protected] huage]# filename 同样不会爆发别的输...

Linux基础知识之IO重定向及管道详解(关于tr、tee命令)

自笔者在刚最初接触IO重定向时,经历了由懂到不懂然后精晓的进程,当然未来的本身也不或者说对于IO重定向就根本懂了,只是在消除一些难题或促成有个别结果时不会因为IO重定向的标题而迷惑了。

什么叫IO重定向?

为了讲解那些难点,大家要先清楚怎么样叫IO,什么叫做程序的数据流。
    什么叫IO?
在Linux或计算机领域IO指的是音讯的输入和输出。
在Linux中可用于输入的器具:文件(Linux中全体皆文件)

切切实实包涵:键盘设备、文件系统上的正规文件、网卡等。
在Linux中用来出口的设备:文件
切切实实包涵:显示屏、文件系统上的健康文件、网卡等。
    什么叫做数据流?
笔者们经常描述的音信本质上的话都以数额,因为新闻处于动态,大家就将新闻也许命令等概念称作流动的数码约等于数据流。
多少流分为输入流(InputStream)和输出流(OutputStream)两类。输入流只可以读不能写,而输出流只可以写不能够读。常常程序中选择输入流读出多少,输出流写入数据,就如数据流入到程序并从程序中流出。选取数据流使程序的输入输出操作独立与有关道具。输入流可从键盘或文件中获取数量,输出流可向荧屏、打字与印刷机或文件中传输数据。
    在Linux中,程序的数据流有三种:
输入的数据流:←标准输入 STDIN 常用设施:键盘
出口的数据流:→标准输出 STDOUT 常用道具:终端
荒唐输出流: →错误输出 STDEOdyssey索罗德 常用设施:终端
在Linux中开拓二个文件,在该文件被加载成功后对于系统的话供给用三个数字代表,那个数字叫做fd:file descriptor 文件陈诉符。
因为Linux系统中全体皆文件,所以对应的正规化输入设备,标准输出设备,错误输出设备都有其对应的fd
    标准输入:0
    标准输出:1
    错误输出:2
    IO重定向的意趣正是将系统本来默许的输入输出的路径重新定向到别的文件。

本人清楚解释到此处如故会很思疑,别焦急,这几个定义需求经过轻松的实验来申明。

 


    输出重定向

    其常用 >、 >> 、>|那三种象征
    >:覆盖输出  >>:追加输出  >|:强行覆盖
因为使用>不当会对原有的数据变成一点都不小的影响,所以不常我们会手动设定关闭>的个性。其命令为:
set -C禁止覆盖输出重定作用
set +C为展开覆盖输出重定向成效
然则上述命令对“>|”无效
上边以现实实验来注解方面内容
试验蒙受:在/test/目录下

[[email protected] test]# ll
总用量 0
[[email protected] test]# echo $(date) > t1
[[email protected] test]# ll
总用量 4
-rw-r--r--. 1 root root 43 8月  2 18:15 t1
[[email protected] test]# cat t1
2016年 08月 02日 星期二 18:15:28 CST
[[email protected] test]# echo test > t1
[[email protected] test]# cat t1
test
[[email protected] test]# echo $(who) >> t1
[[email protected] test]# cat t1
test
root :0 2016-08-02 10:12 (:0) root pts/0 2016-08-02 10:12 (192.168.85.1) root pts/1 2016-08-02 10:19 (192.168.85.1)
[[email protected] test]# set -C
[[email protected] test]# echo 111 > t1
-bash: t1: 不或然覆盖已存在的文本
[[email protected] test]# echo 111 >| t1
[[email protected] test]# cat t1
111

下边包车型的士结果彰显了>、>>、>|三者的独家职能

相信看到这里对于输入重定向会有了更为的认知。

 


    错误输出流重定向
    2>

[[email protected] test]# echoo 1 > t2
bash: echoo: 未找到命令...

当命令错误时,shell会重回错误音讯,若我们想将错误音讯存到某些文件则可按如下操作
[[email protected] test]# echoo 1 2> t2
-bash: t2: 无法隐敝已存在的文书
[[email protected] test]# ll
总用量 4
-rw-r--r--. 1 root root 4 8月  2 18:18 t1
-rw-r--r--. 1 root root 0 8月  2 18:20 t2
[[email protected] test]# echoo 1 2> t3
[[email protected] test]# cat t3
bash: echoo: 未找到命令...
[[email protected] test]# echop wqew 2>>t3
[[email protected] test]# cat t3
bash: echoo: 未找到命令...
诚如命令是: 'echo'
bash: echop: 未找到命令...

张冠李戴重定向也支撑追加。
假若我们不管命令对错都想记录那么能够使用如下格式实现:
1、&>、 &>>
[[email protected] test]# ech2 &>> t4
[[email protected] test]# echo right &>> t4
[[email protected] test]# cat t4
bash: ech2: 未找到命令...
right

2、command >> /path/somewhere ... 2>&1  第三种只可以为此种格式,不管前边是扩展仍然覆盖前边均为2>&1。2>>&1为不当格式,使用后在CentOS7.2下会报错。
[[email protected] test]# ech2 >> t5 2>&1     
[[email protected] test]# echo right >> t5 2>&1
[[email protected] test]# cat t5
bash: ech2: 未找到命令...
right

注:输出重定向的对象足以是各样文件,但不能将其定向至命令的输入,要想完结那么些效果则需求用管道。这里大家也会有一点迷,上边以例子表明

[[email protected] test]# who > tr a-z A-Z > t6
[[email protected] test]# cat t6
root    pts/0        2016-08-02 10:12 (192.168.85.1)
[[email protected] test]# ll
总用量 4
-rw-r--r--. 1 root root 54 8月  2 18:53 t6
-rw-r--r--. 1 root root  0 8月  2 18:53 tr

小编们将who展现的通令重定向至tr命令的输入,之后将内容小写转变为大写后再重定向至t6文书。我们想完结的是以此结果,可是并未兑现,反而在经过中出现了tr那些文件。这是因为在首先层的重定向中,暗中同意将tr当做文件名,然而奇异的是tr内怎么都不曾,所以这种不当的知情尽早摆脱。
[[email protected] test]# cat tr 
[[email protected] test]#

大家得以动用管道完美化解地点的主题素材。
[[email protected] test]# who | tr a-z A-Z > t6
[[email protected] test]# cat t6
ROOT    :0          2016-08-02 10:12 (:0)
ROOT    PTS/0        2016-08-02 10:12 (192.168.85.1)
ROOT    PTS/1        2016-08-02 10:19 (192.168.85.1)

什么是管道,作者信任经过地点的事例大家应该对它有了个起先的认知。

管道:连接程序,完毕将前三个下令的出口直接定向后三个前后相继作为输入数据流。
其常用表述格式如下:  COMMAND1 | COMMAND2 | COMMAND3 |...
它是输出重定向的增加补充与增加,其本质如故类属于输出重定向。
既然如此协商业管理道,这里再多补充点
常用来管道的指令:
tee
tee - read from standard input and write to standard output and files
      展现专门的学业输入的结果并将其写入文件
    tee的运用格式:
    命令1 | tee 文件名| 命令2
把命令1的STDOUT保存在文件名中,然后管道输入给命令2
作用:
    保存不一致品级的出口
    复杂管道的故障排除
    同偶尔间查看和记录输出
下边通过一个轻松易行的事例表达tee的实际效果
[[email protected] test]# who | tee t2 | tr a-z A-Z
ROOT    :0          2016-08-02 10:12 (:0)
ROOT    PTS/0        2016-08-02 10:12 (192.168.85.1)
ROOT    PTS/1        2016-08-02 10:19 (192.168.85.1)
[[email protected] test]# cat t2
root    :0          2016-08-02 10:12 (:0)
root    pts/0        2016-08-02 10:12 (192.168.85.1)
root    pts/1        2016-08-02 10:19 (192.168.85.1)

tee能够将前三个的结果记录在t2文件内,同期出示后二个指令的结果。


    输入重定向
    < 单行形式、 << 多行格局

要打听输入重定向,大家得先了然四个发令
tr
 tr - translate or delete characters 转换或删除字符
其发挥格式如下:
    tr[OPTION]... SET1 [SET2]
选项:
    -c或——complerment:取字符集的补集
    -d或——delete:删除全部属于第一字符集的字符
    -s或—squeeze-repeats:把连续重复的字符以单身四个字符表示
上边大家由此三个例证简要了然下tr的效益

12345678 [[email protected] test]# cat t1
root    :0          2016-08-02 10:12 (:0)
root    pts/0        2016-08-02 10:12 (192.168.85.1)
root    pts/1        2016-08-02 10:19 (192.168.85.1)
[[email protected] test]# tr a-z A-Z < t1
ROOT    :0          2016-08-02 10:12 (:0)
ROOT    PTS/0        2016-08-02 10:12 (192.168.85.1)
ROOT    PTS/1        2016-08-02 10:19 (192.168.85.1)

t1是上面tee存款和储蓄的who内容,大家因而输入重定向将其看作tr的输入,并由小写转变为大写。
输入重定向正是将原本用键盘输入的源委通过别的文件内容或文件内容取代。
自个儿想大家对于<<多行重定向有个别不知道,这里再对多行重定向在以例子说喜宝(Hipp)下。
12345678 [[email protected] ~]# tr a-z A-Z << end
> morning,boys
> today is another day
> please be happy
> end
MORNING,BOYS
TODAY IS ANOTHER DAY
PLEASE BE HAPPY

多行输入重定向前面要求接规定的结尾字符串,日常选择eof或end为最终标示符。
多行输入重定向要求手动键入内容。单行输入重定向则供给跟文件或前叁个发令的输出结���。


本身通晓看到这里依旧会有一点懵,上面通过9个实例来归纳采用标准输出输入及管道命令。

实行情况CentOS7.2

1、将/etc/issue文件中的内容转变为大写后保存至/test/issue#文件中
1234567 [[email protected] test]# cat /etc/issue | tr a-z A-Z > /test/issue1
[[email protected] test]# echo $(tr a-z A-Z < /etc/issue) > /test/issue2
[[email protected] test]# cat issue1
S
KERNEL R ON AN M
[[email protected] test]# cat issue2
S KERNEL R ON AN M

上面二种办法均能够兑现须要,只可是输出格式略有区别,那根命令有关。在平昔不进一步的限制下,这二种表明格局均可。第一种接纳管道,输出重定向,第二种接纳命令援用,输入重定向及输出重定向。

2、将前段时间系统登陆顾客的新闻转换为大写后保存至/test/t2文书中
12345 [[email protected] test]# who | tr a-z A-Z > /test/t2
[[email protected] test]# cat t2
ROOT    :0          2016-08-02 10:12 (:0)
ROOT    PTS/0        2016-08-02 10:12 (192.168.85.1)
ROOT    PTS/1        2016-08-02 10:19 (192.168.85.1)

3、一个linux客户给root发邮件,需求邮件标题为”help”,邮件正文如下:
Hello, I am 用户名,the system version is here,pleasehelp me to check it ,thanks!
操作系统版本消息
咱俩选择客户gentoo
[[email protected] ~]# su gentoo
[[email protected] /root]$ whoami
gentoo
[[email protected] /root]$ cd /home/gentoo/
[[email protected] gentoo]$ echo -e "Hello,I am `whoami`nThe system version is here,please help me to check it ,thanks.nThe version is `cat /etc/RedHat-release`" | mail -s "help" root   
[[email protected] gentoo]$ exit
exit
您在 /var/spool/mail/root 中有新邮件
[[email protected] ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 3 messages 1 new
    1 [email protected]  Tue Aug  2 09:38  21/731  "help"
    2 root                  Tue Aug  2 09:44  21/741  "help"
>N  3 [email protected]  Tue Aug  2 19:37  20/737  "help"
& 3
Message  3:
From [email protected]  Tue Aug  2 19:37:36 2016
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Date: Tue, 02 Aug 2016 19:37:36 +0800
To: [email protected]
Subject: help
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: [email protected]
Status: R
-e Hello,I am gentoo
The system version is here,please help me to check it ,thanks.
The version is CentOS Linux release 7.2.1511 (Core)

那边运用了指令替换成展现客户及版本音信,管道将率先个指令的出口递给下一个指令作为其输入。

4、将/root/下文件列表,呈现成一行,并文件名以内用空格隔绝
[[email protected] test]# ls -1 /root | tr 'n' ' 'n
anaconda-ks.cfg CST dead.letter file initial-setup-ks.cfg test.txt tr 公共 模板 视频 图片 文档 下载 音乐 桌面 [[email protected] test]#

地方命令已经满意大家的渴求了,只不过不换行瞧着有些别扭,上边我们在完善下使其出口望着更舒服些。
[[email protected] test]# echo -e `ls -1 /root/ | tr 'n' ' 'n` 
anaconda-ks.cfg CST dead.letter file initial-setup-ks.cfg test.txt tr 公共 模板 视频 图片 文档 下载 音乐 桌面
[[email protected] test]#

采用echo的-e开启转义符使换行n生效。

5、file1文件的原委为:”1 2 3 4 5 6 7 8 9 10” 总计出富有数字的总额
[[email protected] test]# cat > file1
1 2 3 4 5 6 7 8 9 10
^C
[[email protected] test]# cat file1 
1 2 3 4 5 6 7 8 9 10

先创设file1文件夹并输入标题需要内容。
12 [[email protected] test]# cat file1 | tr ' ' '+' | bc
55

6、管理字符串“xt.,l 1 jr#!$mn2 c*/fe3  uz4”,只保留在那之中的数字和空格
[[email protected] test]# echo 'xt.,l 1 jr#!$mn2 c*/fe3  uz4' | tr -cd '[:digit:][:space:]'
 1 2 3  4

此地运用了tr中的-c及-d补集跟删除,灵活应用补集概念能够修正确的提携我们过滤没有要求的音讯。

7、将PATH变量每种目录呈现在单独的一行
[[email protected] test]# echo ${PATH}
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] test]# echo ${PATH} | tr ':' 'n'
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

其一题异常粗略只须求将PATH正确展现出来,使用tr将:替换为换行就能够

8、删除钦命文件的空行
此处大家成立一个分包相当多空行的文本文件t9
[[email protected] test]# cat t9
q
 
 
 
ere
s
 
 
 
df
sd
 
 
 
 
sd
[[email protected] test]# cat t9 | tr -s 'n' 
q
ere
s
df
sd
sd

这里运用了tr的再度删除-s选项。

9、将文件中每种单词(字母)展现在独立的一行,并无空行
此处大家选取/etc/rc.d/rc0.d/K50netconsole文件,使用head查看下其文件前5行都怎么内容
[[email protected] test]# head -5 /etc/rc.d/rc0.d/K50netconsole 
#!/bin/bash

# netconsole    This loads the netconsole module with the configured parameters.
#
# chkconfig: - 50 50
[[email protected] test]# cat /etc/rc.d/rc0.d/K50netconsole | tr -cs '[:alpha:]' 'n' | head -5
 
bin
bash
netconsole
This

从结果来看大家落实了难点的供给,可是为什么第一行是空行,那是因为-s是将有所的空行压缩为一行,由以前边会留有一行空行。

正文恒久更新链接地址:

笔者在刚起初接触IO重定向时,经历了由懂到不懂然后领悟的长河,当然现在的自身也不...

本文由正版必中一肖图发布于系统操作,转载请注明出处:Linux基础知识之IO重定向及管道详解,快速清空

上一篇:Linux过滤空文件的命令总结 下一篇:没有了
猜你喜欢
热门排行
精彩图文