13.11. 阅读文本文件的其它命令

我们已经向你介绍了几个基本的在文本编辑器内阅读文件的 shell 提示下的命令。下面列举了其它几个此类命令。

13.11.1. head 命令

你可以使用 head 命令来查看文件的开头部分。此项命令是:

head <filename>

head 是一个有用的命令,但是由于它只限于文件的最初几行,你看不到文件实际上有多长。按照默认设置,你只能阅读文件的前十行。你可以通过指定一个数字选项来改变要显示的行数,如下面的命令所示:

head -20 <filename>

13.11.2. tail 命令

head 命令恰恰相反的是 tail 命令。使用 tail 命令,你可以查看文件结尾的十行。这有助于查看日志文件的最后十行来阅读重要的系统消息。你还可以使用 tail 来观察日志文件被更新的过程。使用 -f 选项,tail 会自动实时地把打开文件中的新消息显示到屏幕上。例如,要活跃地观察 /var/log/messages,以根用户身份在 shell 提示下键入以下命令:

tail -f /var/log/messages

13.11.3. grep 命令

grep 命令对于在文件中查找指定的字串很有用途。例如,如果你想在 sneakers.txt 文件中查找每一个提到“coffee”的地方,你可以键入:

grep coffee sneakers.txt

你就会看到文件中带有“coffee”的每一行。

窍门窍门
 

除非另有说明,grep 搜寻是区分大小写(case sensitive)的。这意味着搜寻 Coffee 与搜寻 coffee 不同。在 grep 的选项中有 -i 这一项,它会允许你在搜寻文件时不区分大小写。关于这个命令的详情,请阅读 grep 的说明书(man)页。

13.11.4. I/O 重导向和管道

当你想贮存及(或)打印信息以便以后阅读时,你可以使用管道和输出重导向。

譬如,你可以使用 grep 来搜寻文件中的某一类内容,然后把结果保存在文件中或发送给打印机。

譬如,要打印 sneakers.txt 文件中关于“coffee”的行,只需键入:

grep coffee sneakers.txt | lpr

13.11.5. 通配符和正则表达式

如果你忘记了你要找的文件名怎么办?答案是使用通配符或正则表达式。你在不知道完整的文件名的情况下也可以在该文件上执行操作。只需填写你所知的部分,剩余部分用通配符(wildcard)来替代。通配符是特殊符号,你可以用它们来替换字母、数字和符号,这比仔细查阅长目录列表来寻找某个文件要容易得多。

窍门窍门
 

要阅读关于通配符和正则表达式的详情,请看一看 bash 的说明书页(man bash)。请记住,你可以把这个文件存为一个文本文件,方法是键入 man bash | col -b > bash.txt 命令。然后,你便可以使用 lessvivi bash.txt)来打开并阅读该文件。如果你想打印该文件,请留意它的篇幅很长。

我们知道这个文件叫做“sneak____.txt”,因此键入:

ls sneak*.txt

这就会显示这个文件的全名:

sneakers.txt

你在搜索时最常使用的可能是星号(*)。这个星号会选出匹配你所搜寻图案的一切。因此即便你键入了:

ls *.txt

或:

ls sn*

你会发现 sneakers.txt 以及其它以 sn 开头的文件或以 .txt 结尾的文件。这有助于尽可能地缩小搜寻范围。

要缩小搜寻范围的另一种方法是使用问号(?)。和星号相似,使用 ? 能帮助你定位匹配某一搜寻图案的文件。

然而在这种情况下,? 对匹配单个字符有用,因此如果你搜寻 sneaker?.txt,你会得到 sneakers.txt 这个搜寻结果,以及(或者) sneakerz.txt,如果这个文件存在的话。

正则表达式比直截了当的星号和问号要复杂得多。

譬如,当一个星号恰巧是一个文件名的一部分时,比如说,如果文件 sneakers.txt 实际上叫做 sneak*.txt 的时候,正则表达式就会发挥它的作用了。

使用反斜线(\),你就可以指定你使用星号并不是想搜寻一切,实际上你是在寻找名称中带有星号的文件。

如果这个文件叫做 sneak*.txt,键入:

sneak\*.txt

下面是通配符和正则表达式的一个简短列表: