重定向和管道

点击访问 Linux 命令大全 >>

本章节将介绍 Linux shell 高级特性重定向和管道,这种特性允许用户人为地改变程序获取输入和产生输出的位置。

输出重定向

程序在默认情况下输出结果的地方为标准输出(stdout)。通常来说,标准输出总是指显示器。例如:下面将 ll 命令的结果输出到标准输出显示器上

[snow@localhost ~]$ ll
总用量 4
drwxrwxr-x. 2 snow snow  6 7月  30 19:47 bak
-rw-rw-r--. 1 snow snow 12 7月  30 19:56 my_test.txt

输出重定向用于把程序的输出转移到另一个地方。例如:将 ll 命令的结果重定向输出到 ll.txt 文件中

[snow@localhost ~]$ ll > ll.txt
[snow@localhost ~]$ cat ll.txt
总用量 4
drwxrwxr-x. 2 snow snow  6 7月  30 19:47 bak
-rw-rw-r--. 1 snow snow  0 7月  30 21:40 ll.txt
-rw-rw-r--. 1 snow snow 12 7月  30 19:56 my_test.txt

注意:上面实例中的“>”符号就是重定向符号,将符号左边命令的结果写入到右边指定的地方,可以使文件、设备等。

如果重定向的文件 ll.txt 不存在,则会创建 ll.txt 文件。如果 ll.txt 文件已经存在,那么“>”会删除文件中原有的内容,然后用新内容替代。

## 查看 ll.txt 文件内容
[snow@localhost ~]$ cat ll.txt
hello linux

## ll 命令结果重定向到 ll.txt
[snow@localhost ~]$ ll > ll.txt

## 查看 ll.txt 文件内容
[snow@localhost ~]$ cat ll.txt
总用量 4
drwxrwxr-x. 2 snow snow  6 7月  30 19:47 bak
-rw-rw-r--. 1 snow snow  0 7月  30 21:59 ll.txt
-rw-rw-r--. 1 snow snow 12 7月  30 19:56 my_test.txt

输入重定向

程序默认情况下接收输入的地方被称为标准输入(stdin)。通常来说,标准输入总是指键盘。

例如:如果使用不带任何选项的cat命令,cat命令会停在那里,等待从标准输入(键盘)获取数据。

[snow@localhost ~]$ cat
hello linux
hello linux
word
word
[snow@localhost ~]$

用户每行输入会立即显示在屏幕上,直到使用组合键 Ctrl+D 结束。

通过使用输入重定向符号“<”可以让 cat 从一个文件中获取输入。例如:

## 查看 data.txt 文件信息和内容
[snow@localhost ~]$ ll data.txt
-rw-rw-r--. 1 snow snow 18 7月  30 22:06 data.txt
[snow@localhost ~]$ cat data.txt
hello linux
world

## 将 data.txt 文件的内容作为 cat 命令的输入
[snow@localhost ~]$ cat < data.txt
hello linux
world

另一种输入重定向被称为立即文档(here document),这中重定向方式使用操作符“<<”。立即文档明确告诉 Shell 从键盘接受输入,并传递给程序。

例如:cat 命令从键盘接受两行输入,并将其送往标准输出。立即文档指定了一个代表输入结束的分隔符(这里是单词 EOF),当 Shell 遇到这个单词的时候,即认为输入结束,并把刚才的键盘输入一起传递给 cat 命令。所以这次 cat 命令会将用户的输入一块显示,而不是每收到一行就显示。

[snow@localhost ~]$ cat << EOF
> hello
> world
> EOF
hello
world

注意,用户可以选择任意一个单词作为立即文档的分隔符,例如 EOF、END、eof 等。

管道(|)

管道将“重定向”再向前推进了一步。通过一根竖线“|”,将一条命令的输出连接到另一条命令的输入。

例如:使用 yum list 命令列出所有可用的安装包,然后通过管道(|)将 yum 命令的输出作为 grep 的输入,检索 mysql 可用安装包信息。如下:

[snow@localhost ~]$ yum list | grep mysql
akonadi-mysql.x86_64                        1.9.2-4.el7                base
apr-util-mysql.x86_64                       1.5.2-6.el7                base
dovecot-mysql.x86_64                        1:2.2.36-6.el7             base
freeradius-mysql.x86_64                     3.0.13-10.el7_6            base
libdbi-dbd-mysql.x86_64                     0.8.3-16.el7               base
mysql-connector-java.noarch                 1:5.1.25-3.el7             base
mysql-connector-odbc.x86_64                 5.2.5-8.el7                base
pcp-pmda-mysql.x86_64                       4.3.2-7.el7_8              updates
php-mysql.x86_64                            5.4.16-48.el7              base
php-mysqlnd.x86_64                          5.4.16-48.el7              base
qt-mysql.i686                               1:4.8.7-8.el7              base
qt-mysql.x86_64                             1:4.8.7-8.el7              base
qt5-qtbase-mysql.i686                       5.9.7-2.el7                base
qt5-qtbase-mysql.x86_64                     5.9.7-2.el7                base
redland-mysql.x86_64                        1.0.16-6.el7               base
rsyslog-mysql.x86_64                        8.24.0-52.el7_8.2          updates

上例中,yum list 命令列出所有可用的安装包,管道(|)接收到这些输出,并把它们发送给 grep 命令作为输入。最后 grep 在这堆安装包中查找包含 mysql 字符串的安装包,并且在标准输出上显示。

注意,在一行命令中可以使用多个管道,从而构造出复杂的 Shell 命令。

例如:下面命令将 grep mysql 命令过滤后的结果作为 cut 命令的输入,cut 命令根据空格分隔字符串,然后获取第一列的数据,显示在显示器中。

[snow@localhost ~]$ yum list | grep mysql | cut -d ' ' -f 1
akonadi-mysql.x86_64
apr-util-mysql.x86_64
dovecot-mysql.x86_64
freeradius-mysql.x86_64
libdbi-dbd-mysql.x86_64
mysql-connector-java.noarch
mysql-connector-odbc.x86_64
pcp-pmda-mysql.x86_64
php-mysql.x86_64
php-mysqlnd.x86_64
qt-mysql.i686
qt-mysql.x86_64
qt5-qtbase-mysql.i686
qt5-qtbase-mysql.x86_64
redland-mysql.x86_64
rsyslog-mysql.x86_64
说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号