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 ":\d\d 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文件消减成更简洁的订单形式,但我们的财务部门需要知道订单里一共有哪些书。