grep

  grep, egrep, fgrep – 打印出匹配条件的文字行

  假设我们只对Patterns of Enterprise Architecture这本书的订单感兴趣。使用grep,我们能限制只输出含有Patterns字符的订单。

    jfields$ cat order.* | sort | grep Patterns 
    8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99 
    8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition,

  假设退款订单113出了一些问题,你希望查看所有相关订单——你又需要使用grep了。

    jfields$ cat order.* | sort | grep ":dd 113, " 
    8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99 
    8:24:20 113, Refund sent to processing

  你会发现在grep上的匹配模式除了“113”外还有一些其它的东西。这是因为113还可以匹配上书目或价格,加上额外的字符后,我们可以精确的搜索到我们想要的东西。

  现在我们已经知道了退货的详细信息,我们还想知道日销售和退款总额。但我们只关心《Patterns of Enterprise Architecture》这本书的信息,而且只关心数量和价格。我现在要做到是切除我们不关心的任何信息。

  cut

  cut – 删除文件中字符行上的某些区域

  又要使用grep,我们用grep过滤出我们想要的行。有了我们想要的行信息,我们可以把它们切成小段,删除不需要的部分数据。

    jfields$ cat order.* | sort | grep Patterns 
    8:22:19 111, 1, Patterns of Enterprise Architecture, Kindle edition, 39.99 
    8:24:19 113, -1, Patterns of Enterprise Architecture, Kindle edition, 39.99 
    
    jfields$ cat order.* | sort | grep Patterns | cut -d"," -f2,5 
     1, 39.99 
     -1, 39.99

  现在,我们把数据缩减为我们计算想要的形式,把这些数据粘贴到Excel里立刻能得到结果了。

  cut是用来消减信息、简化任务的,但对于输出内容,我们通常会有更复杂的形式。假设我们还需要知道订单的ID,这样可以用来关联相关的其他信息。我们用cut可以获得ID信息,但我们希望把ID放到行的后,用单引号包上。

  sed

  sed – 一个流编辑器。它是用来在输入流上执行基本的文本变换。

  下面的例子展示了如何用sed命令变换我们的文件行,之后我们在再用cut移除无用的信息。

    jfields$ cat order.* | sort | grep Patterns  
    >| sed s/"[0-9:]* ([0-9]*), (.*)"/"2, '1'"/ 
    1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '111' 
    -1, Patterns of Enterprise Architecture, Kindle edition, 39.99, '113' 
    
    lmp-jfields01:~ jfields$ cat order.* | sort | grep Patterns  
    >| sed s/"[0-9:]* ([0-9]*), (.*)"/"2, '1'"/ | cut -d"," -f1,4,5 
    1, 39.99, '111' 
    -1, 39.99, '113'

  我们对例子中使用的正则表达式多说几句,不过也没有什么复杂的。正则表达式做了下面几种事情

  ● 删除时间戳

  ● 捕捉订单号

  ● 删除订单号后的逗号和空格

  ● 捕捉余下的行信息

  里面的引号和反斜杠有点乱,但使用命令行时必须要用到这些。

  一旦捕捉到了我们想要的数据,我们可以使用 1 & 2 来存储它们,并把它们输出成我们想要的格式。我们还在其中加入了要求的单引号,为了保持格式统一,我们还加入了逗号。后,用cut命令把不必要的数据删除。

  现在我们有麻烦了。我们上面已经演示了如何把log文件消减成更简洁的订单形式,但我们的财务部门需要知道订单里一共有哪些书。