欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

linux I/O重定向及管道

程序员文章站 2022-03-22 23:07:39
一,I/O重定向 重定向正常输出 \ :覆盖以存在文件的内容,很危险的操作 \ :如果文件已经存在,则是在原内容的最后追加。 可以禁止 的覆盖行为,使用 。只在当前会话有效。 恢复覆盖行为。 \ |: 已经禁止了覆盖,但是确认就是要覆盖,可以使用。 重定向错误输出 2 :覆盖以存在文件的内容,很危险 ......

一,i/o重定向

  • 重定向正常输出

    • > :覆盖以存在文件的内容,很危险的操作

    • >>:如果文件已经存在,则是在原内容的最后追加。

    • 可以禁止>的覆盖行为,使用set -c。只在当前会话有效。

      set +c恢复覆盖行为。

      # set -c
      # cat /etc/issue > /tmp/is1
      -bash: /tmp/is1: cannot overwrite existing file
      # cat /etc/issue >| /tmp/is1
    • >|:set -c已经禁止了覆盖,但是确认就是要覆盖,可以使用。

  • 重定向错误输出

    • 2>:覆盖以存在文件的内容,很危险的操作
    • 2>>:如果文件已经存在,则是在原内容的最后追加。
    • 2>|:强制覆盖
  • 合并重定向正常输出和错误输出

    • &>:覆盖以存在文件的内容,很危险的操作
    • &>>:如果文件已经存在,则是在原内容的最后追加。
    • &>|:不支持,语法报错。
  • 把错误输出,重定向到正常输出:2>&1

    # cat /etc/issue2 >> /tmp/is1 2>&1

    如果命令产生的是正常输出,则重定向到/tmp/is1;如果产生的是错误输出,则把错误输出重定向到正常输出。由于正常输出已经重定向到了/tmp/is1了,所以错误输出也重定向到了/tmp/is1.

  • 重定向输入:<

    支持文件作为参数的命令,可以不使用< ,也能够重定向输入,比如cat

    # cat < /etc/issue
    \s
    kernel \r on an \m
    # cat /etc/issue
    \s
    kernel \r on an \m
    

    不支持文件作为参数的命令,必须明确使用<,才能够重定向输入。比如tr

    tr命令用途:替换或者删除特定的字符

    语法:tr [option]... set1 [set2]

    • 把输入的1替换成2,把输入的2替换成4

      $ tr [12] [34]
      12//输入的12
      34//被替换成了34
      22//输入的22
      44//被替换成了44
    • 利用重定向,把文件里的小写字母,全部替换成相应的大写字母,把结果显示到标准输出。

      # cat /etc/issue
      \s
      kernel \r on an \m
      # tr [[:lower:]] [[:upper:]] < /etc/issue
      \s
      kernel \r on an \m
    • 利用重定向,把文件里的小写字母,全部删除后,把结果显示到标准输出。

      # cat /etc/issue
      \s
      kernel \r on an \m
      # tr -d [a-z] < /etc/issue
      \s
      k \   \
  • <<:是干什么的?<<后面的词作为结尾,把内容重定向到文件里

    # cat > /tmp/is1.out << eof
    > hello
    > cat cat
    > eof
    # cat /tmp/is1.out
    hello
    cat cat
  • 特殊设备:/dev/null

    重定向到/dev/null,就相当于消失了。

    在shell脚本程序里,当关心的是,命令的执行结果(成功,还是失败),而不是命令执行后的输出的时候,就可以把命令的输出重定向到/dev/null里。

    例子:只想知道/etc/passwd文件里是否有第一行,而不关心第一行的内容时,使用下面的命令。

    # head -1 /etc/passwds &> /dev/null
    # echo $?
    1
    # head -1 /etc/passwd &> /dev/null
    # echo $?
    0
    

二,管道

连接程序,把前一个命令的输出作为后一个命令的输入。

command1 | command2 | command3 ...

例子1:把cat的输出,作为tr的输入

# cat /etc/issue
\s
kernel \r on an \m
# cat /etc/issue | tr [a-z] [a-z]
\s
kernel \r on an \m

例子:把who的输出,作为tail的输入,再把tail的输出,作为tr的输入。

# who
ys       :0           2019-12-16 10:22 (:0)
ys       pts/0        2019-12-16 10:22 (:0)
root     pts/1        2019-12-16 10:23 ()
# who | tail -2
aa       pts/0        2019-12-16 10:22 (:0)
root     pts/1        2019-12-16 10:23 ()
# who | tail -2 | tr [a-z] [a-z]
aa       pts/0        2019-12-16 10:22 (:0)
root     pts/1        2019-12-16 10:23 ()

重定向后,原来命令的输出就没有了,能够保存上一个命令的输出吗?使用tee命令。

tee:read from standard input and write to standard output and files。从标准输入读取,然后写入到标准输出和文件中。

例子:保留cat的输出,并把cat的输出,传递给tr命令

# cat /etc/issue | tee /tmp/is3.out | tr [a-z] [a-z]
\s
kernel \r on an \m
# cat /tmp/is3.out
\s
kernel \r on an \m

练习1:把/etc/passwd文件的前6行的信息转换为大写字母后输出

# head -6 /etc/passwd | tr [a-z] [a-z]
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

c/c++ 学习互助qq群:877684253

linux I/O重定向及管道

本人微信:xiaoshitou5854