系统初级安装和常用命令

第一章 系统初级安装和常用命令
1.1 Linux文件系统和目录结构
1.1.1 Linux文件系统
Linux支持多种的文件系统种类,除了linux通常使用的ext系列,也可以支持windows下的vfat和ntfs格式,当然包括类似nfs、xfs等各种网络存储格式。这里我们首先介绍一下CentOS系统通常会用到的ext,ext2,ext3,ext4,swap格式。

一 ext
ext是第一个专门为Linux的文件系统类型,叫做扩展文件系统。它在 1992 年 4 月 完成的。它为Linux的发展取得了重要作用。但是在性能和兼容性上存在许多缺陷。现在已经很少使用了。

二 ext2
ext2是为解决ext文件系统的缺陷而设计的可扩展的高性能的文件系统。ext2是Linux 文件系统类型中使用最多的格式。并且在速度和CPU利用率上较突出,是 GNU/Linux系统中标准的文件系统,其特点为存取文件的性能极好。
Ext2 可以支持 256 字节的长文件名,其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的Intel x86兼容处理器的系统中,簇最大为 4KB, 则单一文件大小上限为2048GB,而文件系统的容量上限为 6384GB。
ext2的缺点:ext2的设计者主要考虑的是文件系统性能方面的问题。ext2在写入文件内容的同时并没有同时写入文件的meta-data (和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的 meta-data。这样若出现写入文件内容之后,在写入文件的meta-data之前系统突然断电,就可能造成在文件系统就会处于不一致的状态。在一个有大量文件操作的系统中出现这种情况会导致很严重的后果。

三 ext3
ext3是由开放资源社区开发的日志文件系统。ext3 被设计成是ext2的升级版本,尽可能地方便用户从ext2fs向ext3fs迁移。ext3在ext2的基础上加入了记录元数据的日志功能, 努力保持向前和向后的兼容性。Ext3目前所支持最大16TB文件系统和最大 2TB文件(x86_64机器,32位机器和ext2一样,ext2时代还没有出现64位机器)。
ext3 是一种日志式文件系统。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。如果在文件系统尚未卸下前就关机(如停电)时,下次重开机后会造成文件系统的资料不一致,故这时必须做文件系统的重整工作,将不一致与错误的地方修复。然而,重整的工作是相当耗时的,特别是容量大的文件系统,而且也不能百分之百保证所有的资料都不会流失。
ext3的缺点:其最大的缺点是没有现代文件系统所具有的能提高文件数据处理速度和解压的高性能。

四 ext4
Ext4是一种针对ext3系统的扩展日志式文件系统,是专门为 Linux 开发的原始的扩展文件系统(ext 或 extfs)的第四版。 Linux kernel 自2.6.28开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能。相对于Ext3,特点如下:
  1. 与Ext3兼容。执行若干条命令,就能从Ext3在线迁移到Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。
  2. 更大的文件系统和更大的文件。Ext4 分别支持 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的文件系统,以及 16TB 的文件。
  3. 无限数量的子目录。 Ext3 目前只支持 32,000个子目录,而Ext4支持无限数量的子目录。
  4. Extents。 Ext3 采用间接块映射,当操作大文件时,效率极其低下。比如一个 100MB 大小的文件,在Ext3中要建立25,600个数据块(每个数据块大小为 4KB)的映射表。而 Ext4 引入了现代文件系统中流行的extents概念,每个extent为一组连续的数据块,上述文件则表示为“该文件数据保存在接下来的 25,600个数据块中”,提高了不少效率。
  5. 多块分配。当写入数据到 Ext3 文件系统中时,Ext3的数据块分配器每次只能分配一个 4KB 的块,写一个100MB文件就要调用25,600次数据块分配器,而Ext4的多块分配器“multiblock allocator”(mballoc)支持一次调用分配多个数据块。
  6. 延迟分配。Ext3 的数据块分配策略是尽快分配,而 Ext4 和其它现代文件操作系统的策略是尽可能地延迟分配,直到文件在 cache 中写完才开始分配数据块并写入磁盘,这样就能优化整个文件的数据块分配,与前两种特性搭配起来可以显著提升性能。
  7. 快速 fsck。 以前执行 fsck 第一步就会很慢,因为它要检查所有的 inode,现在 Ext4 给每个组的 inode 表中都添加了一份未使用 inode 的列表,今后 fsck Ext4 文件系统就可以跳过它们而只去检查那些在用的 inode 了。
  8. 日志校验。 日志是最常用的部分,也极易导致磁盘硬件故障,而从损坏的日志中恢复数据会导致更多的数据损坏。Ext4 的日志校验功能可以很方便地判断日志数据是否损坏,而且它将 Ext3 的两阶段日志机制合并成一个阶段,在增加安全性的同时提高了性能。
  9. “无日志”(No Journaling)模式。 日志总归有一些开销,Ext4 允许关闭日志,以便某些有特殊需求的用户可以借此提升性能。
  10. 在线碎片整理。 尽管延迟分配、多块分配和 extents 能有效减少文件系统碎片,但碎片还是不可避免会产生。Ext4 支持在线碎片整理,并将提供 e4defrag 工具进行个别文件或整个文件系统的碎片整理。
  11. inode 相关特性。 Ext4 支持更大的 inode,较之 Ext3 默认的 inode 大小 128 字节,Ext4 为了在 inode 中容纳更多的扩展属性(如纳秒时间戳或 inode 版本),默认 inode 大小为 256 字节。Ext4 还支持快速扩展属性(fast extended attributes)和 inode 保留(inodes reservation)。
  12. 持久预分配(Persistent preallocation)。 P2P 软件为了保证下载文件有足够的空间存放,常常会预先创建一个与所下载文件大小相同的空文件,以免未来的数小时或数天之内磁盘空间不足导致下载失败。 Ext4 在文件系统层面实现了持久预分配并提供相应的 API(libc 中的 posix_fallocate()),比应用软件自己实现更有效率。
  13. 默认启用 barrier。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 “mount -o barrier=0” 命令禁用该特性。)

五XFS
Ext4 作为传统的文件系统确实非常成熟稳定,但是随着存储需求的越来越大,Ext4 渐渐适应不了了。比如说现在虽然Ext4 目录索引采用了Hash Index Tree, 但是依然限制高度为2.
Ext4的单个目录文件超过200W个,性能下降的就比较厉害了。由于历史磁盘结构原因Ext4 的inode 个数限制(32位数)最多只能有大概40多亿文件。而且Ext4的单个文件大小最大只能支持到16T(4K block size) 的话,这些至少对于目前来说已经是瓶颈了…而XFS使用64位管理空间,文件系统规模可以达到EB级别,可以说未来几年XFS彻底取代Ext4是早晚的事情!

六 swap
Swap分区:swap分区是linux特有的,在硬盘上单独划分出来一块空间用来存放内存和硬盘之间的交换数据,以提高机器的效率。相当于windows的虚拟内存,但是效率要比虚拟内存好得多。Swap分区可以不设立,但是建议划分。在内存小于2G时,swap分区建议使用两倍内存大小;内存大于2G,小于4G,swap分区建议使用内存大小;内存大于4G,swap分区建议使用内存一半大小。但是不同的应用有不同的需求,可以根据使用情况逐步添加或者减小swap分区。
1.1.2 linux目录结构
/

bin boot dev etc home lib media mnt opt proc root sbin tmp usr var

目录 描述
/ 根目录
/bin 做为基础系统所需要的最基础的命令就是放在这里。比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。
/boot Linux的内核及引导系统程序所需要的文件,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录;启动装载文件存放位置,如kernels,initrd,grub。一般是一个独立的分区。
/dev 一些必要的设备,声卡、磁盘等。还有如 /dev/null. /dev/console /dev/zero /dev/full 等。
/etc 系统的配置文件存放地. 一些服务器的配置文件也在这里;比如用户帐号及密码配置文件;
/etc/opt:/opt对应的配置文件
/etc/X11:Xwindows系统配置文件
/etc/xml:XML配置文件
……
/home 用户工作目录,和个人配置文件,如个人环境变量等,所有的账号分配一个工作目录。一般是一个独立的分区。
/lib 库文件存放地。bin和sbin需要的库文件。类似windows的DLL。
/media 可拆卸的媒介挂载点,如CD-ROMs、移动硬盘、U盘,系统默认会挂载到这里来。
/mnt 临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom 等目录。可以参看/etc/fstab的定义。
/opt 可选的应用程序包。
/proc 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统,它的定义可以参见 /etc/fstab 。
/root Root用户的工作目录
/sbin 和bin类似,是一些可执行文件,不过不是所有用户都需要的,一般是系统管理所需要使用得到的。
/tmp 系统的临时文件,一般系统重启不会被保存。
/usr 包含了系统用户工具和程序。
/usr/bin:非必须的普通用户可执行命令
/usr/include:标准头文件
/usr/lib:/usr/bin/ 和 /usr/sbin/的库文件
/usr/sbin:非必须的可执行文件
/usr/src:内核源码
/usr/local:用户编译安装的软件的默认路径
/srv 该目录存放一些服务启动之后需要提取的数据
1.1.3 磁盘分区、文件系统和目录的关系
以红色代表swap文件系统、以蓝色单表ext2文件系统、以绿色代表ext3文件系统。
以下为两块磁盘,在使用之前划分为不同的分区(分区大小不同),每个分区格式化为不同的文件系统。

                         图3.1

最后将这八块分区分别挂载到不同的目录下。箭头表示挂载。

                         图3.2

如图3.2所示,当硬盘挂载到某个目录上时,该目录及其下的子目录都使用该分区,除非旗下的子目录挂载了别的分区。换句话说,每个目录都使用挂载在自身的分区,如果没有分区挂载在自身,就使用上级目录所使用的分区。
根据linux分区和目录结构的联系特点,需要在安装初期规划好分配情况,才能保证数据安全和性能。这部分在附录中有详细介绍。
1.2 系统初级安装
过程见附件一。
1.3 常用命令(一)
人和系统交互的指令集合,构成了shell。Shell面向于用户,内嵌于操作系统,用户通过shell命令指挥操作系统,进而利用硬件资源完成一系列任务。
Shell分为很多种类,常见的有csh、ksh和bash。
CentOS默认使用bash。
所谓的常用命令,其实就是bash中使用率较高的一组命令。
1.3.1 显示文件目录列表命令 ls
格式:ls [-option]
参数:
-l长列表,相当于详细列表
-a列出所有文件,包括隐藏文件
-t按照修改时间排列
–full-time 显示全时间格式
-r 倒序
-s 显示文件及文件夹大小
-h 以人类能够理解的方式显示

1.3.1.1 ls –alh和ls –lh 详解:
[root@localhost opt]# ls -alh
total 12M
drwxr-xr-x 4 root root 4.0K Aug 3 07:16 .
drwxr-xr-x 24 root root 4.0K Aug 8 15:17 …
drwxr-xr-x 10 10292 wheel 4.0K Aug 3 04:29 bind-9.8.0-P4
-rw-r–r-- 1 root root 7.4M Jul 15 2011 bind-9.8.0-P4.tar.gz
drwxr-xr-x 3 root root 4.0K Aug 3 05:15 bind_conf
-rw-r–r-- 1 root root 2.8M Aug 3 06:54 postfix-2.3.3-2.1.el5_2.src.rpm
-rw-r–r-- 1 root root 30K Aug 3 07:14 postfix-2.3.3-vda.patch
-rw-r–r-- 1 root root 1.6M Jan 26 2012 postfixadmin-2.3.5.tar.gz
[root@localhost opt]# ls -lh
total 12M
drwxr-xr-x 10 10292 wheel 4.0K Aug 3 04:29 bind-9.8.0-P4
-rw-r–r-- 1 root root 7.4M Jul 15 2011 bind-9.8.0-P4.tar.gz
drwxr-xr-x 3 root root 4.0K Aug 3 05:15 bind_conf
-rw-r–r-- 1 root root 2.8M Aug 3 06:54 postfix-2.3.3-2.1.el5_2.src.rpm
-rw-r–r-- 1 root root 30K Aug 3 07:14 postfix-2.3.3-vda.patch
-rw-r–r-- 1 root root 1.6M Jan 26 2012 postfixadmin-2.3.5.tar.gz
一、第1行:总计(total)
Total后面的数字是指当前目录下所有文件所占用的空间总和。使用ls –lh可查看,也可使用ls –alh查看

二、第1字段: 文件属性字段
-rw-r–r-- 1 root root 7.4M Jul 15 2011 bind-9.8.0-P4.tar.gz
drwxr-xr-x 3 root root 4.0K Aug 3 05:15 bind_conf
文件属性字段总共有10个字母组成;第一个字符表示文件类型。
-表示该文件是一个普通文件
d表示该文件是一个目录,字母"d",是dirtectory(目录)的缩写。
注意:目录是特殊文件,这个特殊文件存放其他文件或目录的相关信息。
l表示该文件是一个软链接文件。字母"l"是link(链接)的缩写,类似于windows下的快捷方式。
b的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)。
c表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节。
p表示该文件为命令管道文件。与shell编程有关的文件。
s表示该文件为sock文件。与shell编程有关的文件。
链接文件分为硬链接或符号链接两种。这里只做简单介绍,具体特性和使用在之后章节中介绍。
硬链接:多个指向同一文件(硬链接不可以对目录)。硬链接文件大小完全相同,如有多个硬链接,所链接的文件只是一个文件大小。
符号链接(软链接):建立一个独立的文件,这个文件会让数据的读取指向它链接的文件内容。类似windows快捷方式。
第1字段后9个字母表示该文件或目录的权限位。
r表是读 (Read) 、w表示写 (Write) 、x表示执行 (eXecute),如果是-,表明没有该权限。
除了rwx三种标示,还有s标示,称为SUID和GUID,这属于权限的高级应用,在后续章节中介绍。例如:rwsrwxrwx或者 rwsrwsrwx。
9个字母中,前三个表示文件拥有者的权限,中间三个表示文件所属组拥有的权限,最后三个表示其他用户拥有的权限。
以-rw-r–r-- 1 root root 7.4M Jul 15 2011 bind-9.8.0-P4.tar.gz 为例。该文件为普通文件,前三个rw-表示该文件对于其所有者,是可读、可写、不可执行;中间三个r—标示该用户所在组队该文件有可读权限;最后三个标示其他用户有可读权限。
详细的权限管理方法和意义在后续章节中介绍。

三、第2字段:分若干种情况
普通文件:文件硬链接数
-rw-r–r-- 1 root root 0 Aug 8 16:57 link.txt
第2字段的值为1,说明文件exit只有exit这一个文件名。即只有一个指向该链接的硬链接。
如果使用ln,做一个指向该文件的硬链接再查看该文件,该文件的第2字段就会变成2。
-rw-r–r-- 2 root root 0 Aug 8 16:25 hlink.txt
-rw-r–r-- 2 root root 0 Aug 8 16:25 link.txt
此时link.txt和hlink.txt称为互为硬链接。同指向一个文件,无论是修改哪一个文件,另一个里也做相应的变化,即同一文件的不同文件名。
互为硬链接的文件具有相同的文件节点。
[root@localhost ls_test]# ls -i link.txt hlink.txt
327395 hlink.txt 327395 link.txt
软连接: 链接占用的节点
lrwxrwxrwx 1 root root 8 Aug 8 16:25 slink.txt -> link.txt
该字段文件占用一个节点,属于软链接(符号链接)。
目录:子目录个数
如果是目录,则第2字段表示该目录所含子目录的个数。
新建空目录,此目录的第二字段就是2,表示该目录下有两个子目录。因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"…",此默认子目录是隐藏的。每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加。
[root@localhost ls_test]# ls –l
total 12
drwxr-xr-x 2 root root 4096 Aug 8 16:26 dir1
drwxr-xr-x 3 root root 4096 Aug 8 16:27 dir2
[root@localhost ls_test]# cd dir2/
[root@localhost dir2]# ls -al
total 12
drwxr-xr-x 3 root root 4096 Aug 8 17:05 .
drwxr-xr-x 5 root root 4096 Aug 8 16:29 …
-rw-r–r-- 1 root root 0 Aug 8 17:05 file.txt
drwxr-xr-x 2 root root 4096 Aug 8 16:27 son_dir1
[root@localhost dir2]# cd …/dir1
[root@localhost dir1]# ls -alh
total 8.0K
drwxr-xr-x 2 root root 4.0K Aug 8 16:26 .
drwxr-xr-x 5 root root 4.0K Aug 8 16:29 …
四、第3字段:文件(目录)拥有者
-rw-r–r-- 2 root root 0 Aug 8 16:25 link.txt
该字段表示该文件拥有者是谁。只有文件的拥有者才具有改动文件属性的权利。root具有改动任何文件属性的权利。对于目录,只有拥有该目录的用户,或者具有写权限的用户才有在目录下创建文件的权利。
五、第4字段:文件(目录)拥有者所在的组
-rw-r–r-- 2 root root 0 Aug 8 16:25 link.txt
一个用户可以加入很多个组,但是其中有一个是主组,就是显示在第4字段的名称。
六、第5字段: 文件所占用的空间
[root@localhost ls_test]# ls -l
total 12
drwxr-xr-x 2 root root 4096 Aug 8 16:26 dir1
drwxr-xr-x 3 root root 4096 Aug 8 17:05 dir2
drwxr-xr-x 2 root root 4096 Aug 8 16:49 dir_time
-rw-r–r-- 2 root root 0 Aug 8 16:25 hlink.txt
-rw-r–r-- 2 root root 0 Aug 8 16:25 link.txt
第5字段表示文件大小,如果是目录,表示该目录大小。注意是目录本身大小,而非目录及其下面的文件的总大小。因为目录也是文件,所以目录本身也占空间;由于目录要记录一系列内容,所以空目录的初始大小也为4096字节。如果一个目录下的文件及其多,目录大小会超过4096字节。
七、第6字段:文件(目录)最近访问(修改)时间
drwxr-xr-x 3 root root 4096 Aug 8 17:05 dir2
ls 默认查看文件的修改(modify)时间。
Linux系统的文件和目录的时间属性有三种,访问时间(access)、修改时间(modify)和改变属性时间(change)。在ls中分别对应-u、默认、-c。
Access:只看不写的操作,比如cat,head,tail,more,vi的不保存退出;
Modify:写入操作,比如vi修改内容,重定向到文件;
Change:修改文件属性,比如chown,chmod,chgrp。
八、第7字段:文件名
-rw-r–r-- 2 root root 0 Aug 8 16:25 link.txt
lrwxrwxrwx 1 root root 8 Aug 8 16:25 slink.txt -> link.txt
如果是符号链接,会有"->"符号,跟着它指向的文件名
1.3.1.2 ls –t –full-time参数
ls –t 参数直接使用没有实际意义。
[root@localhost dir_time]# ls ;ls -t
a1.txt a2.txt a3.txt
a3.txt a2.txt a1.txt
只有加了-l参数后,才有实际意义。尤其是对于大批量的文件的显示。
[root@localhost dir_time]# ls -lt
total 0
-rw-r–r-- 1 root root 0 Aug 8 13:59 a59
-rw-r–r-- 1 root root 0 Aug 8 13:58 a58
-rw-r–r-- 1 root root 0 Aug 8 13:57 a57
-rw-r–r-- 1 root root 0 Aug 8 13:56 a56
……
也可以配合-r参数来反转时间排序。
[root@localhost dir_time]# ls -ltr
total 0
-rw-r–r-- 1 root root 0 Aug 8 09:00 a1.txt
-rw-r–r-- 1 root root 0 Aug 8 10:00 a2.txt
-rw-r–r-- 1 root root 0 Aug 8 11:00 a3.txt
-rw-r–r-- 1 root root 0 Aug 8 12:00 a0.txt
-rw-r–r-- 1 root root 0 Aug 8 13:10 a10
-rw-r–r-- 1 root root 0 Aug 8 13:11 a11
……
时间显示默认是不完整的,如果是本年度的,就会显示月份、日期和时间,如果是往年的,就会显示月份、日期和年份。这样是满足不了特定需求的。
[root@localhost dir_time]# ls -l
total 0
-rw-r–r-- 1 root root 0 Aug 8 12:00 a0.txt
-rw-r–r-- 1 root root 0 Sep 9 1998 a10
……
如果加上时间参数,就可以完整的进行对比。
[root@localhost dir_time]# ls -l --full-time
total 0
-rw-r–r-- 1 root root 0 2012-08-08 12:00:00.000000000 +0800 a0.txt
-rw-r–r-- 1 root root 0 1998-09-09 18:45:00.000000000 +0800 a10
……
1.3.1.3 ls –s参数
ls -s 命令用处不大,下面主要用来解释h参数。
[root@localhost dir_size]# ls -s
total 7380
48 b1.txt 4 b2.txt 580 b3.txt 6740 b4.txt 4 c1 4 c2
这里显示的是每个文件或者文件夹的大小,以KB为单位。
如果和ls –lh配合在一起,就是看起来比较舒服的显示。-h参数在linux很多命令里面,都是以“人类能够读懂”的方式显示的意思,主要针对磁盘大小。
[root@localhost dir_size]# ls -lsh
total 7.3M
48K -rw-r–r-- 1 root root 48K Aug 8 17:59 b1.txt
4.0K -rw-r–r-- 1 root root 3.9K Aug 8 17:59 b2.txt
580K -rw-r–r-- 1 root root 576K Aug 8 18:05 b3.txt
6.6M -rw-r–r-- 1 root root 6.6M Aug 8 18:03 b4.txt
4.0K drwxr-xr-x 2 root root 4.0K Aug 8 18:05 c1
4.0K drwxr-xr-x 2 root root 4.0K Aug 8 18:05 c2
1.3.2 切换目录路径命令 cd
格式:
cd directory
使用cd命令在目录层次间移动。
1.3.2.1 显示当前所在目录 pwd
在使用cd命令前,往往希望知道自己在什么位置。比如,当前已经在/home/training/cd_test/dir11/ 这个目录下,那前往/home/trainng/cd_test/dir12/dir21/ 这个目录用相对路径就很方便;另一种情况,当前在/root/下,还是同一个目标,那当然还是绝对路径来的快一些。
显示当前路径的命令为:
pwd
这个命令可以忘记它的参数,虽然有参数,但确实不常用。
[root@localhost dir21]# pwd
/home/training/cd_test/dir11/dir21
注意:rm mv chmod chown这些命令在对通配符“*”操作时,一定要pwd确认一下路径。
1.3.2.2 cd的使用
绝对路径用法:
绝对路径的“绝对”,指的是“/”目录,即从“/”目录开始书写cd的参数。比如要进入/home/training/cd_test目录,无论在什么目录下,只要如下操作即可。
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd /home/training/cd_test/
[root@localhost cd_test]# pwd
/home/training/cd_test
相对路径用法:
相对路径的“相对”,指的是当前目录。即:从当前目录跳转到目标目录。
从当前目录到上一级目录,cd …
[root@localhost dir21]# pwd
/home/training/cd_test/dir11/dir21
[root@localhost dir21]# cd …
[root@localhost dir11]# pwd
/home/training/cd_test/dir11

从当前目录到上n级目录,cd …/…/………
[root@localhost dir21]# pwd
/home/training/cd_test/dir11/dir21
[root@localhost dir21]# cd …/…/…/…/
[root@localhost home]# pwd
/home

从当前目录到下一级目录,需要先ls查看,或者使用“tab”键。
[root@localhost cd_test]# ls
dir11 dir12 dir13 file11 file12 ldir11
[root@localhost cd_test]# cd dir11/
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
注意:”tab”键是bash shell的补全键、自动填充键,在任何涉及路径和文件名的地方都可以使用“tab”键。单击“tab”键为补全,在单击未能补全目录名称(没有列出到/结束),或者文件名称(显示出完整的文件名,并且空一格)的时候,双击“tab”键可以列出分支选择(前半部路径或名称相同、后半部不同的情况)。一定要多多尝试。

从当前目录到上一级目录后,进入某个下级目录,一般需要使用“tab”键。
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
[root@localhost dir11]# cd …(输入到这里,按一下tab键,自动填充/)
[root@localhost dir11]# cd …/(填充/以后,双击tab,显示上一级目录下的所有文件和目录)
[root@localhost dir11]# cd …/
dir11/ dir12/ dir13/ file11 file12 ldir11/(然后在命令行中输入需要的名称,当然仍然可以使用tab键)
[root@localhost dir11]# cd …/dir11/
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
注意:”/”和”//”效果是一样的。有时候不小心多敲了一个“/”没有关系。比如:
[root@localhost dir21]# pwd
/home/training/cd_test/dir11/dir21
[root@localhost dir21]# cd …//…
[root@localhost cd_test]# pwd
/home/training/cd_test
注意:在cd命令中,末尾的”/”可有可无。一般按“tab”键会把末尾的”/”补全。

特殊用法:
~代表家目录、空参数代表家目录
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
[root@localhost dir11]# cd ~
[root@localhost ~]# pwd
/root

[root@localhost dir11]# pwd
/home/training/cd_test/dir11
[root@localhost dir11]# cd
[root@localhost ~]# pwd
/root

cd – 表示回到上一次停留的目录。比如之前在/home/training/cd_test/dir11/dir21,然后进入/tmp,现在想回到/home/training/cd_test/dir11/dir21,只需要cd –即可
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
[root@localhost dir11]# cd /tmp
[root@localhost tmp]# pwd
/tmp
[root@localhost tmp]# cd -
/home/training/cd_test/dir11
[root@localhost dir11]# pwd
/home/training/cd_test/dir11
1.3.3 mkdir 创建目录命令
格式:
mkdir [-option] directory
-p 如果父目录不存在,不报错,直接建立父目录。
在当前目录下直接建立子目录。
[root@localhost dir21]# pwd
/home/training/cd_test/dir11/dir21
[root@localhost dir21]# mkdir dir31
[root@localhost dir21]# ls
dir31

在当前目录下建立两级目录。如果不加-p参数,将会报错。
[root@localhost dir21]# mkdir dir32/dir41
mkdir: cannot create directory `dir32/dir41’: No such file or directory
[root@localhost dir21]# mkdir -p dir32/dir41
[root@localhost dir21]# ls
dir31 dir32
[root@localhost dir21]# cd dir32
[root@localhost dir32]# ls
dir41

以绝对路径建立文件夹。
[root@localhost cd_test]# pwd
/home/training/cd_test
[root@localhost cd_test]# mkdir /home/training/cd_test/dir14
[root@localhost cd_test]# ls
dir11 dir12 dir13 dir14 file11 file12 ldir11
1.3.4 cp 拷贝文件命令
格式:cp [-option] source destination
-i 交互模式
-r 递归拷贝
-p 保持文件读写属性、拥有者属性
-u 增量拷贝

1.3.4.1 危险命令 cp
cp命令在执行的时候有一定的风险。如果目标目录中和源目录中有同名的文件存在,而在执行前没有确认的话,目标目录的文件会被覆盖,从而丢失。
[root@localhost cp_test]# ls
dir1 dir2
[root@localhost cp_test]# cat dir1/a.txt
[root@localhost cp_test]# cat dir2/a.txt
aa
[root@localhost cp_test]# /bin/cp dir1/a.txt dir2/
[root@localhost cp_test]# cat dir1/a.txt
[root@localhost cp_test]# cat dir2/a.txt
可以看到,文件已经为空,被覆盖了。
鉴于此,Redhat各个发行版本在cp命令上做了小小的手脚。使用alias,使”/bin/cp -i”命令代替”/bin/cp”命令。所以在系统中执行cp命令,实际上默认带有-i参数。
[root@localhost cp_test]# cp dir1/a.txt dir2/
cp: overwrite `dir2/a.txt’? no
1.3.4.2 cp及cp -r 命令使用
Cp过程中,绝对路径和相对论路径要灵活运用。使用方法和ls中一样,要善用”tab”键。
拷贝一个文件:
[root@localhost cp_test]# ls
dir1 dir2
[root@localhost cp_test]# ls dir1 dir2
dir1:
a.txt

dir2:
a.txt
[root@localhost cp_test]# cp dir1/a.txt dir2/
[root@localhost cp_test]# ls dir2
a.txt
注意:cp dir1/a.txt dir2/结尾处的”/”是好习惯,虽然结尾处有没有”/”都不影响结果,但是在实际操作中,有这个”/”,尤其是tab键自动填充的,可以让人更加确认此次cp的准确性。

拷贝并改名:
[root@localhost cp_test]# ls *
dir1:
a.txt

dir2:
a.txt
[root@localhost cp_test]# cp dir1/a.txt dir2/b.txt
[root@localhost cp_test]# ls *
dir1:
a.txt

dir2:
a.txt b.txt

拷贝文件夹:

拷贝和拷贝改名的方法与文件类似,只是需要递归参数。
[root@localhost cp_test]# ls
dir1 dir2
[root@localhost cp_test]# cp dir2 dir3
cp: omitting directory `dir2’
[root@localhost cp_test]# cp -r dir2 dir3
[root@localhost cp_test]# ls
dir1 dir2 dir3
[root@localhost cp_test]# ls *
dir1:
a.txt

dir2:
a.txt b.txt

dir3:
a.txt b.txt
可以看到,copy目录的话,目录下内容也会被拷贝。

保持属性拷贝
目录和目录下面的文件总有自己的属性,有的时候拷贝并不希望这些属性改变。尤其是在大量文件的情况下,文件属性改变后通过命令修正是无法完成的任务。
[root@localhost cp_test]# ls -al dir1/
total 8
drwxr-xr-x 2 postfix postfix 4096 Aug 9 17:20 .
drwxr-xr-x 3 root root 4096 Aug 9 20:58 …
-rwx------ 1 postfix postfix 0 Aug 9 17:20 a.txt
如上目录属于postfix用户、文件也属于postfix用户,只有postfix用户具有可读、可写、可执行权限。
[root@localhost cp_test]# cp -r dir1 dir2
[root@localhost cp_test]# ls -al dir2
total 8
drwxr-xr-x 2 root root 4096 Aug 9 21:08 .
drwxr-xr-x 4 root root 4096 Aug 9 21:08 …
-rwx------ 1 root root 0 Aug 9 21:08 a.txt
[root@localhost cp_test]# cp -rp dir1 dir3
[root@localhost cp_test]# ls -al dir3
total 8
drwxr-xr-x 2 postfix postfix 4096 Aug 9 17:20 .
drwxr-xr-x 5 root root 4096 Aug 9 21:09 …
-rwx------ 1 postfix postfix 0 Aug 9 17:20 a.txt

注意:执行-p参数的时候,要有足够的权限。
[zhangzhe@localhost tmp]$ cp -rp dir1/ dir2/
[zhangzhe@localhost tmp]$ ll
total 8
drwxr-xr-x 2 vmta vmta 4096 Aug 9 21:22 dir1
drwxr-xr-x 2 zhangzhe zhangzhe 4096 Aug 9 21:22 dir2
可以看到,zhangzhe用户并没有比vmta用户高一级的权力,所以无法保持文件夹的所有者属性。一般cp -p操作是root用户来操作。

cp -u 参数
新建一个目录,并在这个目录中新建三个空文件,将这个目录拷贝一份,如下面所示。
[root@localhost cp_test]# ls -al *
dir1:
total 8
drwxr-xr-x 2 root root 4096 Aug 9 21:34 .
drwxr-xr-x 4 root root 4096 Aug 9 21:34 …
-rw-r–r-- 1 root root 0 Aug 9 21:34 a
-rw-r–r-- 1 root root 0 Aug 9 21:34 b
-rw-r–r-- 1 root root 0 Aug 9 21:34 c

dir2:
total 8
drwxr-xr-x 2 root root 4096 Aug 9 21:34 .
drwxr-xr-x 4 root root 4096 Aug 9 21:34 …
-rw-r–r-- 1 root root 0 Aug 9 21:34 a
-rw-r–r-- 1 root root 0 Aug 9 21:34 b
-rw-r–r-- 1 root root 0 Aug 9 21:34 c

首先执行不带-u参数的cp命令:
[root@localhost cp_test]# cp dir1/* dir2/
cp: overwrite dir2/a'? yes cp: overwritedir2/b’? yes
cp: overwrite `dir2/c’? yes
可以看到提示三次是否覆盖。即:文件即使相同,也会执行覆盖操作。这在大量文件重复的情况下会耗费机器资源。

执行带-u参数的cp命令:
[root@localhost cp_test]# echo “c” > dir1/c
[root@localhost cp_test]# cp -u dir1/* dir2/
cp: overwrite `dir2/c’? yes
首先在c文件中添加一些内容,使c文件有变化,然后执行cp –u命令,可以看到:只有c文件被覆盖,其它两个文件由于内容一致,没有执行覆盖操作。

考虑,如果dir2中的文件被修改,然后仍然执行该命令会如何?
[root@localhost cp_test]# echo “a” >dir2/a
[root@localhost cp_test]# cp -u dir1/* dir2/
[root@localhost cp_test]#
可以看到,无任何反应,因为-u参数意味着update,只有源文件比目标文件新,才会覆盖目标文件。

注意:考虑在同一目录下,连续两次执行cp file1 file2;和连续两次执行cp dir1 dir2有什么区别?这个是shell的特性,无论是在cp、mv还是在scp、rsync等有复制、挪动操作的命令中,如果Destination,也就是后一个参数并不存在,那么认为把source拷贝或者改名到destination;如果destination存在并且是一个文件,那么source也必须是文件,并且destination会被source覆盖;如果destination存在并且是一个目录,那么source可以是文件也可以是目录,但是destination不会被source覆盖,只会出现source被拷贝到destination目录下的情况。
1.3.5 通配符
通配符不是命令,只是用来匹配文件名和目录的。通配符在ls、cp、mv、scp、rsync、chown、chmod等命令中都有强大的作用。
通配符的作用可以用一句话来形容:没有做不到,只有想不到。灵活的运用通配符,可以使很多工作立刻简单。
1.3.5.1 强大的“
”在通配符中是最常用的一种,代表0个、一个或多个字符。在使用中有三种情况,表示三种不同的含义。
单独的“
这里指的是只有“
”出现的情况,默认为单独的一个,当然连续敲两个以上的“”效果是一样的。具体点儿说就是“”没有和其它字符联合起来(表示目录的“/”除外)。这种情况,通配的是该目录下的所有非隐藏内容,包括非隐藏的目录和非隐藏的文件。
看以下三条命令产生的效果:
温习一下ls命令,ls命令在没有跟目录或者文件的时候,默认的操作就是“ls .”,即对当前目录做list命令。
当操作ls *的时候,相当于ls当前目录下的所有内容,ls会自动的先列出文件,然后按照顺序显示每个目录下的内容。
可以看到,ls *和ls dir1 dir2 file1 file2效果是一样的。
[root@localhost test]# ls
dir1 dir2 file1 file2
[root@localhost test]# ls *
file1 file2

dir1:
file3

dir2:
file4
[root@localhost test]# ls dir1 dir2 file1 file2
file1 file2

dir1:
file3

dir2:
file4

”单独出现时,最常用的不是在ls上,而是在cp、mv、rsync、rm一类的命令中。比如把dir1目录下的所有内容拷贝到dir2下,dir2下已经有内容存在。这个时候cp dir1 dir2是行不通的,删掉dir2后再执行这个命令会丢失dir2下的东西,如果dir1下内容比较多,就只能使用cp dir1/ dir2/ 这样的命令。
注意:“*”单独出现匹配目录下所有内容的用途十分广泛,用起来也很方便。但是这是个危险操作,操作时一定要“pwd”确认当前目录,或者使用绝对路径,再或者使用至少一级的可以确定目录路径的相对路径(比如rm –rf training/*就很安全,因为知道training是自己建立的;但是rm –rf conf/*就很危险,系统中有很多conf目录)。
rm –rf *;mv *;chmod *;chown *这些命令,如果执行路径不对,而且执行者是root,那么都可以造成系统崩溃。这四个命令都曾让笔者焦头烂额。

“.”的使用
单独的“
”表示该目录下所有内容,“.”表示的是该目录下所有的隐藏文件和目录以及”.”,”…”。可以尝试执行 ls ~/.

各种字符和“”配合使用
一旦出现“
”和字符在一起的情况,“”就代表这匹配0个、一个和多个任意字符的意思,字符和“”在一起代表0个、一个或者多个文件或目录。
比如,在一个日志目录中,目录类型有access和error两种,所有日志都以日期-时间命名,形如:
access.20120804-6.log access.20120805-19.log error.20120804-0.log error.20120804-22.log error.20120805-13.log
现在列出2012年8月4日的access日志
[root@localhost date_dir]# ls -al access.20120804log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-0.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-10.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-11.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-12.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-13.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-14.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-15.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-16.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-17.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-18.log
-rw-r–r-- 1 root root 0 Aug 9 23:16 access.20120804-19.log
……
也可以拷贝所有2012年的日志“cp 2012 /destination”;
或者把所有年份月份14日当天的日志列出。这个就稍微复杂,需要分析文件名称,由于小时的位置也会出现14,所以这里的通配不能简单地使用“14”,会列出来类似于access.20120815-14.log这样的日志。应该使用这样的匹配方法“14-”,以避免日期和小时上的混淆,这里使用了日期后面带有“-”的特点。
1.3.5.2神奇的“[ ]”
”通配不是在所有的时候都好用的,比如需要8月4日10-16点的日志,如果用“*”来通配,总会少一些或者多一些文件,这个时候就用到“[ ]”。
匹配特定的多个字符
[acm]表示匹配“a”、“c”、“m”中的任意一个,也可以写做[a,c,m],比如,挑出以字母a,c,m开头的文件:
[root@localhost letter_dir]# ls
a.txt c.txt e.txt g.txt i.txt k.txt m.txt o.txt q.txt s.txt u.txt w.txt y.txt
b.txt d.txt f.txt h.txt j.txt l.txt n.txt p.txt r.txt t.txt v.txt x.txt z.txt
[root@localhost letter_dir]# ls [a,c,m].txt
a.txt c.txt m.txt
[root@localhost letter_dir]# ls [acm].txt
a.txt c.txt m.txt
[035]表示匹配“0”、“3”、“5”中的任意一个,也可以写作[0,3,5],比如,挑出0时,3时,5时的日志:
[root@localhost date_dir]# ls -[0,3,5].log
access.20120804-0.log access.20120805-0.log access.20120814-0.log access.20120815-0.log error.20120804-0.log error.20120805-0.log
access.20120804-3.log access.20120805-3.log access.20120814-3.log access.20120815-3.log error.20120804-3.log error.20120805-3.log
access.20120804-5.log access.20120805-5.log access.20120814-5.log access.20120815-5.log error.20120804-5.log error.20120805-5.log
注意:这里[ ]中不能出现双位以上的数字,比如[0,15]。这种情况下shell会认为需要匹配[0,1,5]。
[root@localhost date_dir]# ls access
-[0,15].log
access.20120804-0.log access.20120804-5.log access.20120805-1.log access.20120814-0.log access.20120814-5.log access.20120815-1.log
access.20120804-1.log access.20120805-0.log access.20120805-5.log access.20120814-1.log access.20120815-0.log access.20120815-5.log
如果需要0点和15点的数据,只能分开执行或者使用特殊方法利用正则表达式。

匹配连续数字或字母的用法
连续的数字或者字母,用[2-9]和[a-z]这样的方式表示,其含义是匹配2到9中的任意一个数字和a到z中的任意一个字母。
注意:和上面提到的情况类似,这里“-”两边只能是一个字符,比如0、3、9、a等,不能是10、13这样的双位或者更多位数字。如果写成[10-23],shell会认为需要匹配“1,0-2,3”这四个数字。
像本节开头所描述那样,需要8月4日10-16点的日志:
[root@localhost date_dir]# ls *0804-1[0-6].log
access.20120804-10.log access.20120804-12.log access.20120804-14.log access.20120804-16.log error.20120804-11.log error.20120804-13.log error.20120804-15.log
access.20120804-11.log access.20120804-13.log access.20120804-15.log error.20120804-10.log error.20120804-12.log error.20120804-14.log error.20120804-16.log
1.3.5.3 很少使用的“?”
虽然“?”匹配任意一个字符的功能很强大,但是在实际使用中很少见。举个例子一笔带过:
某个目录中有以数字命名的文件,名字位数不同,找出由两位数字组成的文件:

[root@localhost number_dir]# ls ??
10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 91 94 97
11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77 80 83 86 89 92 95 98
12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99
1.3.6 rm删除命令
格式:
rm [-option] destination
-I 交互参数
-r 递归
-f 强制删除
rm命令也是危险命令,所以linux使用alias使其执行时,默认使用-i参数,这样在删除时总会有询问。
[root@localhost rm_test]# rm file1
rm: remove regular empty file `file1’? no

rm命令默认不允许删除目录,所以如果需要删除目录,则要加上递归参数-r。
[root@localhost rm_test]# rm dir2
rm: cannot remove directory dir2': Is a directory [root@localhost rm_test]# rm -r dir2 rm: remove directorydir2’? yes

删除大量文件时或者目录时,不可能每个文件都敲击yes,所以要使用-f参数,这样可以避免询问。很经典也很危险的用法,rm –rf *。切记使用前确认目录。
[root@localhost rm_test]# pwd
/home/training/rm_test
[root@localhost rm_test]# ls
dir1 file1
[root@localhost rm_test]# rm -rf *
[root@localhost rm_test]# ls
[root@localhost rm_test]#
1.3.7 vi编辑器使用
Vi是Linux中的标准文本编辑器。所有的unix和类unix都会提供vi编辑器。在linux上,使用的是vim(vi improved)
vi 提供两种模式
命令模式:
浏览、删除、剪贴、查找等
可以用各种命令进入插入模式
插入模式
输入文档
用退出插入模式回命令模式
Vi将命令模式和插入模式区分开来,这经常被认为是vi的一个大问题,但往往这也被认为是vi的优势所在。理解其中的区别是掌握vi的关键,vi启动时,开始处于命令模式。在这种模式下,我们可以在文件中到处移动,改变文本的某个特定区域、剪切、复制和粘贴文本。插入模式是指用户可以真正在文件中输入内容。换句话说,命令模式是用来在文件中移动,而插入模式是用来在文件中键入文本。
注意:由于CRT等远程登录工具的广泛使用,人们渐渐忘记了vi的复制和粘贴功能。这在某些情况下是很麻烦的,比如单用户模式下。
Vi命令复杂,请尽量尝试牢记以下红字部分。
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename

移动操作
移动操作命令繁多,熟练使用以下几个就够应付大部分情况
[PgDn]:向下翻一页
[PgUp]:向上翻一页
gg:回到首行
G:到尾行
nG:到第n行
$:到行尾
^:到行首
fx:向右到第一个字符x处,x为任意字符
Fx:向左到第一个字符x处

从命令模式进入插入模式:
i:光标在当前位置进入插入模式
I:光标跳到行首并进入插入模式
a: 光变后退一个并进入插入模式
A:光变推到行尾并进入插入模式
o:在光标所在行下新起一行并进入插入模式
O:在光标所在行上新起一行并进入插入模式
s:删除光标所在字符并进入插入模式
S:删除光标所在行并进入插入模式

在vi中删除
x/:删除一个字符
nx:删除下n个字符
dd:删除当前行
dw:删至词尾(并不是删掉该词,因为光标可能不在单词第一个字符)
ndw:删除后n个次(分割符并不是默认的空格)
d$:删除至行尾
ndd:删除下n行

在vi中剪贴
yy:选定光标所在行复制
nyy:选定光标下n行复制
yw:选定光标所在词复制(可能不是整个词,视光标位置定)
y$:选定光标所在位置导航为的部分复制
p:贴在光标所在位置之右或者之下
P:贴在光标所在位置之左或者之上

取消操作
u:取消上一个更改
U:取消一行内的所有更改
:e!:放弃所有更改,重新编辑(:e!代表先按:进入命令输入行再按e和!)

查找文本
/string:向下查找string
?string:向上超找string
n:继续查找下一个

命令模式的输入选项
:r /path/to/file 把/path/to/file的内容复制到光标处
:r !命令 把命令的结果插入到光标处
:!命令 执行命令,然后返回

退出、保存
:w 保存当前文件
:q 如果上次保存后没有修改,退出文件
:wq 保存退出
:q! 放弃保存退出

1.4 简单本地yum源搭建
见附件。
1.5简单命令(二)
1.5.1 关机命令
格式:
shutdown
-h
-k
shutdown –k now 在所有终端屏幕上显示马上要关机,但是实际上不关机。-k参数不真正关机。
shutdown –h now 在所有终端上显示马上要关机,实际上也立即关机。
shutdown –h 5 在所有终端上显示5分钟后关机,实际上5分钟后关机。

格式:
reboot
立即执行重启操作。
1.5.2 显示文件命令
cat 查看文件内容
格式:
cat filename
-n:显示行号
一次全部显示整个文件,对于大文件不推荐使用。

more 分页显示文件内容
格式:
more filename
分页显示文件内容,空格翻页。More有很强大的功能,但是一般情况,使用这些功能远不如vi舒服。经常在管道符后面使用more,用来分页显示管道传递的数据。

head 显示头部命令
格式:head <-option> filename
head -1 filename 显示第一行
head-2 filename 显示前两行

tail 显示尾部命令
格式:tail <-option> filename
-f 实时显示文件内容
tail -1 filename 显示最后一行
tail -2 filename 显示后两行内容
tail –f filename 实时显示文件最后内容,常用于查看日志(用ctrl+c来终止)
1.5.3 管道命令
管道可以把一组命令按照数据流向的方式进行操作。简单地说,第一个命令执行后,不回显结果,而把结果通过管道传递给第二个命令。第二个命令处理以后传递给第三个……直到没有管道符后才中止命令,并回显最终结果。
比如:ls –alt 按照时间对目录内容排序,但是文件很多,只关心最新的5个文件:
[root@localhost date_dir]# ls -lt |head -6
total 16
-rw-r–r-- 1 root root 0 Aug 9 23:27 access.20120815-0.log
-rw-r–r-- 1 root root 0 Aug 9 23:27 access.20120815-10.log
-rw-r–r-- 1 root root 0 Aug 9 23:27 access.20120815-11.log
-rw-r–r-- 1 root root 0 Aug 9 23:27 access.20120815-12.log
-rw-r–r-- 1 root root 0 Aug 9 23:27 access.20120815-13.log
这里因为ls –lt会显示一行total,所以要查看前6行,才能看到5行数据。
注意:管道命令很强大,可以使用不同的命令组合成强大的指令集合。比如,对文件夹下所有以txt结尾的文件重命名,就需要三个管道符号,四个命令完成。
1.5.4 wc 查看文件行数、字数命令
格式:
wc filename
wc –l filename查看文本文件行数。
wc –w filename查看文本文件字数。
wc –c filename查看文本文件字符数。

注意:实际上wc –l常用语管道传来的数据,用来统计行数。比如统计一下日志目录中access日志有几条。
[root@localhost date_dir]# ls -l access*|wc -l
96
1.5.5 sort排序命令
格式:
sort <-option> filename
参数:
-n 以数字顺序排序
-r 倒序
-u 剔除重复
-k 指定排序的列,默认为第一列
-t 指定列间的分隔符,默认为空格。(不支持复杂分隔符,比如“::”)
以数字顺序排序的意义在于,sort默认的只是考察第一位字符,这样会出现以下情况:
[root@localhost sort_test]# cat test.txt
1 a
3 j
6 j
9 l
10 oi
14 asd
6 j
[root@localhost sort_test]# sort test.txt
10 oi
14 asd
1 a
3 j
6 j
6 j
9 l
可以看到,虽然是正序的,但是10却在1的前面。需要-n参数,-n参数也是最常用的sort参数:
[root@localhost sort_test]# sort -n test.txt
1 a
3 j
6 j
6 j
9 l
10 oi
14 asd
-r参数为倒序,-u参数为剔重:
[root@localhost sort_test]# sort -nru test.txt
14 asd
10 oi
9 l
6 j
3 j
1 a
可以看到整个排序从大到小了,而且6 j只剩下一行了。

-t参数可以指定分隔符,虽然不支持复杂的分隔符,但是可以处理复杂分割符为简单分割符,这个以后课程会讲。而且也可以想办法使复杂分隔符不影响排序。
-k参数指定需要排序的列,经常和-t参数配合。原因在于,如果是对第一列排序,那无所谓什么样的分隔符,都可以正确排序。
[root@localhost sort_test]# cat test2.txt
1::a
3::j
6::j
9::l
10::oi
14::asd
6::j
[root@localhost sort_test]# sort -t ‘:’ -k 2 test2.txt
1::a
14::asd
3::j
6::j
6::j
9::l
10::oi
[root@localhost sort_test]# sort -t ‘:’ -k 3 test2.txt
1::a
14::asd
3::j
6::j
6::j
9::l
10::oi
如上述结果,不难发现,-k 2和-k 3都起到了同样的效果,都对第二列进行了排序。因为以“:”分隔,实际上字母在第三个位置。但是第二个位置都是相同的空字符,排序自然以第三列进行。
在实际使用中,sort也经常接到来自于管道的数据。比如,du计算文件和目录大小的命令(du计算目录和其下文件的总大小),就可以用sort排序。
[root@localhost dir_size]# du -sk *|sort -nr
6740 b4.txt
580 b3.txt
48 b1.txt
4 c2
4 c1
4 b2.txt
1.5.6 grep抓取文件中特定字符命令
格式:
grep <-option> string filename
-E 扩展的grep,支持复杂正则
-F 完全关闭正则
-v 显示不匹配的项
-i 不区分大小写
-o 只显示匹配内容
-r 递归参数

Grep命令可以把注意力集中在想要的结果上,是强大的工具,尤其是开启-E参数以后,利用正则更是可以代替很多shell script、sed、awk的功能。将会是日常工作和以后课程出现率很高的命令。

比如,我们只想看到test.txt文件中有shell那一行。
[root@localhost grep_test]# cat test.txt
linux training
shell study
awk study
sed study
apache training
rpm make
trainer zhangzhe
[root@localhost grep_test]# grep shell test.txt
shell study

注意,grep 和通配符*使用,再配合上-r -i参数,是查找利器。比如我们要在apache的配置文件中查找Listen(监听的端口)。
-r参数在遇到目录的时候会自动的进入目录并查找该目录下的所有文件和目录。
[root@localhost httpd]# pwd
/etc/httpd
[root@localhost httpd]# ls
conf conf.d logs modules run
[root@localhost httpd]# grep -ri Listen *
conf/httpd.conf:# Listen: Allows you to bind Apache to specific IP addresses and/or
conf/httpd.conf:# Change this to Listen on specific IP addresses as shown below to
conf/httpd.conf:#Listen 12.34.56.78:80
conf/httpd.conf:Listen 80
conf.d/proxy_ajp.conf:# Tomcat is configured to listen on port 8009 for AJP requests
Binary file modules/mod_cgid.so matches
Binary file modules/mod_proxy_ftp.so matches
Binary file modules/mod_info.so matches
Binary file modules/libphp5.so matches
Binary file modules/libphp5-zts.so matches
上面的5个目录中全部是配置文件,在不熟悉apache情况下,无从得知Listen参数会在哪个目录的哪个文件中,但是我们递归的查找所有目录,就很容易找到。

-v参数在某些场合特别有用。比如,apache的主配置文件,大量注释信息,确实不需要看,-v在这种时候十分必要。
[root@localhost httpd]# cat /etc/httpd/conf/httpd.conf |wc -l
991
[root@localhost httpd]# cat /etc/httpd/conf/httpd.conf |grep -v “#”|wc -l
317
[root@localhost httpd]# cat /etc/httpd/conf/httpd.conf |grep -v “#”|grep -v "^ * " ∣ w c − l 222 可 以 看 到 , 如 果 不 剔 除 注 释 行 和 空 行 , 阅 读 到 的 内 容 大 部 分 会 是 无 用 的 信 息 。 ” ∗ "|wc -l 222 可以看到,如果不剔除注释行和空行,阅读到的内容大部分会是无用的信息。”^ * "wcl222”是空行的含义,在后面正则中会讲到。

-o参数在shell编程中用途较大,比如在特定的文件中,有一系列特定的字符,想把这个字符传递给某个参数,这时候需要用到-o参数。
[root@localhost grep_test]# cat test.txt
linux training
shell study
awk study
sed study
apache training
rpm make
trainer zhangzhe
[root@localhost grep_test]# cat test.txt |grep training
linux training
apache training
[root@localhost grep_test]# cat test.txt |grep -o training
training
training
[root@localhost grep_test]# cat test.txt |grep -o training|sort -u
training
如上述结果,在test.txt文件中,我想要提出training字符,仅仅grep该字符,会出来两行内容,使用-o参数后,就会将我想要的字符显示出来。然后再处理一下,就可以成为传递给变量的数值。

-E参数也可以写成egrep,这个命令在之后正则课程中专门讲解。

-F参数也可以写成fgrep,完全关闭正则
[root@localhost grep_test]# cat fgrep.txt
aaaaa fffff
sssss fffff
… qqqqq
[root@localhost grep_test]# cat fgrep.txt |fgrep .
… qqqqq
[root@localhost grep_test]# cat fgrep.txt |grep .
aaaaa fffff
sssss fffff
… qqqqq
.在正则中代表任意一个字符,如果没有使用fgrep,grep管道传来的数据,所有行都可以显示,使用fgrep后,仅仅显示有“.”的行。请看下面的效果:
[root@localhost grep_test]# cat fgrep.txt |grep “.”
… qqqqq
经过转义后,“.”不再具有特殊含义。
1.5.7 find查找文件命令
格式:
find /path/to <-option> string
find命令功能强大,参数复杂,这里不具体介绍参数,只是介绍几种固定的用法。

按照文件名查找
[root@localhost training]# find /home/training/ -name “test*”
/home/training/sort_test/test2.txt
/home/training/sort_test/test.txt
/home/training/grep_test/test.txt
/home/training/tongpei/test
路径位置可以写绝对路径、也可以使用相对路径。-name参数可以按照文件或者目录名称查找,名称支持通配。

按照时间查找
[root@localhost training]# find /home/training/ -type f -ctime -1
/home/training/sort_test/test2.txt
/home/training/sort_test/test.txt
/home/training/grep_test/test.txt
/home/training/grep_test/fgrep.txt
查找一天以内修改的文件。-tpye f代表文件,-type d代表目录,-ctime代表修改时间(以天为单位),-1说明是以天以内(计时时间点是当天凌晨,也就是从昨天的凌晨开始计算)。

[root@localhost training]# find /home/training/ -type d -cmin +1440 -name “dir2*”
/home/training/ls_test/dir2
/home/training/cp_test/dir2
/home/training/cd_test/dir11/dir23
/home/training/cd_test/dir11/dir21
/home/training/cd_test/dir11/dir22
/home/training/cd_test/dir12/dir24
/home/training/cd_test/dir12/dir25
/home/training/cd_test/dir12/dir26
/home/training/cd_test/dir13/dir29
/home/training/cd_test/dir13/dir28
/home/training/cd_test/dir13/dir27
/home/training/tongpei/test/dir2
这次试验,-type d为目录,-cmin指修改时间(以分钟为单位),+1440是1440分钟以前的,另外加上-name的限制。

注意:Find功能强大,支持各种类型的查找,上面举例了按名字、按时间,也可以按照大小、按照用户等等,而且都可以组合。要多加练习才可以得心应手。

执行后续操作
find除了可以查找外,还可以执行后续操作,比如删除。这个功能提供了很大的便利,举例说明:日志文件是需要定时删除的,如果保留30天的文件,就删除30天以前的。假使find没有后续操作过程,可能仅仅列出文件仍然让人头疼,数量巨大且目录复杂的文件时无法快速处理的。
[root@localhost training]# find ./ -mtime +30
./ls_test/dir_time/a10
./rm_test/find.txt
[root@localhost training]# find ./ -mtime +30 -exec rm -rf {} ;
[root@localhost training]# find ./ -mtime +30
[root@localhost training]#
其中,-exec参数说明要执行后续操作;rm –rf为操作命令;{}固定用法,表示将前面find的内容传递到此处;“ ;”固定用法,必须有才可以执行。
1.5.8 压缩命令
Tar
Tar压缩命令常用于包含文件夹的压缩,比如整体项目的挪动。
格式:
tar <-options> filename
-f 使用文件输入或者输出
-v 显示压缩过程
-z 加入zip压缩
-x 解压
-c 压缩
注意:-f参数必须有,不然会出现错误

压缩-zcvf
[root@localhost training]# tar -zcvf ls_test.tar.gz ls_test/
ls_test/
ls_test/slink.txt
ls_test/dir_time/
ls_test/dir_time/a54
ls_test/dir_time/a53
ls_test/dir_time/a21
ls_test/dir_time/a45
ls_test/dir_time/a28
……
[root@localhost training]# ll
total 2348
drwxr-xr-x 6 root root 4096 Aug 8 23:58 cd_test
drwxr-xr-x 4 root root 4096 Aug 9 21:34 cp_test
drwxr-xr-x 2 root root 4096 Aug 11 11:20 grep_test
drwxr-xr-x 6 root root 4096 Aug 8 17:57 ls_test
-rw-r–r-- 1 root root 2370159 Aug 11 22:05 ls_test.tar.gz
drwxr-xr-x 2 root root 4096 Aug 11 12:18 rm_test
drwxr-xr-x 2 root root 4096 Aug 11 10:36 sort_test
drwxr-xr-x 6 root root 4096 Aug 9 23:59 tongpei
压缩命令,参数后面先写将要生成的文件名称,可以带路径。然后跟要压缩的内容,这里可以是文件、目录、或者多个文件和目录的组合。压缩后,压缩文件生成,原有文件或目录不变化。

解压缩-zxvf
[root@localhost training]# cp ls_test.tar.gz /tmp/
[root@localhost training]# cd /tmp/
[root@localhost tmp]# tar -zxvf ls_test.tar.gz
ls_test/
ls_test/slink.txt
ls_test/dir_time/
ls_test/dir_time/a54
ls_test/dir_time/a53
ls_test/dir_time/a21
ls_test/dir_time/a45
解压缩后,目录和文件结构和压缩以前一样。也可以在原有目录解压缩,这样会覆盖原有目录。

gzip
gzip压缩常用于单个文件的压缩,比如:日志文件的压缩。
格式:
gzip filename
gunzip filename

gzip压缩
[root@localhost zip_test]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt dir
[root@localhost zip_test]# gzip *
gzip: dir is a directory – ignored
[root@localhost zip_test]# ls
10.txt.gz 1.txt.gz 2.txt.gz 3.txt.gz 4.txt.gz 5.txt.gz 6.txt.gz 7.txt.gz 8.txt.gz 9.txt.gz dir
可以看到,gzip压缩对文件夹没有效果,只对文件生效。而且压缩后重命名文件,源文件不保留。
注意:这种特性对日志压缩很有用,压缩后没有原文件意味着空间的释放。不需要再执行删除原文件的操作。

gunzip解压
[root@localhost zip_test]# gunzip *
gunzip: dir is a directory – ignored
[root@localhost zip_test]# ls
10.txt 1.txt 2.txt 3.txt 4.txt 5.txt 6.txt 7.txt 8.txt 9.txt dir

另外,gzip的压缩,可以利用zcat文件来直接读取压缩后的文件内容,而不需要解开压缩。这也是gzip成为日志备份首选的重要原因。

zcat

你可能感兴趣的:(【Linux】)