Linux-标准IO和管道

Linux

打开的文件都有一个fd:file description(文件描述符)

[root@centos7 data]#exec 8<>/data/hosts

[root@centos7 data]#ll /proc/$$/fd

total 0

lrwx——. 1 root root 64 Mar 30 14:22 0 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 14:22 1 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 14:22 2 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 16:58 255 -> /dev/pts/3

lrwx——. 1 root root 64 Mar 30 17:17 8 -> /data/hosts

[root@centos7 data]#cat /proc/$$/fd/8

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

其实就是软链接

 

Linux给程序提供三种I/O设备

标准输入(STDIN)-0 默认接受来自键盘的输入

标准输出(STDOUT)-1 默认输出到终端窗口

标准错误(STDERR)-2 默认输出到终端窗口

I/O重定向:改变默认位置

 

标准输出重定向:>,或者1>

ls > /dev/pts/5

ls > /data/ls.out

 

标准错误重定向:2>

 

追加不覆盖:>>

 

对的和错的分别重定向

ls /error /data >>/data/f1 2>>/data/f2

 

对的和错的放在一起

ls /error /data >all.log 2>&1

注意次序!

 

新写法:

ls /error /data &>all.log

(ls /error /data 2>&1)>all.log

 

set -C     不允许覆盖,但允许追加

|>          强制覆盖

set+C     允许覆盖

 

/dev/null      垃圾箱,无底洞,不希望输出和保存的数据可导到这里

 

cat 啥都不跟的话会回显,就既有标准输入,又有标准输出

 

tr命令

tr 转换和删除字符

tr [OPTION]… SET1 [SET2]

选项:

-c -C –complement:取字符集的补集

-d –delete:删除所有属于第一字符集的字符

-s –squeeze-repeats:把连续重复的字符以单独一个字符表示

-t –truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符[root@centos7 data]#tr ‘a-z’ ‘A-Z’

asdf1234

ASDF1234

 

[root@centos7 ~]#tr ‘a-z’ ‘A-Z’ < anaconda-ks.cfg > /data/log

[root@centos7 ~]#cat /data/log

 

[root@centos7 doc]#tr -dc ‘abc’

23423aabc3sff

aabc

 

[root@centos7 doc]#tr -s “abc”

aaabbbacde

abacde

 

[root@centos7 data]#hexdump -C win.txt

00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|

00000007

[root@centos7 data]#tr -d ‘\15’ < win.txt >win2.txt

[root@centos7 data]#hexdump -C win2.txt

00000000  61 0a 62 0a 63                                    |a.b.c|

00000005

[root@centos7 data]#tr -d ‘\r’ < win.txt >win3.txt

[root@centos7 data]#hexdump -C win3.txt

00000000  61 0a 62 0a 63                                    |a.b.c|

00000005

 

[root@centos7 data]#cat win3.txt

a  b     c

[root@centos7 data]#tr -s ‘ ‘ <win3.txt

a b c

 

[root@centos7 data]#df > df.log

[root@centos7 data]#tr -s ‘ ‘ : < df.log

Filesystem:1K-blocks:Used:Available:Use%:Mounted:on

/dev/sda2:51474912:3405572:45431516:7%:/

devtmpfs:523248:0:523248:0%:/dev

tmpfs:537748:0:537748:0%:/dev/shm

tmpfs:537748:14544:523204:3%:/run

tmpfs:537748:0:537748:0%:/sys/fs/cgroup

/dev/sda1:999320:130824:799684:15%:/boot

/dev/sda3:20511312:45420:19400932:1%:/data

tmpfs:107552:12:107540:1%:/run/user/42

tmpfs:107552:0:107552:0%:/run/user/0

/dev/sr0:8490330:8490330:0:100%:/mnt

 

[root@centos7 qjy]#echo abcdef | tr ‘abcd’ ‘xyz’

xyzzef

[root@centos7 qjy]#echo abcdef | tr -t ‘abcd’ ‘xyz’

xyzdef

 

多行重定向

mail [-s] “hello” qjy@magedu.com << EOF

EOF

 

mail [-s] “hello” qjy@magedu.com < mail.txt

 

邮件里可用命令,如`hostname`

 

管道

 

cat mail.txt | mail -s ‘hello’ root

 

| 管道只处理标准输出STDOUT,不处理STDERR,所以要想处理错误信息的话要重定向错误成标准输出:

ls /boot /error 2>&1 | tr ‘a-z’ ‘A-Z’

或新写法:

ls /boot /error |& tr ‘a-z’ ‘A-Z

比较老的系统如RHEL 5.4等可能不支持’

 

例:计算从1+2+..+100

echo {1..100} | tr ‘ ‘ + | bc

seq -s + 100 | bc

也可用循环

 

less :一页一页地查看输入

ls -l /etc | less

mail:通过电子邮件发送输入

echo “test email” | mail -s “test” user@example.com

lpr:把输入发送给打印机

echo “test print” | lpr -P printer_name

 

管道中-符号

示例:

将/home里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将tar -cvf – /home传送给后面的tar -xvf – ,后面的这个 – 则是取前一个命令的 stdout,因此,就不需要使用临时file了

tar -cvf – /home | tar -xvf –

 

重定向到多个目标(tee)

命令1 | tee [-a ] 文件名 | 命令2

把命令1的STDOUT保存在文件中,做为命令2的输入

-a 追加

使用:

保存不同阶段的输出

复杂管道的故障排除

同时查看和记录输出

 

 

例:创建随机小写字母文件名

[root@centos7 data]#touch `openssl rand -base64 12 | tr -dc ‘[:lower:]’`

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/94976

(0)
qjyqjy
上一篇 2018-04-05
下一篇 2018-04-05

相关推荐

  • ssh等

    SSH端口转发 SSH会自动的加密和解密所有SSH客户端与服务器之间的网络数据;同时也可以将其他TCP端口的数据加密转发,这一过程叫“隧道”,这样也可以减少防火墙开启的端口。 实现过程是数据首先通过连接本机的某一个端口,被当做ssh协议数据发送给ssh服务器,ssh服务器解密再发给远程主机的端口 本地转发: -L localport:remotehost:r…

    2018-05-28
  • Linux用户与组管理命令的易混淆点和重合点

    Linux用户与组的管理命令,对于初学者来说很容易造成混淆,此外,这些命令之间有很多相重合的用法,即:拥有多种命令可实现相同的需求的情况。

    2018-04-03
  • 参加马哥教育面授班

    很兴奋,今天是开班的第6天了,课程的具体安排为,1、3、5上课,2、4、6实操课。课堂上目前是王老师授课,讲的都是满满的干货,很详细。让我再次确信参加这次培训不会有错。 面授班与在网络学习,我觉得学习效果差别还是蛮大的。参加面授班能很好的约束我的行为,不会出现学着学着就打开游戏或看电影了,学习效率很高,哈哈。初次见到马哥教育的各个老师发现都很平易近人,学习上…

    Linux笔记 2018-07-21
  • LINUX 进程管理

    #### hostname hostname [OPTION] [HOSTNAME] 默认选项:修改主机名为[HOSTNAME] 备注:临时生效如果想永久生效则需要修改文件/etc/sysconfig/network文件 选项 -I :取出本机上所有的非回环地址 示例 “` [root@zhangxiao network-scripts]#hos…

    Linux笔记 2018-05-06
  • MySQL数据库服务

    MySQL数据库的安装

    2018-06-12
  • Linux集群类型、系统扩展方式及lvs调度方法

    linux集群相关知识总结: linux集群种类:(1)负载均衡集群LB(2)高可用集群HA(3)高性能集群HP 分布式系统:分布式存储和分布式计算 系统扩展方式:向上扩展和向外扩展 LB cluster高可用实现方式: (1).硬件:F5 BIG ,IP Citrix Netscaler A10 (2)软件:lvs:Linux Virtual Server…

    Linux笔记 2018-06-24