练习 8:更多的重定向和过滤:head,tail,awk,grep,sed

原文:Exercise 8. Bash: more on redirection and filtering: head, tail, awk, grep, sed

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

现在你试过了 Linux,我会介绍一下 Unix 的方式。注意看。

这就是 Unix 的哲学:写一些程序,只做一件事,并且把它做好。编写程序,使其一起工作。编写程序来处理文本流,因为这是一个通用接口。

实际上这意味着为了熟练使用 Linux,你需要知道如何从一个程序中获取输出,并将其提供给另一个程序,通常会在此过程中修改它。通常,你可以通过使用管道,将多个程序合并在一起,它允许将一个程序的输出连接到另一个程序。像这样:

这里发生的事情真的很简单。几乎每个 Linux 程序在启动时打开这三个文件:

stdin - 标准输入。这是程序读取东西的地方。 stdout - 标准输出。这是程序写出东西的地方。 stderr - 标准错误。这是程序报错的地方。

这就是它的读取方式:

还有另一种方式来描绘发生的事情,如果你喜欢 South Park 风格的幽默,但要小心:看到的是不会是不可见的!警告!你无法忽略它

让我们考虑以下管道,它接受ls -al的输出,仅打印文件名和文件修改时间:

这是所发生事情的概述:

更详细地说,这是每一步发生的事情:

第一步:ls -al,我们获取了目录列表,每一列都叫做字段。

第二步:ls -al | tr -s ' ',我们在两个字段之间只保留,因为cut不能将多个空格理解为一种方式,来分离多个字段。

第三步:我们只保留字段 8 和 9,它们是我们想要的。

现在你学到了,如何从一个程序获取输入,并将其传给另一个程序,并且如何转换它。

这样做

你会看到什么

解释

  • 只打印目录列表中的前 5 个条目。

  • 只打印目录列表中的后 5 个条目。

  • 只打印修改时间和文件名。注意我如何使用awk,这比cut更聪明。这里的区别就是,cut只能将单个符号(我们这里是空格)理解为一种方式,来分离字段(字段分隔符),awk将任意数量的空格和 TAB 看做文件分隔符,所以没有必要使用tr来消除不必要的空格。

  • 按此顺序打印文件名和修改时间。这又是cat不能做的事情。

  • 工整地打印文件名和修改时间。注意现在输出如何变得更清晰。

  • 仅打印目录列表中包含bash的行。

  • 将目录列表的输出写入文件ls.out

  • 打印出ls.outcat是最简单的可用程序,允许你打印出一个文件,没有更多了。尽管如此简单,但在构建复杂管道时非常有用。

  • 打印出ls.out,将所有的bash条目替换为I replace this!!!sed是一个强大的流编辑器,它非常非常非常有用。

附加题

  • 打开headtailawkgrepsed的手册页。不要害怕,只要记住手册页面总是在那里。有了一些实践,你将能够实际了解他们。

  • 查找grep选项,能够打印它找到的那行之前,或之后的一行。

  • 使用 Google 搜索awk printf命令,尝试了解它如何工作。

  • 阅读 The Useless Use of Cat Award。尝试那里的一些例子。

Last updated