Linux I/O重定向与管道

发布时间 2023-11-28 14:24:59作者: 张澜

在生产环境中,每天凌晨需要备份数据库,这时工作人员会编写一个简单的脚本创建计划任务,把脚本执行结果放到一个或几个文件中以便第二天查看,这个过程就叫重定向。在使用"ps aux"命令时,为了快速找到所需要信息,经常使用grep命令进行过滤,此时就需要使用管道符。

I/O重定向

      I/O运行一个程序时 , 需要从某个位置读取输入信息 , 然后 cpu 处理, 最后将输出显示到屏幕或文件进程通过文件描述符的编号通道来获取输入并输出。

     Linux I/O重定向可以定义为,更改从命令读取输入到命令发送输出的方式。你可以重定向命令的输入和输出。对于重定向符号,可以是<、> 或者 | 。

     I/O重定向中的标准流

     Bash shell在I/O重定向中有三个标准流:

标准输入(stdin):stdin流编号为stdin(0)。bash shell从stdin获取输入。默认情况下,键盘用作输入。
标准输出(stdout):stdout流编号为stdout(1)。bash shell将输出发送到stdout。输出将显示。
标准错误(stderr):stderr流编号为stderr(2)。bash shell向stderr发送错误消息。显示错误消息。

     重定向到文件

     每个流都使用重定向命令。单括号'>'或双括号'>>'可用于重定向标准输出。如果目标文件不存在,将创建一个具有相同名称的新文件。

     覆盖:带有单括号“>”的命令将覆盖现有的文件内容。

>:标准输出
<:标准输入
2>:标准错误

     注意:写“1>”或“>”和“0<”或“<”是一回事。但对于stderr,必须编写“2>”。

用法:
cat > <fileName>

输入重定向

    输入重定向是指把命令的标准输入改变为指定的文件(包括设备文件),使命令从该文件中而不是从键盘中获取输入。输入重定向主要用于改变那些需要大量标准输入的命令的输入源。输入重定向的格式为:

命令 < 文件

    当提交这样的一个命令行时,Shell首先断开键盘与命令的stdin之间的关联,将指定的文件关联到stdin,然后运行命令。这样,该命令就会从这个文件中读取标准输入信息。

【例1】输入重定向的应用。

[root@localhost ~]# cat file
This is Linux world.
[root@localhost ~]# cat < file
This is Linux world.

输出重定向

    输出重定向是指把命令的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到文件中。很多情况下都可以使用输出重定向功能。输出重定向的一般形式为:

标准输出重定向:命令 > 文件
附加输出重定向:命令 >> 文件

    标准输出重定向就是将命令的标准输出保存到一个文件中,当提交这样的一个命令行时,Shell首先断开命令的标准输出stdout与屏幕之间的关联,找到指定的文件(若该文件不存在就新建一个),然后将这个文件关联到命令的标准输出上。随后Shel启动该命令运行。这样,该命令产生的所有标准输出信息都将写入这个文件中,而不是显示在屏幕上。

    附加输出重定向与标准输出重定向相似,只是当指定的文件存在时,标准输出重定向的做法是先将文件清空,再将命令的输出信息写入,而附加输出重定向则是保留文件内原有的内容,将命令的输出附加在后面。

【例2】输出重定向的应用。

[root@localhost ~]# echo "this is Linux world!" > file
[root@localhost ~]# cat file
this is Linux world!
[root@localhost ~]# echo "this is not Linux world!" > file
[root@localhost ~]# cat file
this is not Linux world!
[root@localhost ~]# echo "this is Linux world!" >> file
[root@localhost ~]# cat file
this is not Linux world!
this is Linux world!

 进程管道

      管道实际上也是一种重定向,重定向字符控制输出到文件,管道控制输出到其他程序。

管道命令

      管道的作用是把上一个进程的输出作为下一个进程的输入,利用管道可以把若干个命令连接在一起。

1. 基础管道(|)

管道允许将一个命令的输出传递给另一个命令的输入,实现多个命令协同工作。例如:

$ command1 | command2

这将command1的输出作为command2的输入。

2. 管道和grep命令

结合管道和grep命令,可以更灵活地进行文本搜索和过滤。例如:

$ cat file.txt | grep "pattern"

这将显示file.txt中包含特定模式的行。

常用选项:

  • -i:忽略大小写进行匹配。
  • -v:反向查找,只打印不匹配的行。
  • -n:显示匹配行的行号。
  • -r:递归查找子目录中的文件。
  • -l:只打印匹配的文件名。
  • -c:只打印匹配的行数。

2. 管道和awk/sed命令

使用管道结合awksed等文本处理工具,可以实现复杂的文本操作。例如:

$ cat data.txt | awk '{print $1}' | sed 's/old/new/'

这将从data.txt中提取第一列,然后用sed替换文本。