Unix和Linux管道(pipe)和过滤器(filter)使用介绍

上一章Unix和Linux教程请查看:打印文件和发送邮件
在本章中我们将详细讨论Unix中的管道和过滤器。你可以将两个命令连接在一起,使一个程序的输出成为下一个程序的输入,以这种方式连接的两个或多个命令形成一个管道。
要生成管道,请在两个命令之间的命令行上放置竖线(|)。当一个程序从另一个程序获取其输入时,它对该输入执行一些操作,并将结果写入标准输出,这个过程被称为过滤器。
一、grep命令grep命令在一个或多个文件中搜索具有特定模式的行,grep命令语法如下:

$grep pattern file(s)

“grep”这个名称来自ed(一个Unix行编辑器)命令g/re/p,意思是“全局搜索一个正则表达式并打印包含它的所有行”。
正则表达式可以是一些纯文本(例如一个单词)和/或用于模式匹配的特殊字符。
grep最简单的用法是查找由单个单词组成的模式。它可以在管道中使用,这样只有包含给定字符串的输入文件的那些行才会被发送到标准输出。如果你不给grep一个文件名来读取,它将读取它的标准输入——这是所有过滤程序的工作方式。
$ ls -l | grep ".so" -rw-r--r-- 1 user user 2324825月 202017 gson-2.5.jar -rw-r--r-- 1 user user13432 10月 202015 libhello-jni.so -rw-r--r-- 1 user user626845月 272017 libhello.so -rwxr-xr-x 1 root root86785月 302017 so.m

有多种选项可以与grep命令一起使用:
编号 选项 & 描述
1 -v 打印所有与模式不匹配的行。
2 -n 打印匹配的行及其行号。
3 -l 仅打印具有匹配行的文件名称(字符“l”)
4 -c 只打印匹配行的计数。
5 -i 匹配大小写。
现在让我们使用一个正则表达式,它告诉grep查找包含“carol”的行,后跟0或正则表达式中缩写为“.*”的其他字符,然后后跟“Aug”。这里我们使用-i选项来进行不区分大小写的搜索:
$ls -l | grep -i "carol.*aug" -rw-rw-r--1 carol doc1605 Aug 23 07:35 macros $

二、sort命令sort命令按字母或数字顺序排列文本行。下面的示例对food文件中的行进行排序:
$ sort chars c++ java earth mars italino espanol shell linux ubuntu redhat

sort命令默认情况下按字母顺序排列文本行。有许多选项可以控制排序:
编号 描述
1 -n 按数字排序(例如:10将在2之后排序),忽略空格和制表符。
2 -r 反转排序的顺序。
3 -f 将大小写排序在一起。
4 +x 排序时忽略第一个x字段。
可以将两个以上的命令链接到管道中,以前面使用grep的管道为例,我们可以进一步按照大小顺序对8月份修改的文件进行排序。下面的管道由ls、grep和sort命令组成:
$ls -l | grep "Aug" | sort +4n -rw-rw-r--1 C doc1605 Aug 23 07:35 macros -rw-rw-r--1 Sdoc2488 Aug 15 10:51 intro -rw-rw-rw-1 Sdoc8515 Aug6 15:30 ch07 -rw-rw-rw-1 Sdoc11008 Aug6 14:10 ch02 $

该管道按大小顺序对你在8月份修改的目录中的所有文件进行排序,并将它们打印到终端屏幕上。sort选项+4n跳过四个字段(字段由空格分隔),然后按数字顺序对行进行排序。
三、pg和more命令长输出通常可以在屏幕上压缩,但如果你运行文本通过更多或使用pg命令作为过滤器,一旦屏幕上充满了文本显示就会停止。
假设你有一个很长的目录清单。为了更容易地读取排序后的清单,将输出通过以下管道传输:
$ls -l | grep "Aug" | sort +4n | more -rw-rw-r--1 C doc1605 Aug 23 07:35 macros -rw-rw-r--1 Gdoc2488 Aug 15 10:51 intro -rw-rw-rw-1 Gdoc8515 Aug6 15:30 ch07 -rw-rw-r--1 Gdoc14827 Aug9 12:40 ch03 . . . -rw-rw-rw-1 Gdoc16867 Aug6 15:56 ch05 --More--(74%)

【Unix和Linux管道(pipe)和过滤器(filter)使用介绍】一旦屏幕充满了由按文件大小排序的行组成的文本,屏幕就会被填满。在屏幕的底部是更提示符,你可以在这里输入命令来移动已排序的文本。完成此屏幕之后,可以使用more程序讨论中列出的任何命令。

    推荐阅读