《Linux命令行与shell脚本编程大全(第3版)》读书笔记

一、初识linux shell

1、什么是linux

Linux可划分为以下四部分:Linux内核、GNU工具(如shell)、图形化桌面环境、应用软件

1)深入探究linux内核

内核主要负责以下四种功能: 系统内存管理 、软件程序管理、硬件设备管理 、文件系统管理

2)GNU 工具

(1)核心GNU工具:GNU项目的主旨在于为Unix系统管理员设计出一套类似于Unix的环境。这个目标促使该项目 移植了很多常见的Unix系统命令行工具。供Linux系统使用的这组核心工具被称为coreutils(core utilities)软件包。

GNU coreutils软件包由三部分构成: 用以处理文件的工具;用以操作文本的工具;用以管理进程的工具。

(2)shell:GNU/Linux shell是一种特殊的交互式工具。它为用户提供了启动程序、管理文件系统中的文 件以及运行在Linux系统上的进程的途径。shell的核心是命令行提示符。命令行提示符是shell负责 交互的部分。它允许你输入文本命令,然后解释命令,并在内核中执行。 shell包含了一组内部命令,用这些命令可以完成诸如复制文件、移动文件、重命名文件、显 示和终止系统中正运行的程序等操作。shell也允许你在命令行提示符中输入程序的名称,它会将 程序名传递给内核以启动它。 你也可以将多个shell命令放入文件中作为程序执行。这些文件被称作shell脚本。

3)Linux 桌面环境

2、linux发行版

我们将完整的Linux系统包称为发行版。有很多不同的Linux发行版来满足可能存在的各种运 算需求。大多数发行版是为某个特定用户群定制的,比如商业用户、多媒体爱好者、软件开发人 员或者普通家庭用户。每个定制的发行版都包含了支持特定功能所需的各种软件包,比如为多媒 体爱好者准备的音频和视频编辑软件,为软件开发人员准备的编译器和集成开发环境(IDE)。
不同的Linux发行版通常归类为3种: 完整的核心Linux发行版;特定用途的发行版;LiveCD测试发行版

1)核心 Linux 发行版:核心Linux发行版含有内核、一个或多个图形化桌面环境以及预编译好的几乎所有能见到的 Linux应用。它提供了一站式的完整Linux安装。

2)特定用途的 Linux 发行版:Linux发行版的一个新子群已经出现了。它们通常基于某个主流发行版,但仅包含主流发行 版中一小部分用于某种特定用途的应用程序。 除了提供特定软件外(比如仅为商业用户提供的办公应用),定制化发行版还尝试通过自动 检测和自动配置常见硬件来帮助新手安装Linux。这使得Linux的安装过程轻松愉悦了许多。

3)Linux LiveCD:Linux世界中一个相对较新的现象是可引导的Linux CD发行版的出现。它无需安装就可以看到Linux系统是什么样的。多数现代PC都能从CD启动,而不是必须从标准硬盘启动。基于这点, 一些Linux发行版创建了含有Linux样本系统(称为Linux LiveCD)的可引导CD。由于单张CD容 量的限制,这个样本并非完整的Linux系统,不过令人惊喜的是,你可以自己加入各种软件。结 果就是,你可以通过CD来启动PC,并且无需在硬盘安装任何东西就能运行Linux发行版。

 

二、基本的bash shell命令

1、启动shell

GNU bash shell能提供对Linux系统的交互式访问。它是作为普通程序运行的,通常是在用户 登录终端时启动。登录时系统启动的shell依赖于用户账户的配置。 /etc/passwd文件包含了所有系统用户账户列表以及每个用户的基本配置信息。以下是从 /etc/passwd文件中取出的样例条目: christine:x:501:501:Christine Bresnahan:/home/christine:/bin/bash 每个条目有七个字段,字段之间用冒号分隔。系统使用字段中的数据来赋予用户账户某些特 定特性。其中的大多数条目将在第7章有更加详细的介绍。现在先将注意力放在最后一个字段上, 该字段指定了用户使用的shell程序。

2、shell提示符

一旦启动了终端仿真软件包或者登录Linux虚拟控制台,你就会看到shell CLI提示符。提示符 就是进入shell世界的大门,是你输入shell命令的地方。 默认bash shell提示符是美元符号($),这个符号表明shell在等待用户输入。不同的Linux发 行版采用不同格式的提示符。在Ubuntu Linux系统上,shell提示符看起来是这样的: christine@server01:~$ 在CentOS系统上是这样的: [christine@server01 ~]$ 除了作为shell的入口,提示符还能够提供其他的辅助信息。在上面的两个例子中,提示符中 显示了当前用户ID名christine。另外还包括系统名server01。

3、bash手册

man命令用来访问存储在Linux系统上的手册页面。在想要查找的工具的名称前面输入man命 令,就可以找到那个工具相应的手册条目。
手册页不是唯一的参考资料。还有另一种叫作info页面的信息。可以输入info info来了解info页面的相关内容。另外,大多数命令都可以接受-help或--help选项。例如你可以输入hostname -help来查看帮助。关于帮助的更多信息,可以输入help help。

4、浏览文件系统

1)浏览文件系统

Linux将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)。虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,这点跟Windows类似。
在Linux PC上安装的第 一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的。
Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上它们却存储在另外一个驱动器中。
通常系统文件会存储在根驱动器中,而用户文件则存储在另一驱动器中。

图3-2展示了计算机中的两块硬盘。一块硬盘和虚拟目录的根目录(由正斜线/表示)关联起来。剩下的硬盘就可以挂载到虚拟目录结构中的任何地方。在这个例子中,第二块硬盘被挂载到 了/home位置,用户目录都位于这个位置。

Linux文件系统结构是从Unix文件结构演进过来的。在Linux文件系统中,通用的目录名用于 表示一些常见的功能。

 2)遍历目录

在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录。cd命令的格 式非常简单:cd destination。cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指 定目标路径,它将切换到用户主目录。cd命令的格 式非常简单:destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件 路径。

5、文件和目录列表

1)基本列表功能

 ls命令最基本的形式会显示当前目录下的文件和目录

2)显示长列表

在基本的输出列表中,ls命令并未输出太多每个文件的相关信息。要显示附加信息,另一个 常用的参数是-l。-l参数会产生长列表格式的输出,包含了目录中每个文件的更多相关信息。

3)过滤输出列表

 ls命令还支持在命令行中定义过滤器。它会用过滤器来决定应该在输出中显示哪些文件或目录。这个过滤器就是一个进行简单文本匹配的字符串。可以在要用的命令行参数之后添加这个过滤器。当用户指定特定文件的名称作为过滤器时,ls命令只会显示该文件的信息。有时你可能不知 道要找的那个文件的确切名称。ls命令能够识别标准通配符,并在过滤器中用它们进行模式匹配:问号(?)代表一个字符;星号(*)代表零个或多个字符。可以使用感叹号(!)将不需要的内容排除在外【ls -l f[!a]ll】。

6、处理文件

1)创建文件

touch命令创建了你指定的新文件,并将你的用户名作为文件的属主。注意,文件的大小是 零,因为touch命令只创建了一个空文件。touch命令还可用来改变文件的修改时间。这个操作并不需要改变文件的内容。默认显示的是修改时间。要想查看文件的访问时间,需要加入另外一个参数:--time=atime。有了这个参数,就能够显示出已经更改过的文件访问时间。
【创建时间是指文件信息第一次出现在当前硬盘上的时间; 修改时间是指文件最近一次被保存的时间; 访问时间是指最近一次文件夹中的任意一个子文件被保存的时间;】

2)复制文件

cp命令可以完成这个任务。在最基本的用法里,cp命令需要两个参数——源对象和目标对象:cp source destination。当source和destination参数都是文件名时,cp命令将源文件复制成一个新文件,并且以 destination命名。新文件就像全新的文件一样,有新的修改时间。如果目标文件已经存在,cp命令可能并不会提醒这一点。最好是加上-i选项,强制shell询问是否需要覆盖已有文件。
cp命令的-R参数威力强大。可以用它在一条命令中递归地复制整个目录的内容。

3)制表键(tab)自动补全

制表键自动补全允许你在输入文件名或目录名时按 一下制表键,让shell帮忙将内容补充完整。

4)链接文件

链接文件是Linux文件系统的一个优势。如需要在系统上维护同一文件的两份或多份副本, 除了保存多份单独的物理文件副本之外,还可以采用保存一份物理文件副本和多个虚拟副本的方 法。这种虚拟的副本就称为链接。链接是目录中指向文件真实位置的占位符。在Linux中有两种 不同类型的文件链接:符号链接、硬链接。
符号链接就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。 这两个通过符号链接在一起的文件,彼此的内容并不相同。 要为一个文件创建符号链接,原始文件必须事先存在。然后可以使用ln命令以及-s选项来 创建符号链接。
【证明链接文件是独立文件的方法是查看inode编号。文件或目录的inode编号是一个用 于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象。要查看文件或目录的inode 编号,可以给ls命令加入-i参数。】
硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言 是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在, 只不过这次使用ln命令时不再需要加入额外的参数了。

5)重命名文件

在Linux中,重命名文件称为移动(moving)。mv命令可以将文件和目录移动到另一个位置 或重新命名。
【和cp命令类似,也可以在mv命令中使用-i参数。这样在命令试图覆盖已有的文件时,你 就会得到提示。】

6)删除文件

在Linux中,删除(deleting)叫作移除(removing)①。bash shell中删除文件的命令是rm。rm 命令的基本格式非常简单。
【rm -i 文件名,-i命令参数提示你是不是要真的删除该文件。bash shell中没有回收站或垃圾箱,文件 一旦删除,就无法再找回。因此,在使用rm命令时,要养成总是加入-i参数的好习惯。 也可以使用通配符删除成组的文件。别忘了使用-i选项保护好自己的文件。】
【rm命令的另外一个特性是,如果要删除很多文件且不受提示符的打扰,可以用-f参数强制 删除。小心为妙!】

7、处理目录

在Linux中,有些命令(比如cp命令)对文件和目录都有效,而有些只对目录有效。创建新 目录需要使用本节讲到的一个特殊命令。

1)创建目录

在Linux中创建目录很简单,用mkdir命令。
【要想同时创建多个目录和子目录,需要加入-p参数】

2)删除目录

删除目录之所以很棘手,是有原因的。删除目录时,很有可能会发生一些不好的事情。shell 会尽可能防止我们捅娄子。删除目录的基本命令是rmdir。
【默认情况下,rmdir命令只删除空目录。也可以在整个非空目录上使用rm命令。使用-r选项使得命令可以向下进入目录,删除其中的文件,然后再删除目录本身。一口气删除目录及其所有内容的终极大法就是使用带有-r参数和-f参数的rm命令。】

8、查看文件内容

Linux中有几个命令可以查看文件的内容,而不需要调用其他文本编辑器。

1)查看文件类型

file命令是一个随手可得的便捷工具。它能够探测文件的内部,并决定文件是什么类型的。

2)查看整个文件

如果手头有一个很大的文本文件,你可能会想看看里面是什么内容。在Linux上有3个不同的 命令可以完成这个任务:

(1)cat命令:cat命令是显示文本文件中所有数据的得力工具。【-n参数会给所有的行加上行号。如果只想给有文本的行加上行号,可以用-b参数。如果不想让制表符出现,可以用-T参数。】

(2)more命令:cat命令的主要缺陷是:一旦运行,你就无法控制后面的操作。为了解决这个问题,开发人 员编写了more命令。more命令会显示文本文件的内容,但会在显示每页数据之后停下来。【more命令只支持文本文件中的基本移动】

(3)less命令:less命令的命名实际上是个文字游戏(从 俗语“less is more”得来),它实为more命令的升级版。它提供了一些极为实用的特性,能够实 现在文本文件中前后翻动,而且还有一些高级搜索功能。

3)查看部分文件

(1)tail命令:tail命令会显示文件最后几行的内容(文件的“尾部”)。默认情况下,它会显示文件的末 尾10行。

【可以向tail命令中加入-n参数来修改所显示的行数。-f参数是tail命令的一个突出特性。它允许你在其他进程使用该文件时查看文件的内容。 tail命令会保持活动状态,并不断显示添加到文件中的内容。这是实时监测系统日志的绝妙 方式。】

(2)head命令:head命令,顾名思义,会显示文件开头那些行的内容。默认情况下,它会显示文件前10行 的文本。

【支持-n参数,这样就可以指定想要显示的行数】

三、更多的bash shell命令

1、监测程序

1)探查进程:想监测这些进程,需要熟悉ps命令的用法

Linux系统中使用的GNU ps命令支持3种不同类型的命令行参数:

(1)Unix风格的参数,前面加单破折线;Unix风格的参数是从贝尔实验室开发的AT&T Unix系统上原有的ps命令继承下来的。

【如果你想查看系统上运行的所有进程,可用-ef 参数组合(ps命令允许你像这样把参数组合在一起)】

[root@shffbapp ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0  2021 ?        00:42:57 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0  2021 ?        00:00:03 [kthreadd]
root          4      2  0  2021 ?        00:00:00 [kworker/0:0H]
root          6      2  0  2021 ?        00:01:31 [ksoftirqd/0]

UID:启动这些进程的用户。
PID:进程的进程ID。
PPID:父进程的进程号(如果该进程是由另一个进程启动的)。
C:进程生命周期中的CPU利用率。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备。
TIME:运行进程需要的累计CPU时间。
CMD:启动的程序名称。

[root@shffbapp ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  34889  34887  0  80   0 - 29604 do_wai pts/0    00:00:00 bash
0 R     0  38396  34889  0  80   0 - 38312 -      pts/0    00:00:00 ps

 注意使用了-l参数之后多出的那些列。
F:内核分配给进程的系统标记。
S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵
化,进程已结束但父进程已不存在;T代表停止)。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI:谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
WCHAN:进程休眠的内核函数的地址。

(2)BSD风格的参数,前面不加破折线;

(3)GNU风格的长参数,前面加双破折线。

2)实时监测进程

ps命令虽然在收集运行在系统上的进程信息时非常有用,但也有不足之处:它只能显示某个特定时间点的信息。如果想观察那些频繁换进换出的内存的进程趋势,用ps命令就不方便了。而top命令刚好适用这种情况。top命令跟ps命令相似,能够显示进程信息,但它是实时显示的。

[root@shftfbapp ~]# top
top - 21:37:36 up 80 days, 22:43,  1 user,  load average: 0.09, 0.08, 0.05
Tasks: 189 total,   1 running, 188 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.9 us,  0.4 sy,  0.0 ni, 98.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 12283756 total,  8243884 free,  1812172 used,  2227700 buff/cache
KiB Swap: 16383996 total, 16383996 free,        0 used.  9538916 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                     
 19717 root      20   0  694840  56836   6876 S   6.0  0.5  23:11.10 python3                                                                                     
 84340 root      20   0 2296156  85808   6280 S   1.0  0.7 289:57.50 titanagent                                                                                  
     9 root      20   0       0      0      0 S   0.3  0.0  76:38.39 rcu_sched                                                                                   
  3658 logkita+  20   0  541964  58780  23996 S   0.3  0.5 356:09.47 logkit-pro                                                                                  
 40963 root      20   0  162044   2356   1580 R   0.3  0.0   0:00.02 top                                                                                         
 84342 root       9 -11   87708   1640   1112 S   0.3  0.0  29:50.23 titan_monitor                                                                               
     1 root      20   0   51852   4108   2608 S   0.0  0.0  42:57.46 systemd                                                                                     
     2 root      20   0       0      0      0 S   0.0  0.0   0:03.30 kthreadd                                                                                    
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                                                
     6 root      20   0       0      0      0 S   0.0  0.0   1:31.14 ksoftirqd/0                                                                                 
     7 root      rt   0       0      0      0 S   0.0  0.0   0:19.71 migration/0                                                                                 
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                                                      
    10 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 lru-add-drain

输出的第一部分显示的是系统的概况:第一行显示了当前时间、系统的运行时间、登录的用户数以及系统的平均负载。
【平均负载有3个值:最近1分钟的、最近5分钟的和最近15分钟的平均负载。值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见,但如果近15分钟内的平均负载都很高,就说明系统可能有问题。】
第二行显示了进程概要信息——top命令的输出中将进程叫作任务(task):有多少进程处在运行、休眠、停止或是僵化状态(僵化状态是指进程完成了,但父进程没有响应)
下一行显示了CPU的概要信息。top根据进程的属主(用户还是系统)和进程的状态(运行、空闲还是等待)将CPU利用率分成几类输出。
紧跟其后的两行说明了系统内存的状态。第一行说的是系统的物理内存:总共有多少内存,当前用了多少,还有多少空闲。后一行说的是同样的信息,不过是针对系统交换空间(如果分配了的话)的状态而言的。
最后一部分显示了当前运行中的进程的详细列表,有些列跟ps命令的输出类似。
PID:进程的ID。
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允许你修改轮询间隔。键入q可以退出top。用户在top命令的输出上有很大的控制权。用这个工具就能经常找出占用系统大部分资源的罪魁祸首。当然了,一旦找到,下一步就是结束这些进程。】

3)结束进程

在Linux中,进程之间通过信号来通信。进程的信号就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应。进程如何处理信号是由开发人员通过编程来决定的。大多数编写完善的程序都能接收和处理标准Unix进程信号。

 在Linux上有两个命令可以向运行中的进程发出进程信号。

(1)kill命令
kill命令可通过进程ID(PID)给进程发信号。默认情况下,kill命令会向命令行中列出的全部PID发送一个TERM信号。遗憾的是,你只能用进程的PID而不能用命令名,所以kill命令有时并不好用。要发送进程信号,你必须是进程的属主或登录为root用户。
TERM信号告诉进程可能的话就停止运行。不过,如果有不服管教的进程,那它通常会忽略这个请求。如果要强制终止,-s参数支持指定其他信号(用信号名或信号值)。

【kill -s HUP 3940】

(2)killall命令

killall命令非常强大,它支持通过进程名而不是PID来结束进程。killall命令也支持通配符,这在系统因负载过大而变得很慢时很有用。

【killall http*】

2、监测磁盘空间

1)挂载存储媒体

(1)mount命令:。默认情况下,mount命令会输出当前系统上挂载的设备列表。

[root@shffbapp /]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=6130136k,nr_inodes=1532534,mode=755)

【mount命令提供如下四部分信息:媒体的设备文件名、媒体挂载到虚拟目录的挂载点、文件系统类型、已挂载媒体的访问状态;】

要手动在虚拟目录中挂载设备,需要以root用户身份登录,或是以root用户身份运行sudo命 令。下面是手动挂载媒体设备的基本命令:mount -t type device directory

type参数指定了磁盘被格式化的文件系统类型。Linux可以识别非常多的文件系统类型。如果是和Windows PC共用这些存储设备,通常得使用下列文件系统类型。
vfat:Windows长文件系统。
ntfs:Windows NT、XP、Vista以及Windows 7中广泛使用的高级文件系统。
iso9660:标准CD-ROM文件系统。
大多数U盘和软盘会被格式化成vfat文件系统。而数据CD则必须使用iso9660文件系统类型。后面两个参数定义了该存储设备的设备文件的位置以及挂载点在虚拟目录中的位置。比如说,手动将U盘/dev/sdb1挂载到/media/disk,可用下面的命令:
mount -t vfat /dev/sdb1 /media/disk
媒体设备挂载到了虚拟目录后,root用户就有了对该设备的所有访问权限,而其他用户的访问则会被限制。你可以通过目录权限(将在第7章中介绍)指定用户对设备的访问权限。

(2)umout命令

从Linux系统上移除一个可移动设备时,不能直接从系统上移除,而应该先卸载。卸载设备的命令是umount(是的,你没看错,命令名中并没有字母n,这一点有时候很让人 困惑)。umount命令的格式非常简单:umount [directory | device ]

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

【如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof命令的用法很简单:lsof /path/to/device/node,或者lsof /path/to/mount/point。】

2)使用df命令

有时你需要知道在某个设备上还有多少磁盘空间。df命令可以让你很方便地查看所有已挂载磁盘的使用情况。

[root@ffbapp ~]# df 
Filesystem                      1K-blocks    Used Available Use% Mounted on
devtmpfs                          6130136       0   6130136   0% /dev
tmpfs                             6141876       0   6141876   0% /dev/shm
tmpfs                             6141876  618348   5523528  11% /run
tmpfs                             6141876       0   6141876   0% /sys/fs/cgroup
/dev/mapper/vg01-lv_root         46299048 3848244  42450804   9% /
/dev/mapper/vg_tpdata-lv_tpdata  62879748 8954836  53924912  15% /tpdata
/dev/mapper/vg02-lv_tpsys        62879748 6314560  56565188  11% /u01
/dev/sda1                          201380  119852     81528  60% /boot
/dev/mapper/vg03-lv_tptools      10471424  464232  10007192   5% /u02
tmpfs                             1228376       0   1228376   0% /run/user/1799
tmpfs                             1228376       0   1228376   0% /run/user/0

 命令输出如下:
设备的设备文件位置;
能容纳多少个1024字节大小的块;
已用了多少个1024字节大小的块;
还有多少个1024字节大小的块可用;
已用空间所占的比例;
设备挂载到了哪个挂载点上。

df命令有一些命令行参数可用,但基本上不会用到。一个常用的参数是-h。它会把输出中的磁盘空间按照用户易读的形式显示,通常用M来替代兆字节,用G替代吉字节。

3)使用du命令

du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这一方法可用来快速判断系统上某个目录下是不是有超大文件。
默认情况下,du命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,它会以磁盘块为单位来表明每个文件或目录占用了多大存储空间。对标准大小的目录来说,这个输出会是一个比较长的列表。
每行输出左边的数值是每个文件或目录占用的磁盘块数。注意,这个列表是从目录层级的最底部开始,然后按文件、子目录、目录逐级向上。
下面是能让du命令用起来更方便的几个命令行参数。
-c:显示所有已列出文件总的大小。
 -h:按用户易读的格式输出大小,即用K替代千字节,用M替代兆字节,用G替代吉字节。
 -s:显示每个输出参数的总计。

du -sh * | sort -nr 

3、处理数据文件

1)排序数据

 处理大量数据时的一个常用命令是sort命令。默认情况下,sort命令按照会话指定的默认语言的排序规则对文本文件中的数据行排序。sort命令会把数字当做字符来执行标准的字符排序,产生的输出可能根本就不是你要的。解决这个问题可用-n参数,它会告诉sort命令把数字识别成数字而不是字符,并且按值排序。另一个常用的参数是-M,按月排序。Linux的日志文件经常会在每行的起始位 置有一个时间戳,用来表明事件是什么时候发生的。

2)搜索数据

 grep命令会在输入或指定的文件中查找包含匹配指定模式的字符的行。grep的输出就是包含了匹配模式的行。grep [options] pattern [file]
如果要进行反向搜索(输出不匹配该模式的行),可加-v参数。 grep -v t file1
如果要显示匹配模式的行所在的行号,可加-n参数。grep -n t file1
如果只要知道有多少行含有匹配的模式,可用-c参数。 grep -c t file1
如果要指定多个匹配模式,可用-e参数来指定每个模式。grep -e t -e f file1

3)压缩数据

gzip软件包是GNU项目的产物,意在编写一个能够替代原先Unix中compress工具的免费版本。这个软件包含有下面的工具。
gzip:用来压缩文件。
gzcat:用来查看压缩过的文本文件的内容。
gunzip:用来解压文件。
gzip命令会压缩你在命令行指定的文件。也可以在命令行指定多个文件名甚至用通配符来一次性批量压缩文件。

4)归档数据

 虽然zip命令能够很好地将数据压缩和归档进单个文件,但它不是Unix和Linux中的标准归档工具。目前,Unix和Linux上最广泛使用的归档工具是tar命令。tar命令最开始是用来将文件写到磁带设备上归档的,然而它也能把输出写到文件里,这种用法在Linux上已经普遍用来归档数据了。
下面是tar命令的格式:
tar function [options] object1 object2 ...
function参数定义了tar命令应该做什么。

 每个功能可用选项来针对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 

四、理解shell

1、shell的类型

2、shell的父子关系

3、理解shell的内建命令

1)外部命令

外部命令,有时候也被称为文件系统命令,是存在于bash shell之外的程序。它们并不是shell程序的一部分。外部命令程序通常位于/bin、/usr/bin、/sbin或/usr/sbin中。
ps就是一个外部命令。你可以使用which和type命令找到它。
当外部命令执行时,会创建出一个子进程。这种操作被称为衍生(forking)。外部命令ps很方便显示出它的父进程以及自己所对应的衍生子进程。
当进程必须执行衍生操作时,它需要花费时间和精力来设置新子进程的环境。所以说,外部命令多少还是有代价的。

2)内建命令

内建命令和外部命令的区别在于前者不需要使用子进程来执行。它们已经和shell编译成了一体,作为shell工具的组成部分存在。不需要借助外部程序文件来运行。
cd和exit命令都内建于bash shell。可以利用type命令来了解某个命令是否是内建的。
要注意,有些命令有多种实现。例如echo和pwd既有内建命令也有外部命令。两种实现略有不同。要查看命令的不同实现,使用type命令的-a选项。
命令type -a显示出了每个命令的两种实现。注意,which命令只显示出了外部命令文件。
【对于有多种实现的命令,如果想要使用其外部命令实现,直接指明对应的文件就可以了。例如,要使用外部命令pwd,可以输入/bin/pwd。】

(1)使用history命令

一个有用的内建命令是history命令。bash shell会跟踪你用过的命令。你可以唤回这些命令并重新使用。
要查看最近用过的命令列表,可以输入不带选项的history命令。

 你可以唤回并重用历史列表中最近的命令。这样能够节省时间和击键量。输入!!,然后按回车键就能够唤出刚刚用过的那条命令来使用。
命令历史记录被保存在隐藏文件.bash_history中,它位于用户的主目录中。这里要注意的是,bash命令的历史记录是先存放在内存中,当shell退出时才被写入到历史文件中。

(2)命令别名

alias命令是另一个shell的内建命令。命令别名允许你为常用的命令(及其参数)创建另一个名称,从而将输入量减少到最低。
你所使用的Linux发行版很有可能已经为你设置好了一些常用命令的别名。要查看当前可用的别名,使用alias命令以及选项-p。

alias li='ls -li' 

 五、使用Linux环境变量

【在涉及环境变量名时,什么时候该使用$,什么时候不该使用$,实在让人摸不着头脑。 记住一点就行了:如果要用到变量,使用$;如果要操作变量,不使用$。这条规则的一 个例外就是使用printenv显示某个变量的值。】

1、什么是环境变量

bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是它们被称作环境变量的原因)。这项特性允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。这也是存储持久数据的一种简便方法。
在bash shell中,环境变量分为两类:
 全局变量
 局部变量

1)全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。这让全局环境变量对那些所创建的子shell需要获取父shell信息的程序来说非常有用。
Linux系统在你开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。要查看全局变量,可以使用envprintenv命令。
也可以使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面 加上一个美元符($)。【在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数。】

2)局部环境变量

局部环境变量只能在定义它们的进程中可见。尽管它们是局部的,但是和全局环境变量一样重要。事实上,Linux系统也默认定义了标准的局部环境变量。不过你也可以定义自己的局部变量,如你所想,这些变量被称为用户定义局部变量。
查看局部环境变量的列表有点复杂。遗憾的是,在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。

2、设置用户定义变量

1)设置局部用户定义变量(=)

一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串。
如果要给变量赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。
没有单引号的话,bash shell会以为下一个词是另一个要执行的命令。注意,你定义的局部环境变量用的是小写字母,而到目前为止你所看到的系统环境变量都是大写字母。

【变量名、等号和值之间没有空格,这一点非常重要。如果在赋值表达式中加上了空格, bash shell就会把值当成一个单独的命令】

2)设置全局环境变量(export)

创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。

my_variable="I am Global now"
export my_variable 

 【子shell甚至无法使用export命令改变父shell中全局环境变量的值。】

3、删除环境变量

 当然,既然可以创建新的环境变量,自然也能删除已经存在的环境变量。可以用unset命令完成这个操作。在unset命令中引用环境变量时,记住不要使用$。

【在处理全局环境变量时,事情就有点棘手了。如果你是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用。】

4、默认的shell环境变量

默认情况下,bash shell会用一些特定的环境变量来定义系统环境。这些变量在你的Linux系 统上都已经设置好了,只管放心使用。bash shell源自当初的Unix Bourne shell,因此也保留了Unix Bourne shell里定义的那些环境变量。
表6-1列出了bash shell提供的与Unix Bourne shell兼容的环境变量。

 除了默认的Bourne的环境变量,bash shell还提供一些自有的变量,如表6-2所示(略)。

5、设置PATH环境变量

当你在shell命令行界面中输入一个外部命令时,shell必须搜索系统来找到对应 的程序。PATH环境变量定义了用于进行命令和程序查找的目录。
如果命令或者程序的位置没有包括在PATH变量中,那么如果不使用绝对路径的话,shell是没法找到的。如果shell找不到指定的命令或程序,它会产生一个错误信息。问题是,应用程序放置可执行文件的目录常常不在PATH环境变量所包含的目录中。解决的办法是保证PATH环境变量包含了所有存放应用程序的目录。可以把新的搜索目录添加到现有的PATH环境变量中,无需从头定义。PATH中各个目录之间是用冒号分隔的。你只需引用原来的PATH值,然后再给这个字符串添加新目录就行了。
【对PATH变量的修改只能持续到退出或重启系统。这种效果并不能一直持续。后续你会学到如何永久保持环境变量的修改效果。】

6、定位系统环境变量

 

7、数组变量

 

posted @ 2024-06-13 21:40  权杖攻城狮  阅读(83)  评论(0编辑  收藏  举报