4\bash shell 命令

4.1 监测程序

跟踪运行在系统中的程序,有几个命令行工具可以提供帮助。介绍在 Linux 系统中管理程序的一些基础工具。

4.1.1 探查进程

程序:进程(process)。

要想监测这些进程,必须熟悉 ps 命令的用法。

ps 命令(时间点的具体信息)

但是有稳健性和复杂性:数不清的选项或许让 ps 命令成了最难掌握的命令。大多数系统管理员在找到一组能够提供所需信息的选项之后,会一直坚持只使用这些选项。
在默认情况下,ps 命令并没有提供太多的信息:

$ ps
  PID TTY TIME CMD

  3081 pts/0  00:00:00 bash
  3209 pts/0  00:00:00 ps
$

ps 命令默认只显示运行在当前终端中属于当前用户的那些进程。

当前只有 bash shell 在运行(记住,shell 只是运行在系统中的另一个程序而已),当然 ps命令本身也在运行。
ps 命令的基本输出显示了程序的进程 ID(process ID,PID)、进程运行在哪个终端(TTY)
及其占用的 CPU 时间,进程名

Linux 系统中使用的 GNU ps 命令支持以下 3 种类型的命令行选项:
 Unix 风格选项,选项前加单连字符;
 BSD 风格选项,选项前不加连字符;
 GNU 长选项,选项前加双连字符。
下面将进一步解析这 3 种选项类型,并举例演示其用法。

1. Unix 风格选项
Unix 风格选项源自贝尔实验室开发的 AT&T Unix 系统中的 ps 命令

-A                 显示所有进程
-N                 显示与指定参数不符的所有进程
-a                 显示除控制进程(session leader )和无终端进程外的所有进程
-d                 显示除控制进程外的所有进程
-e                 显示所有进程
-C cmdlist     显示包含在 cmdlist 列表中的进程
-G grplist     显示组 ID 在 grplist 列表中的进程
-U userlist    显示属主的用户 ID 在 userlist 列表中的进程
-g grplist       显示会话或组 ID 在 grplist 列表中的进程
-p pidlist       显示 PID 在 pidlist 列表中的进程
-s sesslist    显示会话 ID 在 sesslist 列表中的进程
-t ttylist         显示终端 ID 在 ttylist 列表中的进程
-u userlist     显示有效用户 ID 在 userlist 列表中的进程
-F                 显示更多的额外输出(相对-f 选项而言)
-O format      显示默认的输出列以及 format 列表指定的特定列

-M                 显示进程的安全信息
-c                 显示进程的额外的调度器信息
-f                  显示完整格式的输出
-j                  显示作业信息
-l                  显示长列表
-o format         仅显示由 format 指定的列
-y                  不显示进程标志
-Z                 显示安全上下文信息
-H                 以层级格式显示进程(显示父进程)
-n namelist   定义要在 WCHAN 输出列中显示的值
-w                采用宽输出格式,不限宽度显示
-L                 显示进程中的线程
-V                 显示 ps 命令的版本号

查看系统中运行的所有进程,可以使用-ef 选项组合(ps 命令允许像这样把选项合并在一起)。

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:14 ? 00:00:02 /sbin/init splash
root 2 0 0 12:14 ? 00:00:00 [kthreadd]
root 3 2 0 12:14 ? 00:00:00 [rcu_gp]
root 4 2 0 12:14 ? 00:00:00 [rcu_par_gp]
root 5 2 0 12:14 ? 00:00:00
[kworker/0:0-events]
root 6 2 0 12:14 ? 00:00:00
[kworker/0:0H-kblockd]
root 7 2 0 12:14 ? 00:00:00
[kworker/0:1-events]
...
rich 2209 1438 0 12:17 ? 00:00:01 /usr/libexec/
gnome-terminal-
rich 2221 2209 0 12:17 pts/0 00:00:00 bash
rich 2325 2221 0 12:20 pts/0 00:00:00 ps -ef
$

Linux 系统中运行着大量的进程。
这个例子用了两个选项:

-e 选项指定显示系统中运行的所有进程;-f 选项则扩充输出内容以显示一些有用的信息列。
 UID:启动该进程的用户。
 PID:进程 ID。

 PPID:父进程的 PID(如果该进程是由另一个进程启动的)。
 C:进程生命期中的 CPU 利用率。
 STIME:进程启动时的系统时间。
 TTY:进程是从哪个终端设备启动的。
 TIME:运行进程的累计 CPU 时间。
 CMD:启动的程序名称。
由此得到了合理的信息量,这也正是很多系统管理员乐于看到的。
还想获得更多的信息,可以使用-l 选项,产生长格式输出。

$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 500 3081 3080 0 80 0 - 1173 do_wai pts/0 00:00:00
bash
0 R 500 4463 3081 1 80 0 - 1116 - pts/0 00:00:00 ps
$

 F:内核分配给进程的系统标志。
 S:进程的状态(O 代表正在运行;S 代表在休眠;R 代表可运行,正等待运行;Z 代表僵化,已终止但找不到其父进程;T 代表停止)。
 PRI:进程的优先级(数字越大,优先级越低)。
 NI:谦让度(nice),用于决定优先级。
 ADDR:进程的内存地址。
 SZ:进程被换出时所需交换空间的大致大小。
 WCHAN:进程休眠的内核函数地址。

2. BSD 风格选项

BSD 版的 ps 命令选项如下

T         显示与当前终端关联的所有进程
a         显示与任意终端关联的所有进程
g         显示包括控制进程在内的所有进程
r         仅显示运行中的进程
x         显示所有进程,包括未分配任何终端的进程
U         userlist 显示属于 userlist 列表中某个用户 ID 所有的进程
p         pidlist 显示 PID 在 pidlist 列表中的进程

t         ttylist 显示与 ttylist 列表中的某个终端关联的进程
O         format 除了标准列,还输出由 format 指定的列
X         以寄存器格式显示数据
Z         在输出中包含安全信息
j         显示作业信息
l         采用长格式显示
o format         仅显示由 format 指定的列
s         采用信号格式显示
u         采用基于用户的格式显示
v         采用虚拟内存格式显示
N namelist         定义要在 WCHAN 输出列中显示的值
O order             定义信息列的显示顺序
S         将子进程的数值统计信息(比如 CPU 和内存使用情况)汇总到父进程中
c         显示真实的命令名称(用以启动该进程的程序名称)
e         显示命令使用的环境变量
f         用层级格式来显示进程,显示哪些进程启动了哪些进程
h         不显示头信息
k sort          指定用于排序输出的列
n         使用数值显示用户 ID、组 ID 以及 WCHAN 信息
w         为更宽的终端屏幕生成宽输出
H         将线程显示为进程
m         在进程之后显示线程
L         列出所有的格式说明符
V         显示 ps 命令的版本

在使用 BSD 风格的选项时,ps 命令会自动改变输出以模仿 BSD 格式。
下面是使用 l 选项的输出。

$ ps l
$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY
TIME COMMAND
4 1000 1491 1415 20 0 163992 6580 poll_s Ssl+ tty2
0:00 /usr/li
4 1000 1496 1491 20 0 225176 58712 ep_pol Sl+ tty2
0:05 /usr/li
0 1000 1538 1491 20 0 192844 15768 poll_s Sl+ tty2
0:00 /usr/li
0 1000 2221 2209 20 0 10608 4740 do_wai Ss
pts/0 0:00 bash
0 1000 2410 2221 20 0 11396 1156 - R+
pts/0 0:00 ps l
$

上述很多输出列跟使用 Unix 风格选项时是一样的,但还是有一些不同之处。
 VSZ:进程占用的虚拟内存大小(以 KB 为单位)。
 RSS:进程在未被交换出时占用的物理内存大小。
 STAT:代表当前进程状态的多字符状态码。
        很多系统管理员喜欢 BSD 风格的 l 选项,因为能输出更详细的进程状态码(STAT 列)。多
字符状态码能比 Unix 风格输出的单字符状态码更清楚地表明进程的当前状态。
        第一个字符采用了与 Unix 风格的 S 输出列相同的值,表明进程是在休眠、运行还是等待。
第二个字符进一步说明了进程的状态。
 <:该进程以高优先级运行。
 N:该进程以低优先级运行。
 L:该进程有锁定在内存中的页面。
 s:该进程是控制进程。
 l:该进程拥有多线程。
 +:该进程在前台运行。
从先前展示的简单例子中可以看出,bash 命令处于休眠状态,但同时它也是一个控制进程
(会话中的主进程),而 ps 命令则运行在系统前台。

3. GNU 长选项

GNU 开发人员在经过改进的新 ps 命令中加入了另外一些选项,其中一些 GNU 长选项复制
了现有的 Unix 或 BSD 风格选项的效果,而另外一些则提供了新功能。

--deselect                 显示除命令行中列出的进程之外的其他进程
--Group grplist         显示组 ID 在 grplist 列表中的进程
--User userlist         显示用户 ID 在 userlist 列表中的进程
--group grplist         显示有效组 ID 在 grplist 列表中的进程
--user userlist         显示有效用户 ID 在 userlist 列表中的进程
--pid pidlist         显示 pid 在 pidlist 列表中的进程
--ppid pidlist         显示父 pid 在 pidlist 列表中的进程
--sid sidlist         显示会话 ID 在 sidlist 列表中的进程

--tty ttylist                 显示终端设备 ID 在 ttylist 列表中的进程
--format format         仅显示由 format 指定的列
--context                 显示额外的安全信息
--cols n                 将屏幕宽度设置为 n 列
--columns n         将屏幕宽度设置为 n 列
--cumulative         包含已停止的子进程的信息
--forest                 用层级结构显示出进程和父进程之间的关系
--headers                 在每页输出中都显示列名
--no-headers         不显示列名
--lines n                 将屏幕高度设置为 n 行
--rows n                 将屏幕高度设置为 n 行
--sort order         指定用于排序输出的列
--width n                 将屏幕宽度设置为 n 列
--help                 显示帮助信息
--info                 显示调试信息
--version                 显示 ps 命令的版本号

可以混用 GNU 长选项和 Unix 或 BSD 风格的选项来定制输出。作为一个 GNU 长选项,
--forest 选项能够使用 ASCII 字符来绘制可爱的图表以显示进程的层级信息:

1981 ? 00:00:00 sshd
3078 ? 00:00:00 \_ sshd
3080 ? 00:00:00 \_ sshd
3081 pts/0 00:00:00 \_ bash
16676 pts/0 00:00:00 \_ ps

这种格式可以轻而易举地跟踪子进程和父进程。

4.1.2 实时监测进程

top 命令(实时)

ps 命令(时间点)与 ps 命令相似,top 命令也可以显示进程信息,但采用的是实时方式。

详细列表,有些列跟 ps 命令的输出类似。
 PID:进程的 PID。
 USER:进程属主的用户名。
 PR:进程的优先级。 

 NI:进程的谦让度。
 VIRT:进程占用的虚拟内存总量。
 RES:进程占用的物理内存总量。
 SHR:进程和其他进程共享的内存总量。
 S:进程的状态(D 代表可中断的休眠,R 代表运行,S 代表休眠,T 代表被跟踪或停止,
Z 代表僵化 )。
 %CPU:进程使用的 CPU 时间比例。
 %MEM:进程使用的可用物理内存比例。
 TIME+:自进程启动到目前为止所占用的 CPU 时间总量。
 COMMAND:进程所对应的命令行名称,也就是启动的程序名。
        在默认情况下,top 命令在启动时会按照%CPU 值来对进程进行排序,你可以在 top 命令
运行时使用多种交互式命令来重新排序。每个交互式命令都是单字符,在 top 命令运行时键入
可改变 top 的行为。

键入 f 允许你选择用于对输出进行排序的字段,键入 d 允许你修改轮询间隔(polling interval),键入 q 可以退出 top。用户对 top 命令输出有很大的控制权。利用该工具,能找出占用系统大量资源的进程。

4.1.3 结束进程

有时候,进程会被挂起,此时只需动动手让进程重新运行或结束就行了。

有时候,进程会霸占着 CPU 且拒绝让出。

在这两种情景下,都需要能够控制进程的命令。

Linux 沿用了 Unix 的进程间通信方法。在 Linux 中,进程之间通过信号来通信。进程的信号是预定义好的一个消息,进程能识别该消息并决定忽略还是做出反应。进程如何处理信号是由开发人员通过编程来决定的。大多数编写完善的应用程序能接收和处理标准 Unix 进程信号。这些信号如表下:

信 号                        名 称                        描 述
1                                 HUP                         挂起
2                                 INT                         中断
3                                 QUIT                        结束运行
9                                 KILL                         无条件终止
11                                 SEGV                         段错误
15                                 TERM                         尽可能终止
17                                 STOP                         无条件停止运行,但不终止
18                                TSTP                         停止或暂停,但继续在后台运行
19                                 CONT                         在 STOP 或 TSTP 之后恢复执行

可以向运行中的进程发出进程信号:kill 和 pkill。

1. kill 命令

kill 命令可以通过 PID 向进程发送信号。在默认情况下,kill 命令会向命令行中列出的所有 PID 发送 TERM 信号。只能使用进程的 PID 而不能使用其对应的程序名
要发送进程信号,必须是进程的属主root 用户:

$ kill 3940
-bash: kill: (3940) - Operation not permitted
$

TERM 信号会告诉进程终止运行。但不服管教的进程通常会忽略这个请求。如果要强制终止,
则-s 选项支持指定其他信号(用信号名或信号值)。
从下例可以看到,kill 命令不会有任何输出:

# kill -s HUP 3940
#

要检查 kill 命令是否生效,可以再次执行 ps 命令或 top 命令,看看那些进程是否已经停止运行。


2. pkill 命令

pkill 命令可以使用程序名代替 PID 来终止进程,这就方便多了。除此之外,pkill 命令也允许使用通配符,当系统出问题时,这是一个非常有用的工具:

# pkill http*
#

该命令将“杀死”所有名称以 http 起始的进程,比如 Apahce Web Server 的 httpd 服务。
tips: 以 root 身份使用 pkill 命令时要格外小心。命令中的通配符很容易意外地将系统的重要进程终止。这可能会导致文件系统损坏。

4.2 监测磁盘空间

有几个命令行命令可以帮助你管理 Linux 系统中的存储设备。


4.2.1 挂载存储设备

Linux 文件系统会将所有的磁盘都并入单个虚拟目录。

在使用新的存储设备之前,需要将其放在虚拟目录中。这项工作称为挂载(mounting)。
在今天的图形化桌面环境中,大多数 Linux 发行版能自动挂载特定类型的可移动存储设备。
所谓可移动存储设备(显然)指的是那种可以从 PC 中轻易移除的媒介,比如 DVD 和 U 盘。

如果你使用的发行版不支持自动挂载和卸载可移动存储设备,则只能手动操作了。

本节将介绍一些可以帮你管理可移动存储设备的 Linux 命令行命令。

1. mount 命令

用于挂载存储设备的命令。在默认情况下,mount 命令会输出当前系统已挂载的设备列表

但是,除了标准存储设备,较新版本的内核还会挂载大量用作管理目的的虚拟文件系统。这使得 mount 命令的默认输出非常杂乱。如果知道设备分区使用的文件系统类型,可以这样过滤输出。

$ mount -t ext4
/dev/sda5 on / type ext4 (rw,relatime,errors=remount-ro)
$ mount -t vfat
/dev/sda2 on /boot/efi type vfat
(rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso88591,
shortname=mixed,errors=remount-ro)
/dev/sdb1 on /media/rich/54A1-7D7D type vfat
(rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,
codepage=437,
iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,
errors=remountro,uhelper=udisks2)
$

mount 命令提供了 4 部分信息。
 设备文件名
 设备在虚拟目录中的挂载点
 文件系统类型
 已挂载设备的访问状态
在上面例子的最后一行输出中,U 盘被 GNOME 桌面自动挂载到了挂载点/media/rich/54A1-
7D7D。vfat 文件系统类型说明它是在 Microsoft Windows PC 中格式化的。
要手动在虚拟目录中挂载设备,需要以 root 用户身份登录,或是以 root 用户身份运行 sudo
命令。下面是手动挂载设备的基本命令:

mount -t type device directory

其中,type 参数指定了磁盘格式化所使用的文件系统类型。Linux 可以识别多种文件系统类型。
如果与 Windows PC 共用移动存储设备,那么通常需要使用下列文件系统类型。
 vfat:Windows FAT32 文件系统,支持长文件名。
 ntfs:Windows NT 及后续操作系统中广泛使用的高级文件系统。
 exfat:专门为可移动存储设备优化的 Windows 文件系统。
 iso9660:标准 CD-ROM 和 DVD 文件系统。
大多数 U 盘会使用 vfat 文件系统格式化。如果需要挂载数据 CD 或 DVD,则必须使用 iso9660文件系统类型。
        后面两个参数指定了该存储设备的设备文件位置以及挂载点在虚拟目录中的位置。例如,手
动将 U 盘/dev/sdb1 挂载到/media/disk,可以使用下列命令:

mount -t vfat /dev/sdb1 /media/disk

一旦存储设备被挂载到虚拟目录,root 用户就拥有了对该设备的所有访问权限,而其他用户
的访问则会被限制。可以通过目录权限(参见第 7 章)指定用户对设备的访问权限。
        如果需要使用 mount 命令的一些高级特性,可以参见表 4-5 中列出的相关选项。
 mount 命令选项
选 项                                                 描 述
-a                                                         挂载/etc/fstab 文件中指定的所有文件系统
-f                                                         模拟挂载设备,但并不真正挂载
-F                                                         和-a 选项一起使用时,同时挂载所有文件系统
-v                                                         详细模式,显示挂载设备的每一步操作
-i                                                         不使用/sbin/mount.filesystem 下的任何文件系统协助文件
-l                                                         自动给 ext2、ext3、ext4 或 XFS 文件系统添加文件系统标签
-n                                                         挂载设备,但不在/etc/mtab 已挂载设备文件中注册
-p num                         进行加密挂载时从文件描述符 num 中获得口令
-s                                 忽略该文件系统不支持的挂载选项
-r                                 将设备挂载为只读
-w                                 将设备挂载为可读写(默认选项)
-L label                         将设备按指定的 label 挂载
-U uuid                         将设备按指定的 uuid 挂载
-O                                 和-a 选项一起使用,限制其所作用的文件系统
-o                                 给文件系统添加特定的选项


-o 选项允许在挂载文件系统时添加一系列以逗号分隔的额外选项。常用选项如下。
 ro:以只读形式挂载。
 rw:以读写形式挂载。
 user:允许普通用户挂载该文件系统。
 check=none:挂载文件系统时不执行完整性校验。
 loop:挂载文件。

2. umount 命令

移除可移动设备时,不能直接将设备拔下,应该先卸载。
提示: Linux 不允许直接弹出已挂载的 CD 或 DVD。如果在从光驱中移除 CD 或 DVD 时遇到麻烦,那么最大的可能是它还在虚拟目录中挂载着。应该先卸载,然后再尝试弹出。

卸载设备的命令是 umount(是的,你没看错,命令名中并没有字母“n”,不是“unmount”,这一点有时候很让人困惑)。umount 命令的格式非常简单:

umount [directory | device ]

umount 命令支持通过设备文件或者挂载点来指定要卸载的设备。如果有任何程序正在使用
设备上的文件,则系统将不允许卸载该设备。

# umount /home/rich/mnt
umount: /home/rich/mnt: device is busy
umount: /home/rich/mnt: device is busy
# cd /home/rich
# umount /home/rich/mnt
# ls -l mnt
total 0
#

       在本例中,因为命令行提示符仍然位于已挂载设备的文件系统中,所以 umount 命令无法卸
载该镜像文件。一旦命令提示符移出其镜像文件系统,umount 命令就能成功卸载镜像文件了

4.2.2 使用 df 命令

查看所有已挂载磁盘的使用情况:

$ df -t ext4 -t vfat
Filesystem     1K-blocks      Used         Available     Use%     Mounted on
/dev/sda5       19475088     7326256         11136508     40%     /
/dev/sda2         524272         4             524268     1%      /boot/efi
/dev/sdb1         983552     247264             736288    26%     /media/
rich/54A1-7D7D
$

df 命令会逐个显示已挂载的文件系统。与 mount 命令类似,df 命令会输出内核挂载的所有虚拟文件系统,因此可以使用-t 选项来指定文件系统类型,进而过滤输出结果。该命令的输出如下。
 设备文件位置
 包含多少以 1024 字节为单位的块
 使用了多少以 1024 字节为单位的块
 还有多少以 1024 字节为单位的块可用
 已用空间所占的百分比
 设备挂载点

df 命令的大部分选项你根本不会用到。

常用选项之一是-h,该选项会以人类易读(human-readable)的形式显示磁盘空间,通常用 M 来替代兆字节,用 G 来替代吉字节:

$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 19G 7.0G 11G 40% /
/dev/sda2 512M 4.0K 512M 1% /boot/efi
/dev/sdb1 961M 242M 720M 26% /media/rich/54A1-7D7D
$

df 命令在排查系统磁盘空间问题时非常有价值。
注意 记住,Linux 系统后台一直有进程在处理文件。df 命令的输出值反映的是 Linux 系统认为的当前值。正在运行的进程有可能创建或删除了某个文件,但尚未释放该文件。这个值是不会被计算进闲置空间的。

4.2.3 使用 du 命令

通过 df 命令,发现哪个磁盘存储空间不足。
du 命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这有助于你快速判断系统中是否存在磁盘占用“大户”。
在默认情况下,du 命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,并以磁盘块为单位来表明每个文件或目录占用了多大存储空间。对标准大小的目录来说,输出内容可不少。下面是 du 命令的部分输出:
 

$ du
484       ./.gstreamer-0.10
8         ./Templates
8         ./Download
8         ./.ccache/7/0
24        ./.ccache/7
368       ./.ccache/a/d
384       ./.ccache/a
424       ./.ccache
8         ./Public
8         ./.gphpedit/plugins
32        ./.gphpedit
72        ./.gconfd
128       ./.nautilus/metafiles
384       ./.nautilus
8         ./Videos
8         ./Music
16        ./.config/gtk-2.0
40        ./.config
8         ./Documents

每行最左侧的数字是每个文件或目录所占用的磁盘块数。注意,这个列表是从目录层级的最
底部开始,然后沿着其中包含的文件和子目录逐级向上的。
单纯的 du 命令作用并不大。我们更想知道每个文件和目录各占用了多大的磁盘空间
下面这些选项能让 du 命令的输出更加清晰易读。
 -c:显示所有已列出文件的总大小。
 -h:按人类易读格式输出大小,分别用 K 表示千字节、M 表示兆字节、G 表示吉字节。
 -s:输出每个参数的汇总信息。系统管理员的下一步任务是使用一些文件处理命令来操作大量数据。这正是下一节的主题。

4.3 处理数据文件

        当有大量数据时,处理这些数据并从中提取有用信息通常不是件容易事。通过上一节的 du
命令可知,系统命令很容易输出让人难以招架的过量信息。
        Linux 系统提供了一些可以帮助你管理大量数据的命令行工具。下面是基本命令

4.3.1 数据排序

sort命令:对数据进行排序

在默认情况下,sort 命令会依据会话所指定的默认语言的排序规则来对文本文件中的数据
行进行排序:

sort file2
$ cat file1
one
two
three
four
five
$ sort file1
five
four
one
three
two
$

非常简单。但事情往往并不像看起来那么简单:

$ cat file2
1
2
100
453
10
145
75
$ sort file2
1
10
100
145
2
3
45
75
$

在默认情况下,sort 命令会将数字视为字符并执行标准的字符排序,

sort -n file2

可以使用-n 选项来解决这个问题,该选项会将数字按值排序

$ sort -n file2
1
2
3
10
45
75
100
145
$

另一个常用的选项是-M,该选择可以将数字按月排序。Linux 的日志文件经常在每行的起始位置有一个时间戳,以表明事件是什么时候发生的:

Apr 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
$
sort -M file3

加入-M 选项,那么 sort 命令就能识别三字符的月份名并正确排序。

$ sort -M file3
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
$
sort 命令其他选项

短 选 项       长 选 项                                          描 述
-b                --ignore-leading-blanks     排序时忽略起始的空白字符
-C               --check=quiet                   不排序,如果数据无序也不要报告
-c                 --check                           不排序,但检查输入数据是否有序,无序的话就报告
-d                 --dictionary-order           仅考虑空白字符和字母数字字符,不考虑特殊字符
-f                   --ignore-case                大写字母默认先出现,该选项会忽略大小写
-g                  --general-numeric-sort     使用一般数值进行排序
-i                    --ignore-nonprinting     在排序时忽略不可打印字符
-k             --key=POS1[,POS2]      排序键从 POS1 位置开始POS2 位置结束(如果指定POS2)
-M                 --month-sort                                    用三字符的月份名按月份排序
-m                   --merge                         合并两个已排序数据文件
-n                 --numeric-sort                 将字符串按数值意义排序
-o                 --output=file                         将排序结果写入指定文件
-R                 --random-sort                         根据随机哈希排序
                        --random-source=FILE         指定-R 选项用到的随机字节文件
-r                 --reverse                                 逆序排序(升序变成降序)
-S                 --buffer-size=SIZE                 指定使用的内存大小
-s                 --stable                                         禁止 last-resort 比较,实现稳定排序
-T                 --temporary-directory=DIR         指定用于保存临时工作文件的目录
-t                 --field-separator=SEP                 指定字段分隔符
-u                 --unique                      和-c 选项合用时,检查严格排序;不和-c 选项合用时,相同行
                                                        仅输出一次
-z                 --zero-terminated                 在行尾使用 NULL 字符代替换行符

在对按字段分隔的数据(比如/etc/passwd 文件)进行排序时,-k 选项和-t 选项非常方便。
先使用-t 选项指定字段分隔符,然后使用-k 选项指定排序字段。

例如,要根据用户 ID 对/etc/passwd 按数值排序,可以这么做:

$ 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 选项对数值按照降序排列,这样便能轻而易举地看出目录中的哪些文件占用磁盘空间最多。

4.3.2 数据搜索

查找位于文件中间部分某处的数据行。使用 grep 命令来帮助查找。

grep [options] pattern [file]

grep 命令会在输入或指定文件中逐行搜索匹配指定模式的文本。

$ grep three file1
three
$ grep t file1
two
three
$

第一个例子在文件 file1 中搜索能匹配模式 three 的文本。grep 命令输出了匹配该模式的

第二个例子在文件 file1 中t 的文本,其中,file1 中有两行匹配指定模式,所以均被输出。

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 扩展正则表达式,其中包含更多可用于指定匹配模式的字符(第 20 章)。fgrep 则是另外一个版本,支持将匹配模式指定为以换行符分
隔的一系列固定长度的字符串。这样就可以将这些字符串放入一个文件中,然后在 fgrep 命令中使用其搜索大文件中的字符串。

4.3.3 数据压缩

 Microsoft Windows中 zip 文件非常流行,zip 可以轻松地将大文件(文本文件和可执行文件)压缩成占用空间更少的小件文。
Linux 包含多种文件压缩工具。虽然听上去不错,但实际上这经常会在用户下载文件时造成
混淆。下面 列出了可用的 Linux 文件压缩工具。

工具        文件扩展名        描述采用

bzip2         .bz2                Burrows-Wheeler块排序文本压缩算法和霍夫曼编码

gzip           .gz                   GNU 压缩工具,用Lempel-Zivwelch 编码

xz              .xz                   日渐流行的通用压缩工具

zip             .zip                  Windows中PKZIP 工具的Unix实现
gzip 是 Linux 中最流行的压缩工具。
gzip 软件包是 GNU 项目的产物,旨在编写一个能够替代原先 Unix 中 compress 工具的免费版本。这个软件包包括以下文件。
 gzip:用于压缩文件。
 gzcat:用于查看压缩过的文本文件的内容。
 gunzip:用于解压文件。

这些工具基本上跟 bzip2 一样:

gzip:用于压缩文件
$ gzip myprog
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz
$
gzip:用通配符来一次性压缩多个文件:
$ gzip my*
$ ls -l my*
-rwxr--r-- 1 rich rich 103 Sep 6 13:43 myprog.c.gz
-rwxr-xr-x 1 rich rich 5178 Sep 6 13:43 myprog.gz
-rwxr--r-- 1 rich rich 59 Sep 6 13:46 myscript.gz
-rwxr--r-- 1 rich rich 60 Sep 6 13:44 myscript2.gz
$

gzip 命令会压缩该目录中匹配通配符的每个文件。

4.3.4 数据归档

zip 它并不是 Unix 和 Linux 中的标准归档工具。

目前,Unix 和 Linux 中最流行的归档工具是 tar 命令

tar 命令最开始是用于将文件写入磁带设备以作归档,但它也可以将输出写入文件,这种用法成了在 Linux 中归档数据的普遍做法。

tar 命令的格式:tar function [options] object1 object2 ...

function 定义了 tar 命令要执行的操作,

操 作         长 选 项              描 述
-A         --concatenate         将一个 tar 归档文件追加到另一个 tar 归档文件末尾
-c         --create                  创建新的 tar 归档文件
-d         --diff                      检查归档文件和文件系统的不同之处
              --delete                从 tar 归档文件中删除文件
-r         --append                将文件追加到 tar 归档文件末尾
-t         --list                        列出 tar 归档文件的内容
-u         --update                将比 tar 归档文件中已有的同名文件更新的文件追加到该归档文件
-x         --extract                 从 tar 归档文件中提取文件

option(选项)来定义针对 tar 归档文件的具体行为

选 项                 描 述
-C dir                 切换到指定目录
-f file                 将结果输出到文件(或设备)
-j                         将输出传给 bzip2 命令进行压缩

-J                         将输出传给 xz 命令进行压缩
-p                         保留文件的所有权限
-v                         在处理文件时显示文件名
-z                         将输出传给 gzip 命令进行压缩
-Z                         将输出传给 compress 命令进行压缩

创建了一个名为 test.tar 的归档文件,包含目录 test 和 test2 的内容

tar -cvf test.tar test/ test2/

该命令列出了(但不提取)tar 文件 test.tar 的内容。

tar -tf test.tar

该命令从 tar 文件 test.tar 中提取内容。如果创建的时候 tar 文件含有目录结构,则在当前目
录中重建该目录的整个结构。

tar -xvf test.tar

tar 命令可以轻松地为整个目录结构创建归档文件。这是在 Linux 中分发开源程序源代码文件所采用的普遍方法。

.tgz

提示 在下载开源软件时经常会看到文件名以.tgz 结尾,这是经 gzip 压缩过的 tar 文件,可以用
命令 tar -zxvf filename.tgz 来提取其中的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值