当你有大量数据时,通常很难处理这些信息及提取有用信息。正如在上节中学习的du命令,
系统命令很容易输出过量的信息。
Linux系统提供了一些命令行工具来处理大量数据。本节将会介绍一些每个系统管理员以及
日常Linux用户都应该知道的基本命令,这些命令能够让生活变得更加轻松。
4.3.1 排序数据
处理大量数据时的一个常用命令是sort命令。顾名思义,sort命令是对数据进行排序的。
默认情况下,sort 命令按照会话指定的默认语言的排序规则对文本文件中的数据行排序。
$ cat file1
one
two
three
four
five
$ sort file1
five
four
one
three
two
$
这相当简单。但事情并非总像看起来那样容易。看下面的例子。
$ cat file2
1
2
100
45
3
10
145
75
$ sort file2
1
10
100
145
2
3
45
75
$
如果你本期望这些数字能按值排序,就要失望了。默认情况下,sort命令会把数字当做字
符来执行标准的字符排序,产生的输出可能根本就不是你要的。解决这个问题可用-n参数,它会
告诉sort命令把数字识别成数字而不是字符,并且按值排序。
$ sort -n file2
1
2
3
10
45
75
100
145
$
现在好多了!另一个常用的参数是-M,按月排序。Linux的日志文件经常会在每行的起始位
置有一个时间戳,用来表明事件是什么时候发生的。
Sep 13 07:10:09 testbox smartd[2718]: Device: /dev/sda, opened
如果将含有时间戳日期的文件按默认的排序方法来排序,会得到类似于下面的结果。
$ sort file3
Apr
Aug
Dec
Feb
Jan
Jul
Jun
Mar
May
Nov
Oct
Sep
$
这并不是想要的结果。如果用-M参数,sort命令就能识别三字符的月份名,并相应地排序。
$ sort -M file3
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
$
还有其他一些方便的sort参数可用,如表4-6所示。
-k和-t参数在对按字段分隔的数据进行排序时非常有用,例如/etc/passwd文件。可以用-t
参数来指定字段分隔符,然后用-k参数来指定排序的字段。举个例子,要对前面提到的密码文件
/etc/passwd根据用户ID进行数值排序,可以这么做:
$ sort -t ‘:’ -k 3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
现在数据已经按第三个字段——用户ID的数值排序。
-n参数在排序数值时非常有用,比如du命令的输出。
$ du -sh * | sort -nr
1008k mrtg-2.9.29.tar.gz
972k bldg1
888k fbs2.pdf
760k Printtest
680k rsync-2.6.6.tar.gz
660k code
516k fig1001.tiff
496k test
496k php-common-4.0.4pl1-6mdk.i586.rpm
448k MesaGLUT-6.5.1.tar.gz
400k plp
注意,-r参数将结果按降序输出,这样就更容易看到目录下的哪些文件占用空间最多。
说明 本例中用到的管道命令(|)将du命令的输出重定向到sort命令。我们将在第11章中进一步讨论。
4.3.2 搜索数据
你会经常需要在大文件中找一行数据,而这行数据又埋藏在文件的中间。这时并不需要手动
翻看整个文件,用grep命令来帮助查找就行了。grep命令的命令行格式如下。
grep [options] pattern [file]
grep命令会在输入或指定的文件中查找包含匹配指定模式的字符的行。grep的输出就是包
含了匹配模式的行。
下面两个简单的例子演示了使用grep命令来对4.3.1节中用到的文件file1进行搜索。
$ grep three file1
three
$ grep t file1
two
three
$
第一个例子在文件file1中搜索能匹配模式three的文本。grep命令输出了匹配了该模式的
行。第二个例子在文件file1中搜索能匹配模式t的文本。这个例子里,file1中有两行匹配了
指定的模式,两行都输出了。
由于grep命令非常流行,它经历了大量的更新。有很多功能被加进了grep命令。如果查看
一下它的手册页面,你会发现它是多么的无所不能。
如果要进行反向搜索(输出不匹配该模式的行),可加-v参数。
$ grep -v t file1
one
four
five
$
如果要显示匹配模式的行所在的行号,可加-n参数。
$ grep -n t file1
2:two
3:three
$
如果只要知道有多少行含有匹配的模式,可用-c参数。
$ grep -c t file1
2
$
如果要指定多个匹配模式,可用-e参数来指定每个模式。
$ grep -e t -e f file1
two
three
four
five
$
这个例子输出了含有字符t或字符f的所有行。
默认情况下,grep命令用基本的Unix风格正则表达式来匹配模式。Unix风格正则表达式采
用特殊字符来定义怎样查找匹配的模式。
要想进一步了解正则表达式的细节,可以参考第20章的内容。
以下是在grep搜索中使用正则表达式的简单例子。
$ grep [tf] file1
two
three
four
five
$
正则表达式中的方括号表明grep应该搜索包含t或者f字符的匹配。如果不用正则表达式,
grep就会搜索匹配字符串tf的文本。
egrep命令是grep的一个衍生,支持 POSIX 扩展正则表达式。POSIX扩展正则表达式含有更
多的可以用来指定匹配模式的字符(参见第20章)。fgrep则是另外一个版本,支持将匹配模式
指定为用换行符分隔的一列固定长度的字符串。这样就可以把这列字符串放到一个文件中,然后
在fgrep命令中用其在一个大型文件中搜索字符串了。
4.3.3 压缩数据
如果你接触过Microsoft Windows,就必然用过zip文件。它如此流行,以至于微软从Windows
XP开始,就已经将其集成进了自家的操作系统中。zip工具可以将大型文件(文本文件和可执行
文件)压缩成占用更少空间的小文件。
Linux包含了多种文件压缩工具。虽然听上去不错,但这实际上经常会在用户下载文件时造
成混淆。表4-7列出了Linux上的文件压缩工具。
compress文件压缩工具已经很少在Linux系统上看到了。如果下载了带.Z扩展名的文件,通
常可以用第9章中介绍的软件包安装方法来安装compress包(在很多Linux发行版上叫作
ncompress),然后再用uncompress命令来解压文件。gzip是Linux上最流行的压缩工具。
gzip软件包是GNU项目的产物,意在编写一个能够替代原先Unix中compress工具的免费版
本。这个软件包含有下面的工具。
- gzip:用来压缩文件。
- gzcat:用来查看压缩过的文本文件的内容。
- gunzip:用来解压文件。
这些工具基本上跟bzip2工具的用法一样。
$ gzip myprog
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$
gzip命令会压缩你在命令行指定的文件。也可以在命令行指定多个文件名甚至用通配符来
一次性批量压缩文件。
gzip命令会压缩该目录中匹配通配符的每个文件。
4.3.4 归档数据
虽然zip命令能够很好地将数据压缩和归档进单个文件,但它不是Unix和Linux中的标准归档
工具。目前,Unix和Linux上最广泛使用的归档工具是tar命令。
tar命令最开始是用来将文件写到磁带设备上归档的,然而它也能把输出写到文件里,这种
用法在Linux上已经普遍用来归档数据了。
下面是tar命令的格式:
tar function [options] object1 object2 …
function参数定义了tar命令应该做什么,如表4-8所示。
每个功能可用选项来针对tar归档文件定义一个特定行为。表4-9列出了这些选项中能和tar
命令一起使用的常见选项。
这些选项经常合并到一起使用。首先,你可以用下列命令来创建一个归档文件:
tar -cvf test.tar test/ test2/
上面的命令创建了名为test.tar的归档文件,含有test和test2目录内容。接着,用下列命令:
tar -tf test.tar
列出tar文件test.tar的内容(但并不提取文件)。最后,用命令:
tar -xvf test.tar
通过这一命令从tar文件test.tar中提取内容。如果tar文件是从一个目录结构创建的,那整个目
录结构都会在当前目录下重新创建。
如你所见,tar命令是给整个目录结构创建归档文件的简便方法。这是Linux中分发开源程序
源码文件所采用的普遍方法。
窍门 下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件可以用命令tar -zxvf filename.tgz来解压。