Unix / Linux - 管道和过滤器

  • 简述

    本章,我们将详细讨论 Unix 中的管道和过滤器。您可以将两个命令连接在一起,以便一个程序的输出成为下一个程序的输入。以这种方式连接的两个或多个命令形成一个管道。
    要制作管道,请放置一个竖线 (&verbar) 在两个命令之间的命令行上。
    当一个程序从另一个程序获取输入时,它对该输入执行一些操作,并将结果写入标准输出。它被称为filter.
  • grep 命令

    grep 命令在一个或多个文件中搜索具有特定模式的行。语法是 -
    
    $grep pattern file(s)
    
    名字 "grep" 来自 ed(Unix 行编辑器)命令 g/re/p 这意味着“全局搜索正则表达式并打印包含它的所有行”。
    正则表达式是一些纯文本(例如一个词)和/或用于模式匹配的特殊字符。
    grep 最简单的用法是查找由单个单词组成的模式。它可以在管道中使用,以便仅将包含给定字符串的输入文件的那些行发送到标准输出。如果你不给 grep 一个要读取的文件名,它会读取它的标准输入;这就是所有过滤程序的工作方式 -
    
    $ls -l | grep "Aug"
    -rw-rw-rw-   1 john  doc     11008 Aug  6 14:10 ch02
    -rw-rw-rw-   1 john  doc      8515 Aug  6 15:30 ch07
    -rw-rw-r--   1 john  doc      2488 Aug 15 10:51 intro
    -rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
    $
    
    有多种选项可以与 grep 命令 -
    序号 选项和说明
    1
    -v
    打印所有与模式不匹配的行。
    2
    -n
    打印匹配的行及其行号。
    3
    -l
    仅打印具有匹配行的文件名(字母“l”)
    4
    -c
    仅打印匹配行的计数。
    5
    -i
    匹配大写或小写。
    现在让我们使用一个正则表达式来告诉 grep 用 "carol",后跟零或其他在正则表达式中缩写为“.*”的字符),然后是“Aug”。-
    在这里,我们使用 -i 不区分大小写搜索的选项 -
    
    $ls -l | grep -i "carol.*aug"
    -rw-rw-r--   1 carol doc      1605 Aug 23 07:35 macros
    $
    
  • sort 命令

    sort命令按字母顺序或数字顺序排列文本行。以下示例对食物文件中的行进行排序 -
    
    $sort food
    Afghani Cuisine
    Bangkok Wok
    Big Apple Deli
    Isle of Java
    Mandalay
    Sushi and Sashimi
    Sweet Tooth
    Tio Pepe's Peppers
    $
    
    sort命令默认按字母顺序排列文本行。有许多选项可以控制排序 -
    序号 描述
    1
    -n
    按数字排序(例如:10 将在 2 之后排序),忽略空格和制表符。
    2
    -r
    颠倒排序顺序。
    3
    -f
    将大写和小写一起排序。
    4
    &plusx
    先忽略 x 排序时的字段。
    可以将两个以上的命令链接到一个管道中。使用前面的管道示例grep,我们可以将8月份修改的文件按照大小的顺序进一步排序。
    以下管道由命令组成 ls, grep, 和 sort
    
    $ls -l | grep "Aug" | sort +4n
    -rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
    -rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
    -rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
    -rw-rw-rw-  1 john  doc     11008 Aug  6 14:10 ch02
    $
    
    该管道将​​您在 8 月份修改的目录中的所有文件按大小顺序排序,并将它们打印在终端屏幕上。排序选项 &plus4n 跳过四个字段(字段由空格分隔)然后按数字顺序对行进行排序。
  • pg 和 more 命令

    长输出通常可以由您在屏幕上压缩,但如果您通过 more 运行文本或使用 pg命令作为过滤器;一旦屏幕充满文本,显示就会停止。
    假设您有一个很长的目录列表。为了更容易阅读排序列表,通过管道输出more 如下 -
    
    $ls -l | grep "Aug" | sort +4n | more
    -rw-rw-r--  1 carol doc      1605 Aug 23 07:35 macros
    -rw-rw-r--  1 john  doc      2488 Aug 15 10:51 intro
    -rw-rw-rw-  1 john  doc      8515 Aug  6 15:30 ch07
    -rw-rw-r--  1 john  doc     14827 Aug  9 12:40 ch03
       .
       .
       .
    -rw-rw-rw-  1 john  doc     16867 Aug  6 15:56 ch05
    --More--(74%)
    
    一旦屏幕充满了由按文件大小顺序排列的行组成的文本,屏幕就会填满。屏幕底部是more 提示,您可以在其中键入命令以在已排序的文本中移动。
    完成此屏幕后,您可以使用 more 程序的讨论中列出的任何命令。