第3章 Linux系统运维基本命令 本章首先介绍系统内核和Shell终端的关系与作用,然后介绍Bash解释器的四大优势并学习Linux命令的执行方法。然后编者精挑细选出读者有必要首先学习的三十几个Linux命令,它们与文件管理、目录管理、系统管理、任务管理、环境变量等主题相关。通过把上述命令归纳到本章中的各节,帮助读者分门别类地逐个学习这些最基础的Linux命令,为今后学习更复杂的命令和服务做好必备知识铺垫。 3.1初识Shell 通常来讲,计算机硬件是由运算器、控制器、存储器、输入/输出设备等共同组成的,而让各种硬件设备各司其职且又能协同运行的东西就是系统内核。Linux系统的内核负责完成对硬件资源的分配、调度等管理任务。由此可见,系统内核对计算机的正常运行来讲是非常重要的,因此一般不建议直接去编辑内核中的参数,而是让用户通过基于系统调用接口开发出的程序或服务来管理计算机,以满足日常工作的需要,如图31所示。 图31用户与Linux系统的交互 Linux系统中有些图形化工具(例如逻辑卷管理器(Logical Volume Manager,LVM))确实非常好用,极大地降低了运维人员操作出错的概率。但是,很多图形化工具其实是调用脚本来完成相应的工作,往往只是为了完成某种工作而设计的,缺乏Linux命令原有的灵活性及可控性。再者,图形化工具相比于Linux命令行界面会更加消耗系统资源,因此经验丰富的运维人员甚至都不会给Linux系统安装图形界面。 Shell就是这样的一个命令行工具。Shell(也称为终端或壳)充当的是人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端,它就会调用相应的程序服务去完成某些工作。现今主流Linux系统默认使用的终端都是Bash(BourneAgain Shell)解释器。主流Linux系统选择Bash解释器作为命令行终端主要有以下4项优势。 (1) 通过上下方向键来调取过往执行过的Linux命令; (2) 命令或参数仅需输入前几位就可以用Tab键补全; (3) 具有强大的批处理脚本; (4) 具有实用的环境变量功能。 3.2执行查看帮助命令 常见执行Linux命令的格式如下: 命令名称[命令参数] [命令对象] 注意: 命令名称、命令参数、命令对象之间请用空格分隔。 命令对象一般是指要处理的文件、目录、用户等资源,而命令参数可以用长格式(完整的选项名称),也可以用短格式(单个字母的缩写),两者分别用与作为前缀,示例如下。 man --help长格式 man -h短格式 在Linux系统中有很多命令,一个命令还有很多参数,那么运维工程师必须提前学会全部的命令以及参数么?不一定。接下来,man这个命令就是我们学习Linux系统的第一个命令了。对于零基础的读者,可以通过图32~图34学习如何在CentOS 7系统中执行Linux命令。 第 3 章 Linux系统运维基本命令 Linux服务器运维管理(第2版) 图32选择“未列出”选项,切换至ROOT管理员身份 默认主机登录界面只显示刚刚新建的普通用户,因此在正式进入系统之前,还需要先单击“未列出?”选项来切换至ROOT管理员身份,如图32所示。这是红帽CentOS 7系统为了避免用户乱使用权限而采取的一项小措施。而如果顺手使用默认的linuxyhy用户登录到主机中,那么接下来本章中则会出现一部分命令会因权限不足而无法执行,需要足够的权限才能完成接下来的实验。因此,建议将登录界面切换至ROOT管理员身份。 在CentOS 7系统的桌面上单击鼠标右键,在弹出的菜单中选择“打开终端”命令,将打开一个Linux系统命令行终端,在命令行终端中输入“man man”命令来查看man命令自身的帮助信息,如图33所示。 图33查看man命令的帮助信息 按Enter键后即可看到如图34所示的帮助信息。 图34man命令的帮助信息 在man命令帮助信息的界面中,所包含的常用操作按键及其用途如表31所示。 表31man命令中常用按键以及用途 按键用途按键用途 空格键向下翻一页/从上至下搜索某个关键词,如“/linux” Page Down向下翻一页?从下至上搜索某个关键词,如“?linux” Page Up向上翻一页n定位到下一个搜索到的关键词 Home直接前往首页N定位到上一个搜索到的关键词 End直接前往尾页q退出帮助文档 一般来讲,使用man命令查看到的帮助内容信息都会很长很多,man命令的帮助信息的结构如表32所示。 表32man命令帮助信息的结构以及意义 结 构 名 称代 表 意 义结 构 名 称代 表 意 义 NAME命令的名称OPTIONS具体的可用选项(带介绍) SYNOPSIS参数的大致使用方法ENVIRONMENT环境变量 DESCRIPTION介绍说明FILES用到的文件 EXAMPLES演示(附带简单说明)SEE ALSO相关的资料 OVERVIEW概述HISTORY维护历史与联系方式 DEFAULTS默认的功能 3.3文件管理命令 文件是Linux的基本组成部分,文件管理包括文件的复制、删除、修改、查看等操作。本节主要介绍Linux中文件管理相关的命令。 3.3.1创建文件或修改文件时间touch命令 touch命令有两个功能: 一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来; 二是用来创建新的空文件。 touch yhy命令表示在当前目录下建立一个名为yhy的空文件,然后利用ls l命令可以发现文件yhy的大小为0,表示它是空文件。 touch t 201901142234.50 yhy使用指定的日期时间,而非现在的时间。日期时间格式为[[CC]YY]MMDDhhmm[.SS]。 其中,CC为年数中的前两位,即“世纪数”; YY为年数的后两位,即某世纪中的年数。如果不给出CC的值,则touch将把年数CCYY限定为1969~2068。 MM为月数,DD为天数,hh为小时数(几点),mm为分钟数,SS为秒数。此处秒的设定范围是0~61,这样可以处理闰秒。这些数字组成的时间是环境变量TZ指定的时区中的一个时间。由于系统的限制,早于1970年1月1日的时间是错误的。 3.3.2复制文件cp命令与移动文件mv命令 在使用Linux操作系统的过程中,常常需要复制或移动文件或者目录,类似于Windows系统下的复制剪切操作。下面以CentOS 7.5系统为例演示在Linux系统中如何对文件和目录进行复制和移动。 注意: cp命令与mv命令在很多功能上都非常相似,但是这两个命令又具有很大的区别,cp为复制,会保留源文件与目录,mv为移动,不会保留源文件与目录。 cp yhy yhy.txt命令表示把文件yhy复制成yhy.txt,源文件yhy依然存在。 mv yhy.txt yhy.txt.bak命令表示把文件yhy.txt改名成yhy.txt.bak,源文件yhy.txt不再存在了。 cp yhy.txt.bak /home命令表示复制当前目录下文件yhy.txt.bak到/home目录下,文件名不变,源文件存在。 cp yhy.txt.bak /home/yhy.txt命令表示复制文件yhy.txt.bak到/home目录下并把文件名改为yhy.txt。源文件依然存在。 mv install.log /home命令表示移动install.log文件到/home目录下,文件名不变。源文件不存在了。 如果希望同时将多个文件复制到指定目录,可以使用命令“cp源文件1源文件2指定目录”来完成。如果想完成多文件的移动操作,就可以使用命令“mv源文件1源文件2指定目录”来完成。 如果希望将一个目录下的所有文件都复制到指定目录,可以使用cp命令配合通配符来完成: “cp源目录/*指定目录”。同样, “mv源目录/*指定目录”命令也可以完成整体移动的功能。 如果希望复制目录,可以使用命令“cp r源目录目的目录”来完成,r参数表明的是递归复制。当目的目录不存在时,系统会自动创建目的目录; 当目的目录存在时,系统会将源目录下的内容复制到目的目录中。如果将命令中的cp r换成mv,那么目的目录的操作等同于cp命令,但源目录会被删除。 为防止用户在不经意的情况下使用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令复制文件后,这个文件就会被覆盖,“i”选项可以在覆盖之前询问用户。 3.3.3删除文件rm命令 用户可以用rm命令删除不需要的文件。rm可以删除文件或目录,并且支持通配符,如目录中存在其他文件则会递归删除。删除软链接只是删除链接,对应的文件或目录不会被删除,软链接类似Windows系统中的快捷方式。如删除一个硬链接后文件仍然存在,其他的硬链接仍可以访问该文件的内容。 Linux系统之下的删除不完全等同于Windows系统下的删除操作,其中最大的也是需要操作者最重视的就是Linux系统下一旦删除了文件与目录那么它将会消失,而Windows系统下还可以通过回收站来进行还原。 Linux系统下的删除操作本身就具有很高的执行权限,如果再在ROOT用户下执行,可以完全删除整个操作系统。 “rm文件名”命令可以删除当前目录下的文件,如果不加任何参数,系统会自动提示是否删除,如果确定删除输入“y”即可完成。需要注意的是,删除操作需要操作用户对该文件具有写权限。 “rm r目录名”命令可以删除当前目录下的一个目录,r参数代表的含义就是递归,系统会将该目录下的所有文件包括目录全部删除,当然系统也会逐个提示用户是否删除,输入“y”即可。 在删除目录的时候是不是逐个输入“y”很麻烦?这里系统设定了另外一个参数f,实际上就是force的意思,代表的是强制执行。一旦输入命令“rm rf目录”那么系统会不在任何提示下完全删除目录。 在多数情况下,rm命令会配合通配符使用,例如,需要删除所有后缀是doc的文件可以使用命令“rm rf *.doc”,一旦操作完成,那么所有后缀为.doc的文件或者目录都会被删除。这里笔者还要再提醒一句,通配符在配合rm命令使用时一定要小心,如果在根目录下输入上述命令时不小心在*和.doc之间多加了一个空格变成“rm rf *.doc”,那么整个Linux系统都会被删除。 当然rm命令后面所跟着的文件与目录,都可以使用绝对路径与相对路径。例如,“rm rf /root/Linux.doc”与在root目录下使用“rm rf ./Linux.doc”和“rm rf Linux.doc”的效果是一样的。 3.3.4查看文件cat、less、tail、more命令 cat、more和less三种命令可以用来查阅全部的文件,它们查阅文件的使用方法也比较简单,都是“命令文件名”,但是三者又有着区别。 cat命令可以一次显示整个文件,如果文件比较大,使用不是很方便。 more命令可以让屏幕在显示满一屏幕时暂停,此时可按空格键继续显示下一个画面,或按Q键退出。 less命令也可以分页显示文件,和more命令的区别就在于它支持上下键卷动屏幕,当结束浏览时,只要在less命令的提示符“:”下按Q键即可。 另外,多数情况下more和less命令会配合管道符分页输出需要在屏幕上显示的内容。 分别使用cat、more、less命令显示root目录下的install.log文件,然后使用more和less命令配合grep与管道符查找install.log文件中包含i686的文本行,注意三个命令的区别。 cat /root/install.log: 使用cat命令显示install.log文件,从结果中可以看出,系统会将install.log文件完整地显示出来,但是用户只能看到文件的末尾部分,该命令适合显示内容比较少的文件。 more /root/install.log: 使用more命令显示install.log文件,从结果中可以看出,系统在显示满一个屏幕时暂停,使用空格键可以翻页,使用Q键可以退出。 less /root/install.log: 使用less命令显示install.log文件,从结果中可以看出,系统同样在显示满一个屏幕时暂停,但是可以使用上下键卷屏,当结束时只需在“:”后输入Q即可。 cat /root/install.log | grep “i686”| more或cat /root/install.log | grep “i686”| less: 分页显示install.log文件中包含i686的文本行,结合grep和管道符使用。这条命令实际上是将install.log文件内的所有内容管道给grep,然后查找包含i686的文本行,最后将查找到的内容管道给more或less分页输出。 catn /root/install.log: 显示行号,空白行也进行编号。 catb /root/install.log: 对空白行不编号。 catfile1 file2 >file_1_2: 合并file1和file2的内容到file_1_2中。 cat>file3: 创建文件file3,等待键盘输入内容,按Ctrl+D组合键结束输入。 cat>>file3: 往file3追加内容,等待键盘输入追加的内容,按Ctrl+D组合键结束输入。 more+6file3: 从第6行开始显示文件内容。 morec10 file3: 先清屏,然后将以每10行一组的方式显示文件example.c的内容。 tail和less类似,tail可以指定显示文件的最后多少行,并可以滚动显示日志。 3.3.5文件或目录查找find、locate命令 find命令可以根据给定的路径和表达式查找指定的文件或目录。find参数选项很多,并且支持正则表达式,功能强大,和管道结合使用可以实现复杂的功能,是系统管理者和普通用户必须掌握的命令。find如不加任何参数,表示查找当前路径下的所有文件和目录。 1. 通过文件名查找法 findname httpd.conf: 查找名为httpd.conf的文件在Linux系统中的完整位置。 2. 无错误查找技巧 在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式,这样普通用户就没有权限用“find”命令来查询这些目录或者文件了。当普通用户使用“find”命令查询这些文件目录时,往往会出现 “Permissiondenied”(禁止访问)字样,系统将无法查询到用户想要的文件。为了避免这样的错误,可以使用转移错误提示的方法尝试查找文件,例如,输入: find / name access_log 2>/dev/null。 3. 根据部分文件名查找方法 find /etc name '*srm*': 查找系统中在/etc下所有包含“srm”三个字母的文件。 这个命令表明了Linux系统将在/etc整个目录中查找所有包含“srm”这3个字母的文件,比如absrmyz、tibc.srm等符合条件的文件都能显示出来。如果知道这个文件是由“srm”这3个字母开头的,可以省略最前面的星号,命令如下: find /etc name 'srm*'。 这时只有像srmyz这样的文件才能被查找出来,而absrmyz或者absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。 4. 根据文件的特征查询方法 findsize 1500c: 查找一个大小为1500B的文件,字符c表明这个要查找的文件的大小是以B为单位。 findsize+10000000c: 查找出大于10000000B的文件并显示出来,命令中的“+”表示要求系统只列出大于指定大小的文件,而使用“-”则表示要求系统列出小于指定大小的文件。 findamin 10: 查找在系统中最后10min访问的文件。 findatime 2: 查找在系统中最后48(2×24)h访问的文件。 findcmin 2: 查找系统中最后2min被改变状态的文件。 findempty: 查找在系统中为空的文件或者文件夹。 findgroup cat: 查找在系统中属于用户组cat的文件。 findmmin 5: 查找在系统中最后5min里修改过的文件。 findmtime 1: 查找在系统中最后24h里修改过的文件。 findnouser: 查找在系统中属于作废用户的文件。 finduser yhy: 查找在系统中属于yhy这个用户的文件。 findfalse: 查找系统中总是错误的文件。 findfstype type: 查找系统中存在于指定文件系统的文件,例如EXT4。 locate命令其实是find name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。 locate /etc/sh: 搜索etc目录下所有以sh开头的文件。 locate ~/m: 搜索用户主目录下所有以m开头的文件。 locate i ~/m: 搜索用户主目录下所有以m开头的文件,并且忽略大小写。 3.3.6过滤文本grep命令 grep是一种强大的文本搜索工具命令,用于查找文件中符合指定格式的字符串,支持正则表达式。如不指定任何文件名称,或是所给予的文件名为“-”,则grep命令从标准输入设备读取数据。grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小的不同。egrep是grep的扩展。fgrep就是fixed grep或fast grep,该命令使用任何正则表达式中的元字符表示其自身的字面意义。其中,egrep就等同于“grep E”,fgrep等同于“grep F”。Linux中的grep功能强大,支持很多丰富的参数,可以方便地进行一些文本处理工作。 grep单独使用时至少有两个参数,如少于两个参数,grep会一直等待,直到该程序被中断。如果遇到了这样的情况,可以按 Ctrl+C组合键终止。默认情况下只搜索当前目录,如果递归查找子目录,可使用“r”选项。 grep root /etc/passwd: 在指定文件/etc/passwd中査找包含root字符串的行。 cat /etc/passwd | grep root: 结合管道一起使用,效果同上。 grep n root /etc/passwd: 将显示符合条件的内容以及所在的行号。 grep Listen httpd.conf: 在httpd.conf中查找包含Listen的行打印出来,区分大小写。 grep i uuid yhy.txt: 不区分大小写,在yhy.txt中査找指定字符串uuid。 grep支持丰富的正则表达式,在此不再详述。 3.3.7比较文件差异diff命令 diff命令的功能为逐行比较两个文本文件,列出其不同之处。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,以便告知用户为了使两个文件file1和file2一致,需要修改它们的哪些行,比较之前不要求事先对文件进行排序。如果diff命令后跟的是目录,则会对该目录中的同名文件进行比较,但不会比较其中的子目录。 diffhttpd.conf httpd.conf.bak丨cat n: 比较文件差异。 在比较结果中,以“<”开头的行属于第1个文件,以“>”开头的行属于第2个文件。字母a、d和c分别表示附加、删除和修改操作。 3.3.8在文件或目录之间创建链接ln命令 ln命令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。ln命令会保持每一处链接文件的同步性,也就是说,改动其中一处,其他地方的文件都会发生相同的变化。 ln分为软链接和硬链接。软链接只会在目的位置生成一个文件的链接文件,实际上不会占用磁盘空间,相当于Windows中的快捷方式。硬链接会在目的位置上生成一个和源文件大小相同的文件。无论是软链接还是硬链接,文件都保持同步变化。软链接是可以跨分区的,但是硬链接必须在同一个文件系统,并且不能对目录进行硬链接,而软链接可以指向任意的位置。 ln s /data/ln/src /data/ln/dst: 创建软链接,当源文件内容改变时,软链接指向的文件内容也会改变,如果删除源文件,软链接指向的文件内容已经不存在。 ln /data/ln/src /data/ln/dst_hard: 创建硬链接,如果删除源文件,硬链接文件内容依然存在。 ln s /data/ln/*/data/ln2: 对某一目录中的所有文件和目录建立链接。 对硬链接指向的文件进行读写和删除操作的时候,效果和软链接相同。如果删除硬链接文件的源文件,硬链接文件仍然存在,可以将硬链接指向的文件认为是不同的文件,只是具有相同的内容。 3.3.9显示文件类型file命令 file命令用来显示文件的类型,对于每个给定的参数,该命令试图将文件分类为文本文件、可执行文件、压缩文件或其他可理解的数据格式。 file magic: 显示文件类型,输出如下信息: magic: magic text file for file(1) cmd file b magic: 不显示文件名称,只显示文件类型,输出如下信息: magic text file for file(1) cmd file i magic: 显示文件magic信息,输出如下信息: magic: text/plain; charset=utf-8 file /bin/cp: 显示cp可执行文件信息,输出如下信息: /bin/cp: ELF 64bit LSB executable, AMD x86-64 r version 1 (SYSV) , for GNU/Linux 2.6.4, dynamically linked (uses shared libs), for GNU/Linux 2.6.4, stripped ln s /bin/cp: 创建软链接。 file cp: 显示链接文件cp信息,输出如下信息: cp: symbolic link to '/bin/cp ' file L cp: 显示链接指向的实际文件的相关信息,输出如下信息: cp: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.4, dynamically linked (uses shared libs), for GNU/Linux 2.6.4f stripped 3.3.10分割文件split命令 当处理文件时,有时需要将文件做分割处理,split命令即用于分割文件,可以分割文本文件,按指定的行数分割,每个分割后的文件都包含相同的行数。split可以分割非文本文件,分割时可以指定每个文件的大小,分割后的文件有相同的大小。有时需要将文件分割成更小的片段,比如为提高可读性、生成日志等。split后的文件可以使用cat命令组装在一起。 split yhy.txt: split默认按1000行分割文件。 split命令后可以跟如下选项。 b: 值为每个输出文件的大小,单位为B。 C: 每一输出文件中,单行的最大字节数。 d: 使用数字作为后缀。 l: 值为每个输出文件的列数大小。 dd if=/dev/zero bs=100k count=1 of=yhy.file: 生成一个大小为100KB的测试文件yhy.file。 split b 10k yhy.file: 使用split命令将上面创建的yhy.file文件分割成大小为10KB的小文件。 split b 10k yhy.file d a 3: 文件被分割成多个带有字母的后缀文件,如果想用数字后缀,可使用d参数,同时可以使用a length指定后缀的长度。 split b 10k yhy.file d a 3 split_file: 为分割后的文件指定文件名的前缀。 split l 10 yhy.file: 使用l选项根据文件的行数来分割文件,例如,把文件分割成每个包含10行的小文件。 当把一个大的文件分拆为多个小文件后,如何校验文件的完整性呢?一般通过MD5工具来校验对比。对应的Linux命令为md5sum(有关MD5的校验机制和原理请参考相关文档,本节不再赘述)。 3.3.11文本操作awk和sed命令 awk和sed为Linux系统中强大的文本处理工具,其使用方法比较简洁,而且处理效率非常高,下面具体看看awk和sed命令的使用方法。 awk命令用于Linux下的文本处理。数据可以来自文件或标准输入,支持正则表达式等功能,是Linux下强大的文本处理工具。 awk '{print $0}' /etc/passwd|head : 该命令输出如下内容。 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 当指定awk时,首先从给定的文件中读取内容,然后针对文件中的每一行执行print命令,并把输出发送至标准输出,如屏幕。在awk中,“{}”用于将代码分块。由于awk默认的分隔符为空格等空白字符,上述示例中的功能为将文件中的每行打印出来。 在修改文件时,如果不断地重复执行某些编辑动作,则可用sed命令完成。sed命令为Linux系统中将编辑工作自动化的编辑器,使用者无须直接编辑数据,是一种非交互式上下文编辑器,一般的Linux系统,本身即安装有sed工具。使用sed可以完成数据行的删除、更改、添加、插入、合并或交换等操作。同awk类似,sed命令可以通过命令行、管道或文件输入。 sed命令可以打印指定的行至标准输出或重定向至文件,打印指定的行可以使用“p”命令,可以打印指定的某一行或某个范围的行。 head 3 /etc/passwd | sed n 2p: 该命令输出如下内容。 bin:x:1:1:bin:/bin:/bin/bash head 3 /etc/passwd | sed n 2, 3p: 该命令输出如下内容。 bin:x:1:1:bin:/bin:/bin/bash daemon:x:2:2:Daemon:/sbin:/bin/bash 注意: “2p”表示只打印第2行,而2,3p表示打印范围。 3.4目录管理命令 目录是Linux的基本组成部分,目录管理包括目录的复制、删除、修改等操作,本节主要介绍Linux中目录管理相关的命令。 3.4.1显示当前工作目录pwd命令 pwd命令用于显示当前工作目录的完整路径。pwd命令使用比较简单,默认情况下不带任何参数,执行该命令显示当前路径。如果当前路径有软链接,显示链接路径而非实际路径,使用“P”参数可以显示当前路径的实际路径。 pwd: 默认显示链接路径。 pwd P: 显示实际路径。 3.4.2建立目录mkdir命令 mkdir命令用于创建指定的目录。创建目录时当前用户对需要操作的目录有读写权限。如目录已经存在,会提示报错并退出。mkdir可以创建多级目录。 注意: 创建目录时目的路径不能存在重名的目录或文件。使用p参数可以一次创建多个目录,并且创建多级目录,而不需要多级目录中每个目录都存在。 mkdir soft: 创建soft目录,如果目录已经存在,提示: mkdir: cannot create directory 'soft'; File exists错误信息并退出。 mkdir p soft: 使用p参数可以创建存在或不存在的目录。 mkdir m775 apache: 指定新创建目录的权限。 mkdir p /data/(yhy1,yhy2)或mkdir p /data/yhy3 /data/yhy4: 一次创建多个目录。 注意: 无写权限则不能创建目录,虽然没有权限写入,但由于目录存在,并不会提示任何信息。 3.4.3删除目录rmdir命令 rmdir命令用来删除空目录。当目录不再被使用时,或者磁盘空间已达到使用限定值,就需要删除失去使用价值的目录。利用rmdir命令可以从一个目录中删除一个或多个空的子目录。删除目录时,必须具有对其父目录的写权限。 rmdir p bin/os_1: 删除子目录os_1和其父目录bin。 注意: 子目录被删除之前应该是空目录。也就是说,该目录中的所有文件必须用rm命令全部删除,另外,当前工作目录必须在被删除目录之上,不能是被删除目录本身,也不能是被删除目录的子目录。 虽然还可以用带有r选项的rm命令递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性。 注意: 当使用“p”参数时,如目录中存在空目录和文件,则空目录会被删除,上一级目录不能删除。 3.4.4查看目录树tree命令 使用tree命令可以以树状图递归的形式显示各级目录,方便地看到目录结构。 tree: 以树状图递归的形式显示各级目录。 tree f: 在每个文件或目录之前,显示完整的相对路径名称。 3.4.5打包或解包文件tar命令 tar命令用于将文件打包或解包,扩展名一般为“.tar”,指定特定参数可以调用gzip或bzip2制作压缩包或解开压缩包,扩展名为“tar.gz”或“.tar.bz2”。tar命令相关的包一般使用.tar作为文件名标识。如果加z参数,则以.tax.gz或.tgz来代表gzip压缩过的tar。 tar cvf/tmp/etc. tar/etc: 仅打包,不压缩。 tar zcvf/tmp/etc. tar .gz /etc: 打包并使用gzip压缩。 tar jcvf/tmp/etc. tar .bz2/etc: 打包并使用bzip2压缩。 tar ztvf/tmp/etc. tar.gz: 查看压缩包文件列表。 cd/data: 切换目录。 tar zxvf/tmp/etc.tar.gz: 解压压缩包至当前路径。 tar zxvf/tmp/etc.tar.gzetc/passwd: 只解压指定文件。 tar zxvpf/tmp/etc.tar.gz/etc: 建立压缩包时保留文件属性。 tar exclude /home/*log zxvpf/tmp/etc.tar.gz/data/soft: 排除某些文件。 3.4.6压缩或解压缩文件和目录zip/unzip命令 zip是Linux系统下广泛使用的压缩程序,文件压缩后扩展名为“.zip”。 zip命令的基本用法是: zip [参数][打包后的文件名][打包的目录路径]。路径可以是相对路径,也可以是绝对路径。 zip r myfile.zip ./* : 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,r表示递归压缩子目录下所有文件。 unzip o d /home/yhy myfile.zip: 把myfile.zip文件解压到/home/yhy/下, o参数表示在不提示的情况下覆盖文件 ; d选项指明将文件解压缩到/home/yhy目录下。 zip d myfile.zip yhy.txt: 删除压缩文件中的yhy.txt文件。 zip m myfile.zip ./yhy.txt: 向压缩文件myfile.zip中添加yhy.txt文件。 zip q r html.zip /home/Blinux/html: 将/home/Blinux/html/这个目录下所有文件和文件夹打包为当前目录下的html.zip。 上面的命令操作是将绝对地址的文件及文件夹进行压缩,以下给出压缩相对路径目录,例如目前在Blinux这个目录下,执行以下操作可以达到以上同样的效果。 zip -q -r html.zip html unzip命令用于解压缩由zip命令压缩的“.zip”压缩包。 unzip test.zip: 将压缩文件text.zip在当前目录下解压缩。 unzip n test.zip d /tmp: 将压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原文件。 unzip v test.zip或zcattest.zip: 查看压缩文件目录,但不解压。 unzip o test.zip d tmp/: 将压缩文件test.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原文件。 3.4.7压缩或解压缩文件和目录gzip/gunzip命令 和zip命令类似,gzip用于文件的压缩,gzip压缩后的文件扩展名为“.gz”,gzip默认压缩后会删除原文件。gunzip用于解压经过gzip压缩过的文件。事实上,gunzip就是gzip的硬链接,因此不论是压缩或解压缩,都可通过gzip指令单独完成。 gzip *: 把当前目录下的每个文件压缩成.gz文件。 gzip dv *: 把每个压缩的文件解压,并列出详细的信息。 gzip l *: 详细显示每个压缩文件的信息,并不解压。 gzip r log.tar: 压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz。 gzip rv test: 递归地压缩目录test,这样,所有test下面的文件都变成了*.gz,目录依然存在,只是目录里面的文件相应变成了*.gz。这就是压缩和打包的不同。因为是对目录操作,所以需要加上r选项,这样也可以对子目录进行递归了。 gzip dr test: 递归地解压目录。 zip r /opt/etc.zip /etc: 将/etc目录下的所有文件以及子目录进行压缩,备份压缩包etc.zip到/opt目录。 gzip 9v /opt/etc.zip: 对etc.zip文件进行gzip压缩,设置gzip的压缩级别为9。此命令将会生成etc.zip.gz的压缩文件。 gzip l /opt/etc.zip.gz: 查看上述etc.zip.gz文件的压缩信息。 gzip d /opt/etc.zip.gz或gunzip /opt/etc.zip.gz: 解压etc.zip.gz文件到当前目录。gzip d命令等价于gunzip命令。 3.4.8压缩或解压缩文件和目录bzip2/bunzip2命令 bzip2是一个基于BurrowsWheeler变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法好。它是一款免费软件,可以自由分发免费使用。它广泛存在于UNIX和Linux的许多发行版本中。bzip2能够进行高质量的数据压缩,它利用先进的压缩技术,能够把普通的数据文件压缩10%~15%,压缩的速度和解压的效率都非常高。它支持现在大多数压缩格式,包括tar、gzip文件。如果没有加上任何参数,bzip2压缩完文件后会产生.bz2的压缩文件,并删除原始的文件。 bunzip2是bzip2的一个软链接,但bunzip2和bzip2的功能却正好相反。bzip2是用来压缩文件的,而bunzip2是用来解压文件的,相当于bzip2 d,类似地有zip和unzip、gzip和gunzip、compress和uncompress。 gzip、bzip2一次只能压缩一个文件,如果要同时压缩多个文件,则需将其打个tar包,然后压缩,即tar.gz、tar.bz2。Linux系统中bzip2也可以与tar一起使用。bzip2可以压缩文件,也可以解压文件,解压也可以使用另外一个命令bunzip2。bzip2的命令行标志大部分与gzip相同,所以从tar文件解压bzip2压缩的文件方法如下所示。 bzip2 file_test: 压缩指定文件,压缩后原文件会被删除。 tar jcvftest.tar.bz2file1file2l.txt: 多个文件压缩并打包。 bzcattest.tar.bz2: 查看bzip压缩过的文件内容。 bzip2 d k shell.txt.bz2: 使用d参数压缩,k参数保留原文件。 bzip2包含的参数选项如下。 f或force: 解压缩时,若输出的文件与现有文件同名时,默认不会覆盖现有的文件。 k或keep: 在解压缩后,默认会删除原来的压缩文件。若要保留压缩文件,请使用此参数。 s或small: 降低程序执行时,内存的使用量。 v或verbose: 解压缩文件时,显示详细的信息。 l或license,V或version: 显示版本信息。 3.5系统管理命令 如何查看系统帮助?历史命令如何查看?日常使用中有一些命令可以提高Linux系统的使用效率,本节主要介绍系统管理相关的命令。 3.5.1查看命令帮助man命令 man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。 man man: 显示man命令的帮助信息。 输入“man ls”,会在最左上角显示“LS(1)”,其中,“LS”表示手册名称,而“(1)”表示该手册位于第1节 。同样地,输入“man ifconfig”,会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令“man [章节号]手册名称”。 3.5.2查看历史记录history命令 当使用终端命令行输入并执行命令时,Linux会自动把命令记录到历史列表中,一般保存在用户HOME目录下的.bash_history文件中。默认保存1000条,这个值可以更改。如果不需要査看历史命令中的所有项目,history可以只查看最近n条命令列表。history命令不仅可以查询历史命令,而且有相关的功能执行命令。 系统安装完毕,执行history命令并不会记录历史命令的时间,通过特定的设置可以记录命令的执行时间。使用上下方向键可以方便地看到执行的历史命令,使用Ctrl+R组合键可对命令历史进行搜索,对于想要重复执行某个命令的时候非常有用。当找到命令后,通常再按Enter键就可以执行该命令。如果想对找到的命令进行调整后再执行,则可以按左或右方向键。使用感叹号“!”可以方便地执行历史命令。 !2: 执行history显示的第2条命令。 !up: 执行最近一条以up开头的命令。 historyc: 清除已有的历史命令,使用c选项。 3.5.3显示或修改系统时间与日期date命令 date命令的功能是显示或设置系统的日期和时间。 注意: 只有ROOT用户才能用date命令设置时间,一般用户只能用date命令显示时间。另外,一些环境变量会影响到date命令的执行效果。 date: 显示系统当前时间,输出结果类似“Wed May 1 12:31:35 CST 2018”。CST表示中国标准时间,UTC表示世界标准时间,中国标准时间与世界标准时间的时差为+8,也就是UTC+8。另外,GMT表示格林尼治标准时间。 date +%Y%m%d " " %H: %M: %S: 按指定格式显示系统时间,输出结果类似“20180501 12:31:36”。 date s 20180530: 设置系统日期,只有ROOT用户才能查看。 date s 12:31:34: 设置系统时间。 date +%Y%m%d" " %H:%M:%Sd"10 days ago": 显示10天之前的日期。 当以ROOT身份更改了系统时间之后,还需要通过“clock w”命令将系统时间写入CMOS中,这样下次重新开机时系统时间才会使用最新的值。date参数丰富,其他参数用法可上机实践。 3.5.4清除屏幕clear命令 clear命令用于清空终端屏幕,类似DOS下的cls命令,使用方法比较简单,如要清除当前屏幕内容,直接 输入“clear”即可,或按Ctrl+L组合键。 如果终端有乱码,clear不能恢复时可以使用reset命令使屏幕恢复正常。 3.5.5查看系统负载uptime命令 Linux系统中的uptime命令主要用于获取主机运行时间和查询Linux系统负载等信息。uptime命令可以显示系统已经运行了多长时间,信息显示依次为: 现在时间,系统已经运行了多长时间,目前有多少登录用户,系统在过去的1min、5min和15min内的平均负载。uptime命令用法十分简单,直接输入uptime即可。 输入uptime命令后显示如下内容。 07:30:09up9:15,3 users, load average: 0.00, 0.00, 0.00 07:30:09表示系统当前时间。up 9:15表示主机已运行时间,时间越大,说明机器越稳定。3 users表示用户连接数,是总连接数而不是用户数。load average表示系统平均负载,统计最近1min、5min、15min的系统平均负载。系统平均负载是指在特定时间间隔内运行队列中的平均进程数。对于单核CPU,负载小于3表示当前系统性能良好; 3~10表示需要关注,系统负载可能过大,需要做对应的优化; 大于10表示系统性能有严重问题。另外,15min系统负载需重点参考并作为当前系统运行情况的负载依据。 3.5.6显示系统内存状态free命令 free命令会显示内存的使用情况,包括实体内存、虚拟的交换文件内存、共享内存区段,以及系统核心使用的缓冲区等。 free m: 以MB为单位査看系统内存资源占用情况,输出信息如图35所示。 图35以MB为单位査看系统内存资源占用情况 Mem: 表示物理内存统计,此示例中有3773MB。 -/+ buffers/cached: 表示物理内存的缓存统计。 Swap: 表示硬盘上交换分区的使用情况,如剩余空间较小,需要留意当前系统内存使用情况及负载。 第1行数据3773表示物理内存总量,856表示总计分配给缓存(包含buffers与cache)使用的数量,但其中可能部分缓存并未实际使用,2302表示未被分配的内存。shared为14,表示共享内存。613表示系统分配但未被使用的buffers数量,2610表示系统分配但未被使用的cache数量。 以上示例显示系统总内存为3774MB,如需计算应用程序占用内存比率可以使用以下公式计算 (totalfreebuff)/cache,37742302613=859,内存使用百分比为859/3774×100%=22%,表示系统内存资源能满足应用程序需求。如应用程序占用内存量超过80%,则应该及时进行应用程序算法优化。 3.5.7转换或复制文件dd命令 dd命令可以用指定大小的块复制一个文件,并在复制的同时进行指定的转换。参数使用时可以和b/c/k组合使用。 注意: 指定数字的地方若以下列字符结尾则乘以相应的数字: b=512; c=l; k=1024; w=2。 /dev/null,可以向它写入任何数据,而写入的数据都会丢失。/dev/zero是一个输入设备,可用来初始化文件,该设备无穷尽地提供。 dd if=/dev/zero of=/file bs=lM count=100: 创建一大小为100MB的文件。 ls lh /file: 査看文件大小。 dd if=/dev/hdb of=/dev/hdd: 将本地的/dev/hdb整盘备份到/dev/hdd。 dd if=/dev/hdb of=/root/Image: 将dev/hdb全盘数据备份到指定路径的image文件。 dd if=/root/image of =/dev/hdb: 将备份文件恢复到指定盘。 dd if=/dev/hdb | gzip > /root/image.gz: 备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径。 gzip dc /root/image.gz | dd of=/dev/hdb: 将压缩的备份文件恢复到指定盘。 ddif=/dev/urandomof=/dev/hdal: 销毁磁盘数据。 下面来看一个增加swap分区文件大小的案例,具体步骤如下。 第1步: dd if=/dev/zero of=/swapfile bs=1024count=262144创建一个大小为256MB的文件。 第2步: mkswap/swapfile把这个文件变成swap文件。 第3步: swapon/swapfile启用这个swap文件。 第4步: echo "swapfileswapswapdefault00">>/etc/fstab编辑/etc/fstab文件,使在每次开机时自动加载swap文件,在该文件最下面输入“swapfileswapswapdefault00”。 3.5.8查看网卡状态ifconfig命令 ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig [网络设备] [参数]”。 使用ifconfig命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet参数后面的IP地址、ether参数后面的网卡物理地址(又称为MAC地址),以及RX、TX的接收数据包与发送数据包的个数及累计流量,如图36所示。 图36获取网卡配置与网络状态等信息 3.6任务管理命令 在Windows系统中,Windows提供了计划任务,功能就是安排自动运行的任务。Linux提供了对应的命令完成任务管理。 3.6.1单次任务at at可以设置在一个指定的时间执行一个指定任务,只能执行一次,使用前应确认系统开启了atd进程。如果指定的时间已经过去则会放在第2天执行。 明天17点钟,输出时间到指定文件内的命令为“at 17:20 tomorrow”,进入交互式情景,输入如下内容。 at> date >/root/2018.log at> 不过,并不是所有用户都可以进行at计划任务。可以利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制。系统首先査找/etc/at.allow这个文件,写在这个文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at。如果/etc/at.allow不存在,就寻找/etc/at.deny这个文件,若写在at.deny中的使用者则不能使用at,而没有在这个at.deny文件中的使用者就可以使用at命令了。 3.6.2周期任务crond crond是Linux下用来周期性地执行某种任务或等待处理某些事件的命令,如进程监控、日志处理等,和Windows下的计划任务类似。当安装操作系统时默认会安装此服务工具,并且会自动启动crond进程。crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。crond的最小调度单位为分钟。 Linux下的任务调度分为两类: 系统任务调度和用户任务调度。 (1) 系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab文件包括如图37所示几行内容。 图37/etc/crontab文件内容 前4行是用来配置crond任务运行的环境变量,第1行SHELL变量指定了系统要使用哪个Shell,这里是bash; 第2行PATH变量指定了系统执行命令的路径; 第3行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给ROOT用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户; 第4行的HOME变量指定了在执行命令或脚本时使用的主目录。 (2) 用户任务调度: 用户定期要执行的工作,如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致。 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为6个字段,前5段是时间设定段,第6段是要执行的命令段,格式如下: minute hour day month week command。具体说明如表33所示。 表33crontab任务设置对应参数说明 参数说明 minute表示分钟,可以是0~59的任何整数 hour表示小时,可以是0~23的任何整数 day表示日期,可以是1~31的任何整数 month表示月份,可以是1~12的任何整数 week表示星期几,可以是0~7的任何整数,这里的0或7代表星期日 command要执行的命令,可以是系统命令,也可以是自己编写的脚本文件 crond命令常用参数如表34所示。 表34crond命令常用参数说明 参数说明 e执行文字编辑器来编辑任务列表,内定的文字编辑器是VI r删除目前的任务列表 1列出目前的任务列表 crontab的一些使用方法如下所示。 07***/bin/ls: 每月每天每小时的第0分钟执行一次/bin/ls。 0 612/3 * 12 * /usr/bin/backup: 在12个月内,每天的早上6点到12点中,每隔20分钟执行一次/usr/bin/backup。 0* /2***/sbin/service httpd restart: 每2小时重启一次Apache服务。 3.7管道符、重定向与环境变量 本节首先讲解与文件读写操作有关的重定向技术的5种模式——标准覆盖输出重定向,标准追加输出重定向,错误覆盖输出重定向,错误追加输出重定向以及输入重定向。帮助读者通过实验切实理解每个重定向模式的作用,解决输出信息的保存问题。然后深入讲解管道命令符,帮助读者掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率。随后通过讲解Linux系统命令行中的通配符和常见转义符,让读者输入的Linux命令具有更准确的意义,为第4章编写Shell脚本做准备。最后 介绍用Bash解释器执行Linux命令的内部原理,为掌握PATH变量及Linux系统中的重要环境变量打下基础。 3.7.1输入输出重定向 前面章节中介绍了基础且常用的Linux命令,接下来将介绍把多个Linux命令适当地组合到一起,使其协同工作,以便更加高效地处理数据。要做到这一点,就必须理解命令的输入重定向和输出重定向的原理。 简而言之,输入重定向是指把文件导入命令中,而输出重定向则是指把原本要输出到屏幕的数据信息写入指定文件中。在日常的学习和工作中,相较于输入重定向,使用输出重定向的频率更高,所以又将输出重定向分为标准输出重定向和错误输出重定向两种不同的技术,以及清空写入与追加写入两种模式。 (1) 标准输入重定向(STDIN,文件描述符为0): 默认从键盘输入,也可从其他文件或命令中输入。 (2) 标准输出重定向(STDOUT,文件描述符为1): 默认输出到屏幕。 (3) 错误输出重定向(STDERR,文件描述符为2): 默认输出到屏幕。 如分别查看两个文件的属性信息,其中第二个文件是不存在的,虽然针对这两个文件的操作都分别会在屏幕上输出一些数据信息,但这两个操作的差异其实很大。 【touch linux-yhy】 【ls -l linux-yhy】 -rw-r--r--. 1 root root 0 6月 4 04:14 linux-yhy 【ls -l yhy】 ls: 无法访问yhy: 没有那个文件或目录 在上述命令中,名为linuxyhy的文件是存在的,输出信息是该文件的一些相关权限、所有者、所属组、文件大小及修改时间等信息,这也是该命令的标准输出信息。而名为yhy的第二个文件是不存在的,因此在执行完ls命令之后显示的报错提示信息也是该命令的错误输出信息。那么,要想把原本输出到屏幕上的数据写入文件当中,就要区别对待这两种输出信息。 对于输入重定向来讲,用到的符号及其作用如表35所示。 表35输入重定向中用到的符号及其作用 符号作用 命令<文件将文件作为命令的标准输入 命令<<分界符从标准输入中读取,直到遇见分界符才停止 命令<文件1 >文件2将文件1作为命令的标准输入并将其输出到文件2中 对于输出重定向来讲,用到的符号及其作用如表36所示。 表36输出重定向中用到的符号及其作用 符号作用 命令>文件将标准输出重定向到一个文件中(清空原有文件的数据) 命令2>文件将错误输出重定向到一个文件中(清空原有文件的数据) 命令>>文件将标准输出重定向到一个文件中(追加到原有内容的后面) 命令2>>文件将错误输出重定向到一个文件中(追加到原有内容的后面) 命令>>文件2>&1 或 命令&>>文件将标准输出与错误输出共同写入文件中(追加到原有内容的后面) 对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。下面通过标准输出重定向将man bash命令原本要输出到屏幕的信息写入文件readme.txt中,然后显示readme.txt文件中的内容。具体命令如下 。 【man bash > readme.txt】 【cat readme.txt】 接下来尝试输出重定向技术中的覆盖写入与追加写入这两种不同模式带来的变化。首先通过覆盖写入模式向readme.txt文件写入一行数据(该文件中包含上一个实验中的man命令信息),然后再通过追加写入模式向文件再写入一次数据,其命令如下。 【echo "Welcome to linux-yhy.com" > readme.txt】 【echo "Quality linux learning materials" >> readme.txt】 在执行cat命令之后,可以看到如下所示的文件内容。 【cat readme.txt】 Welcome to linux-yhy.com Quality linux learning materials 虽然都是输出重定向技术,但是不同命令的标准输出和错误输出还是有区别的。例如,查看当前目录中某个文件的信息,这里以linuxyhy文件为例。因为这个文件是真实存在的,因此使用标准输出即可将原本要输出到屏幕的信息写入文件中,而错误的输出重定向则依然把信息输出到了屏幕上。 【ls -l linux-yhy】 -rw-r--r--. 1 root root 0 6月 4 04:14 linux-yhy 【ls -l linux-yhy > /root/stderr.txt】 【ls -l linux-yhy 2> /root/stderr.txt】 -rw-r--r--. 1 root root 0 6月 4 04:14 linux-yhy 如果想把命令的报错信息写入文件,该怎么操作呢?当用户在执行一个自动化的Shell脚本时,这个操作会特别有用,而且特别实用,因为它可以把整个脚本执行过程中的报错信息都记录到文件中,便于安装后的排错工作。接下来以一个不存在的文件进行实验演示。 【ls -l yhy】 ls: 无法访问yhy: 没有那个文件或目录 【ls -l yhy > /root/stderr.txt】 ls: 无法访问yhy: 没有那个文件或目录 【ls -l yhy 2> /root/stderr.txt】 【cat /root/stderr.txt】 ls: 无法访问yhy: 没有那个文件或目录 输入重定向相对来说有些冷门,在工作中遇到的概率会小一点。输入重定向的作用是把文件直接导入命令中。接下来使用输入重定向把readme.txt文件导入wc l命令,统计一下文件中的内容行数。 【wc -l < readme.txt】 3493 注: 上述命令实际上等同于接下来要学习的cat readme.txt | wc l的管道符命令组合。 3.7.2管道命令符 前面章节中学习命令时曾经见到过一个名为管道符的东西。按Shift+|组合键即可输入管道符,其执行格式为“命令A |命令B”。管道命令符的作用也可以用一句话来概括: “把前一个命令原本要输出到屏幕的标准正常数据当作后一个命令的标准输入”。在3.3.6节讲解grep文本搜索命令时,通过匹配关键词/sbin/nologin找出了所有被限制登录系统的用户。在学完本节内容后,完全可以把下面这两条命令合并为一条。 (1) 找出被限制登录用户的命令是grep "/sbin/nologin" /etc/passwd; (2) 统计文本行数的命令则是wc l。 现在要做的就是把搜索命令的输出值传递给统计命令,即把原本要输出到屏幕的用户信息列表再交给wc命令做进一步的加工,因此只需要把管道符放到两条命令之间即可,具体如下。 【grep "/sbin/nologin" /etc/passwd | wc -l】 37 这个管道符就像一个法宝,可以将它套用到其他不同的命令上,例如用翻页的形式查看/etc目录中的文件列表及属性信息。 【ls -l /etc/ | more】 在修改用户密码时,通常都需要输入两次密码以进行确认,这在编写自动化脚本时将成为一个非常致命的缺陷。通过把管道符和passwd命令的stdin参数相结合,可以用一条命令完成密码重置操作。 【echo "linux-yhy" | passwd --stdin root】 管道符的用法还有很多,例如,在发送电子邮件时,默认采用交互式的方式来进行,完全可以利用一条结合了管道符的命令语句,把编辑好的内容与标题一起“打包”,最终用这一条命令实现邮件的发送,如图38所示。 【echo "Content" | mail -s "Subject" linux-yhy】 【su - linux-yhy】 【mail】 图38邮件的发送命令 通过重定向技术还能够一次性地把多行信息打包输入或输出,让日常工作更加高效。 下面这条命令结合使用了mail邮件命令与输入重定向的分界符,其目的是让用户一直输入内容,直到用户输入了其自定义的分界符时,才结束输入。 【mail -s "Readme" root@linux-yhy.com << over】 > I think linux is very practical > I hope to learn more > can you teach me ? > over 当然,读者千万不要误以为管道命令符只能在一个命令组合中使用一次,完全可以这样使用: “命令A |命令B |命令C”。组合使用可以完成之前不敢想象的复杂工作。 3.7.3命令行的通配符 顾名思义,通配符就是通用的匹配信息的符号,比如星号(*)代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[09]代表匹配0~9的单个数字的字符,而中括号内加上字母[abc]则是代表匹配a、b、c三个字符中的任意一个字符。下面匹配所有在/dev目录中且以sda开头的文件。 【ls -l /dev/sda*】 brw-rw----. 1 root disk 8, 0 6月 4 04:00 /dev/sda brw-rw----. 1 root disk 8, 1 6月 4 04:00 /dev/sda1 brw-rw----. 1 root disk 8, 2 6月 4 04:00 /dev/sda2 如果只想查看文件名以sda开头,但是后面还紧跟其他某一个字符的文件的相关信息,该怎么操作呢?这时就需要用问号来进行通配了。 【ls -l /dev/sda?】 brw-rw----. 1 root disk 8, 1 6月 4 04:00 /dev/sda1 brw-rw----. 1 root disk 8, 2 6月 4 04:00 /dev/sda2 除了使用[09]来匹配0~9的单个数字,也可以用[135]这样的方式仅匹配这三个指定数字中的一个,若没有匹配到,则不会显示出来。 【ls -l /dev/sda[0-9]】 brw-rw----. 1 root disk 8, 1 6月 4 04:00 /dev/sda1 brw-rw----. 1 root disk 8, 2 6月 4 04:00 /dev/sda2 【ls -l /dev/sda[135]】 brw-rw----. 1 root disk 8, 1 6月 4 04:00 /dev/sda1 3.7.4常用的转义字符 为了能够更好地理解用户的表达,Shell解释器还提供了特别丰富的转义字符来处理输入的特殊数据。最常用的转义字符如下所示。 (1) 反斜杠(\): 使反斜杠后面的一个变量变为单纯的字符串。 (2) 单引号(''): 转义其中所有的变量为单纯的字符串。 (3) 双引号(""): 保留其中的变量属性,不进行转义处理。 (4) 反引号(` `): 把其中的命令执行后返回结果。 先定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息。 【PRICE=5】 【echo "Price is $PRICE"】 Price is 5 接下来,希望能够输出“Price is $5”,即价格是5美元的字符串内容,但碰巧美元符号与变量提取符号合并后的$$作用是显示当前程序的进程ID号码,于是命令执行后输出的内容并不是所预期的。 【echo "Price is $$PRICE"】 Price is 3767PRICE 要想让第一个“$”作为美元符号,就需要使用反斜杠(\)进行转义,将这个命令提取符转义成单纯的文本,去除其特殊功能。 【echo "Price is \$$PRICE"】 Price is $5 而如果只需要某个命令的输出值时,可以像'命令'这样,将命令用反引号括起来,达到预期的效果。例如,将反引号与uname a命令结合,然后使用echo命令来查看本机的Linux版本和内核信息,如图39所示。 【echo 'uname -a'】 图39查看本机的Linux版本和内核信息 3.7.5重要的环境变量 变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。可以直接通过变量名称提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数, 如每个用户不同的HOME目录、邮件存放位置等。 前文中曾经讲到,在Linux系统中一切都是文件,Linux命令也不例外。那么,在用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?简单来说,命令在Linux中的执行分为以下4个步骤。 第1步: 判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是则直接执行。 第2步: Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用alias命令来创建一个属于自己的命令别名,格式为“alias别名=命令”。若要取消一个命令别名,则使用unalias命令,格式为“unalias别名”。之前在使用rm命令删除文件时,Linux系统都会要求再确认是否执行删除操作,其实这就是Linux系统为了防止用户误删除文件而特意设置的rm别名命令,接下来把它取消掉。 【ls】 anaconda-ks.cfg公共视频文档音乐 initial-setup-ks.cfg模板图片下载桌面 【rm anaconda-ks.cfg】 【rm anaconda-ks.cfg】 rm: 是否删除普通文件 "anaconda-ks.cfg"?y 【alias rm】 alias rm='rm -i' 【unalias rm】 【rm initial-setup-ks.cfg】 第3步: Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行; 而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4继续处理。可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。 第4步: 系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是“解释器的小助手”,作用是告诉Bash解释器待执行的命令可能存放的位置,然后Bash解释器就会乖乖地在这些位置中逐个查找。PATH是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。 【echo $PATH】 /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin 【PATH=$PATH:/root/bin】 【echo $PATH】 /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin 这里有比较经典的问题: “为什么不能将当前目录(.)添加到PATH中呢? ”原因是,尽管可以将当前目录(.)添加到PATH变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp中存放了一个与ls或cd命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。 所以,作为一名态度谨慎、有经验的运维人员,在接手了一台Linux系统后一定会在执行命令前先检查PATH变量中是否有可疑的目录。另外,读者从前面的PATH变量示例中是否也感觉到环境变量特别有用呢?可以使用env命令来查看到Linux系统中所有的环境变量。下面是最重要的10个环境变量,如表37所示。 表37Linux系统中最重要的10个环境变量 变 量 名 称作用 HOME用户的主目录(即家目录) SHELL用户在使用的Shell解释器名称 HISTSIZE输出的历史命令记录条数 HISTFILESIZE保存的历史命令记录条数 MAIL邮件保存路径 LANG系统语言、语系名称 RANDOM生成一个随机数字 PS1Bash解释器的提示符 PATH定义解释器搜索用户执行命令的路径 EDITOR用户默认的文本编辑器 Linux作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。例如,使用下述命令来查看HOME变量在不同用户身份下都有哪些值(su是用于切换用户身份的命令,将在后面章节中介绍)。 【echo $HOME】 /root 【su - linux-yhy】 【echo $HOME】 /home/linux-yhy 其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,完全可以自行创建变量,来满足工作需求。例如,设置一个名称为WORKDIR的变量,方便用户更轻松地进入一个层次较深的目录。 【mkdir /home/workdir】 【WORKDIR=/home/workdir】 【cd $WORKDIR】 【pwd】 /home/workdir 但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用export命令将其提升为全局变量,这样其他用户也可以使用它了。 【su linux-yhy】 【cd $WORKDIR】 【echo $WORKDIR】 【exit】 【export WORKDIR】 【su linux-yhy】 【cd $WORKDIR】 【pwd】 /home/workdir 习题 一、 选择题 1. 使用()命令可以把两个文件合并成一个文件。 A. catB. grepC. awkD. cut 2. 用lsal命令列出下面的文件列表,()文件是软链接文件。 A. rwrwrw 2 hels users 56 sep 09 11:05 hello B. rwxrwxrwx 2 hels users 56 sep 09 11:05 goodbye C. Drwxrr 2 hel users 1024 sep 10 08:10 zhang D. Lrwxrr 1 hel users 2024 sep 12 08:12 cheng 3. 对于命令: $cat name test1 test2>name,说法正确的是()。 A. 将test1 test2合并到name B. 命令错误,不能将输出重定向到输入文件中 C. 当name文件为空的时候命令正确 D. 命令错误,应该为$cat name test1 test2>>name 4. 以下命令中,不能用来查看文本文件内容的命令是()。 A. lessB. catC. tailD. ls 5. 在Linux系统中,系统管理员(ROOT)状态下的提示符是()。 A. $B. #C. %D. > 6. 删除文件的命令是()。 A. mkdirB. rmdirC. mvD. rm 7. 建立一个新文件可以使用的命令为()。 A. chmodB. moreC. cpD. touch 8. tar命令可以进行文件的()。 A. 压缩、归档和解压缩B. 压缩和解压缩 C. 压缩和归档D. 归档和解压缩 9. 若要将当前目录中的myfile.txt文件压缩成myfile.txt.tar.gz,则实现的命令为()。 A. tarcvf myfile.txt myfile.txt.tar.gz B. tarzcvf myfile.txt myfile.txt.tar.gz C. tarzcvf myfile.txt.tar.gz myfile.txt D. Tar cvf myfile.txt.tar.gz.myfile.txt 10. 在Linux系统中,主机名保存在()配置文件中。 A. /etc/hosts B. /etc/modules.conf C. /etc/sysconfig/networkD. /etc/network 11. Linux系统中的第二块以太网卡的配置文件全路径名是()。 A. /etc/sysconfig/network/ifcfgeth0 B. /etc/sysconfig/network/ifcfgeth1 C. /etc/sysconfig/networkscripts/ifcfgeth0 D. /etc/sysconfig/networkscripts/ifcfgeth1 12. 在 Linux系统中,用于设置DNS客户的配置文件是()。 A. /etc/hostsB. /etc/resolv.conf C. /etc/dns.confD. /etc.nis.conf 13. 在使用mkdir命令创建新的目录时,在其父目录不存在时先创建父目录的选项是()。 A. mB. dC. fD. p 14. Linux系统中有三个查看文件的命令,若希望在查看文件内容过程中可以用光标上下移动来查看文件内容,应使用()命令。 A. catB. moreC. lessD. menu 15. 终止一个前台进程可能用到的命令和操作是()。 A. killB. Ctrl+CC. shut downD. halt 二、 填空题 1. 把ls命令的正常输出信息追加写入error.txt文件中的命令是()。 2. Bash解释器的通配符中,星号(*)代表几个字符?() 3. 请尝试使用Linux系统命令关闭PID为5529的服务进程。() 4. 在Linux系统中,以()方式访问设备。 5. 某文件的权限为drwrr,用数值形式表示该权限,则该八进制数为(),该文件属性是()。 6. 在CentOS 7系统及众多的Linux系统中,最常使用的Shell终端是()解释器。 7. 若有一个名为backup.tar.gz的压缩包文件,那么解压缩的命令应该是()。 三、 简答题 1. 使用uptime命令查看系统负载时,对应的负载数值如果是0.91、0.56、0.32,那么最近15min内负载压力最大的是哪个时间段? 2. 使用history命令查看历史命令的执行记录时,命令前面的数字除了排序外还有什么用处? 3. 若想查看的文件具有较长的内容,那么使用cat、more、head、tail中的哪个命令最合适? 4. 使用grep命令对某个文件进行关键词搜索时,若想要进行文件内容反选,应使用什么参数?