博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重定向和管道
阅读量:4350 次
发布时间:2019-06-07

本文共 4590 字,大约阅读时间需要 15 分钟。

         首先要知道的3种I/O设备,然后把I/O重定向入文件中,然后用管道将命令链接起来,用tr命令进行转换,tee重定向到多个目标。

       程序=指令+数据

Linux给程序提供三种I/O设备 – 标准输入(STDIN)

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

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

    -2 默认输出到终端窗口

解释:命令 passwd 从标准输入读取用户密码,所以用户可以用键盘输入密码

           命令 echo 把结果输出到标准输出,所以可以在屏幕上看到结果

           普通用户没有权限查看/root 目录,所以出错,于是 ls 把错误信息输出到标准错误,也就是屏幕

一、I/O重定向就是改变默认的位置,把输出和错误重新定向到文件中:命令   操作符号   文件名

    1. 输入重定向:

       (1)从文件中导入STDIN,某些命令能够接受从文件中导入的STDIN

                  tr ‘a-z’ ‘A-Z’</etc/issue

                 该命令会把/etc/issue中的小写字符都转换成大写字符

                  tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字

      (2)cat >test.txt

                进行键盘输入

                  结束ctrl+d

             [root@centos6-magedu ~]# cat >test.txt

              hello world

      (3)多行重定向:使用“<<终止词”命令从键盘把多行重导向给STDIN

                     – 直到 终止词 位置的所有文本都发送给STDIN

                    – 有时被称为就地文本(heretext)

                   [root@centos6-magedu ~]# cat>test.txt<<END

                   > Goodmorning!
                   > Everyone
                   > how are you
                  > i'm fine
                  > END

        (4)邮件收发功能:

                 发送方:mail –s  邮件名 发送方<<END 

                 [root@centos6-magedu ~]# mail -s help root>>END

                 HELLO,i,^H'fbc dcn
                 END

                接收方:mail

                                         第几封邮件

                                          save保存
                                          quit

  2.  输出重定向

       (1)> 或 1> 表示正确输出重定向

                       > 若文件不存在,则创建,若文件已存在,则覆盖
                       >> 若文件不存在,则创建,若文件已存在,则追加
       ( 2) 2> 表示错误输出重定向
                       2> 若文件不存在,则创建,若文件已存在,则覆盖
                       2>> 若文件不存在,则创建,若文件已存在,则追加
       (3) &> 表示全部输出重定向(正确错误都定向)
                      &> 若文件不存在,则创建,若文件已存在,则覆盖
                      &>> 若文件不存在,则创建,若文件已存在,则追加

      (4)1>&2  表示将正确结果转换为错误结果

                    2>&1  表示将错误结果转换为正确结果

3  .重定向到多个目标(tee)

    命令1 | tee[-a ] 文件名| 命令2
    把命令1的STDOUT保存在文件中,做为命令2的输入
   -a 追加
    使用:
             –保存不同阶段的输出
            –复杂管道的故障排除
            –同时查看和记录输出

4. /dev/null(黑洞 垃圾桶)

重定向到该文件的数据都被内核丢掉了,可以用这个特性来屏蔽某些输出信息

# echo hello world > /dev/null

--屏蔽掉命令的出错信息

# ls / /root 2> /dev/null

              set -C 禁止覆盖

               >| 临时强制覆盖
               set +C 允许覆盖

5. 标准输入输出的深入探讨

标准的输入输出是Linux 默认为程序创建好的三个文件描述符,虽然大多数的程序都会使用这三个文件描述符来作为自己的输入输出,但是这并非是强制性的,也就是说,程序可以不使用这三个标准的文件描述符,而是自己打开新的文件描述符来使用。当程序不使用标准的输入输出时,这里所使用的重定向对其也就不起作用了。例如:

passwd: 程序从标准输入读取用户密码,因此我们可以通过重定向标准输入来向它提供密码

ssh: 命令是用于远程登录的程序,它读取用户输入的密码时,使用的不是标准输入,因此我们不能通过重定向标准输入来向它提供密码

二、管道(P)

        上面所描述的重定向,是把标准的输入输出连接到文件。我们也可以把多个程序之间的标准输入输出进行连接,实现命令之间数据的传递,这种技术被形象地称做管道,程序的输出就像流水在管道中流通一样,从最左边的程序流到最右边的程序。管道是linux shell 里非常常见的技术,利用管道技术可以达到配合使用多个小工具,完成非常复杂而强大的功能。如希望错误的也可以传递,则需要先将错误结果转为正确结果 2>&1 | 或  |&.

 - 符号

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

tr  (转换和删除字符 )

选项:

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

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

          ‘\n’换行

          ‘\n’  ‘ ‘竖直转换为水平

    -cd   a 只保留a

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

     -t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

 [:alnum:]:字母和数字

[:alpha:]:字母

[:cntrl:]:控制(非打印)字符

[:digit:]:数字

[:graph:]:图形字符

[:lower:]:小写字母

[:print:]:可打印字符

[:punct:]:标点符号

[:space:]:空白字符

[:upper:]:大写字母

[:xdigit:]:十六进制字符

less: 一页一页地查看输入 ,用法同man

ls -l /etc | less • mail:

通过电子邮件发送输入

echo "testemail"| mail -s "test"

1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中    

[root@localhost ~]#tr [:lower:] [:upper:]  /tmp/issue.out  [root@localhost ~]#cat /tmp/issue.out   \S   KERNEL \R ON AN \M   cat /etc/issue|tr a-z A-Z/tmp/issue.out

2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中   

[root@localhost ~]#who |tr [:lower:] [:upper:]> /tmp/who.out   [root@localhost ~]#cat /tmp/who.out    ROOT     :0           2018-07-16 20:22 (:0)    ROOT     TTY3         2018-07-16 20:23    ROOT     PTS/0        2018-07-16 20:24 (172.18.250.74)    ROOT     PTS/1        2018-07-16 20:25 (172.18.250.74)

3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:

Hello, I am 用户名,The system version is here,please help me to check it ,thanks

操作系统版本信息

     法一 :  

[root@localhost ~]#useradd zs[root@localhost ~]#su - zs [zs@localhost ~]$ mail -s "help" root<
Hello,I am $USER,The system version is here,please help me to check it,thanks `cat /etc/redhat-release` > END

     法二:

[root@localhost ~]# ( echo "Hello, I am $USER,The system version is here,please help me to check it ,thanks" ;cat /etc/redhat-release ) |mail -s help root

4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开   

[root@localhost ~]# ls /root/ |tr '\n' ' 'a anaconda-ks.cfg Desktop Documents Downloads fion.jk fion.ubyv fion.yv hi initial-setup-ks.cfg ls mail mbox Music Pictures Public rgn Templates testdir Videos

5、计算1+2+3+..+99+100的总和

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

6、删除Windows文本文件中的‘^M’字符

[root@localhost ~]# tr -d '\015' < win.txt > win1.txt   [root@localhost ~]# cat -A win1.txt   A$   B$   C$  [root@localhost ~]# cat -A win.txt   A^M$   B^M$   C^M$

7、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格   

[root@localhost ~]# echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' |tr -cd '0-9 '1 2 3 4[root@localhost ~]#

8、将PATH变量每个目录显示在独立的一行  

[root@localhost ~]# echo $PATH |tr : '\n'  /usr/local/sbin  /usr/local/bin  /usr/sbin  /usr/bin  /root/bin

9、将指定文件中0-9分别替代成a-j

[root@localhost ~]# cat linux.txt|tr [0-9] 'a-j'efbuv befurvj jjiggb hfruf

10、将文件中每个单词(由字母组成)显示在独立的一行,并无空行

         cat test.txt |tr '[:punct:]' '\n' |tr ' ' '\n' 

转载于:https://www.cnblogs.com/f-h-j-11-7/p/9324454.html

你可能感兴趣的文章
SQL Server2012完全备份、差异备份、事务日志备份和还原操作
查看>>
Flash动画播放
查看>>
springmvc+mybatis+dubbo+zookeeper 分布式架构
查看>>
HDUOJ-----Computer Transformation
查看>>
HDUOJ-----2838Cow Sorting(组合树状数组)
查看>>
自定义控件之---抽屉式弹窗控件.
查看>>
一款纯css3实现的机器人看书动画效果
查看>>
加班与效率
查看>>
轻量级Modal模态框插件cta.js
查看>>
MyEclipse下SpringBoot+JSP整合过程及踩坑
查看>>
重定向和管道
查看>>
实验五
查看>>
STL学习笔记(第二章 C++及其标准程序库简介)
查看>>
Operator_countByValue
查看>>
Java 日期往后推迟n天
查看>>
Web应用漏洞评估工具Paros
查看>>
Git 和 Github 使用指南
查看>>
20180925-4 单元测试
查看>>
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>