ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux150个常用命令

2019-12-23 16:03:00  阅读:230  来源: 互联网

标签:文件 指定 目录 命令 常用命令 Linux150 root CPU


线上查询及帮助命令(1个)

help

==help命令用于显示shell内部命令的帮助信息。help命令只能显示shell内部的命令帮助信息。而对于外部命令的帮助信息只能使用man或者info命令查看。==

  • 语法
help(选项)(参数)
  • 选项
-s:输出短格式的帮助信息。仅包括命令格式。
  • 参数
内部命令:指定需要显示帮助信息的shell内部命令。
  • 实例
使用help命令显示shell内部shopt命令的帮助信息,输入如下命令:

help shopt                #获取shopt命令的帮助信息
shopt: shopt [-pqsu] [-o long-option] optname [optname...]
    Toggle the values of variables controlling optional behavior.
    The -s flag means to enable (set) each OPTNAME; the -u flag
    unsets each OPTNAME.  The -q flag suppresses output; the exit
    status indicates whether each OPTNAME is set or unset.  The -o
    option restricts the OPTNAMEs to those defined for use with
    `set -o'.  With no options, or with the -p option, a list of all
    settable options is displayed, with an indication of whether or
    not each is set.

文件和目录操作命令(12个)

ls

==ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。==

  • 语法
ls(选项)(参数)
  • 选项
ls -lrt: 找出最新的文件
-h:以K,M等单位显示大小,而不是默认字节
-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-t:用文件和目录的更改时间排序;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--full-time:列出完整的日期与时间;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。

tree

==tree命令以树状图列出目录的内容。==

  • 语法
tree(选项)(参数)
  • 选项
-a:显示所有文件和目录;
-A:使用ASNI绘图字符显示树状图而非以ASCII字符组合;
-C:在文件和目录清单加上色彩,便于区分各种类型;
-d:先是目录名称而非内容;
-D:列出文件或目录的更改时间;
-f:在每个文件或目录之前,显示完整的相对路径名称;
-F:在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","@","|"号;
-g:列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码;
-i:不以阶梯状列出文件和目录名称;
-l:<范本样式> 不显示符号范本样式的文件或目录名称;
-l:如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录;
-n:不在文件和目录清单加上色彩;
-N:直接列出文件和目录名称,包括控制字符;
-p:列出权限标示;
-P:<范本样式> 只显示符合范本样式的文件和目录名称;
-q:用“?”号取代控制字符,列出文件和目录名称;
-s:列出文件和目录大小;
-t:用文件和目录的更改时间排序;
-u:列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码;
-x:将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该目录予以排除在寻找范围外。
  • 参数
目录:执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。

pwd

==pwd命令以绝对路径的方式显示用户当前工作目录。命令将当前目录的全路径名称(从根目录)写入标准输出。全部目录使用/分隔。第一个/表示根目录,最后一个目录是当前目录。执行pwd命令可立刻得知您目前所在的工作目录的绝对路径名称。==

  • 语法
pwd(选项)
  • 选项
--help:显示帮助信息;
--version:显示版本信息。
  • 实例
[root@localhost ~]# pwd
/root

mkdir

==mkdir命令用来创建目录==

  • 语法
mkdir (选项)(参数)
  • 选项
-Z:设置安全上下文,当使用SELinux时有效;
-m<目标属性>或--mode<目标属性>建立目录的同时设置目录的权限;
-p或--parents 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录;
--version 显示版本信息。
  • 参数
目录:指定要创建的目录列表,多个目录之间用空格隔开
  • 实例
1. 在目录/usr/meng下建立子目录test,并且只有文件主有读、写和执行权限,其他人无权访问
$ mkdir -m 700 /usr/meng/test
2. 在当前目录中建立bin和bin下的os_1目录,权限设置为文件主可读、写、执行,同组用户可读和执行,其他用户无权访问
$ mkdir -p-m 750 bin/os_1

rmdir

==rmdir命令用来删除空目录==。当目录不再被使用时,或者磁盘空间已到达使用限定值,就需要删除失去使用价值的目录。利用rmdir命令可以从一个目录中删除一个或多个空的子目录。该命令从一个目录中删除一个或多个子目录,其中dirname佬表示目录名。如果dirname中没有指定路径,则删除当前目录下由dirname指定的目录;如dirname中包含路径,则删除指定位置的目录。删除目录时,必须具有对其父目录的写权限。

注意:子目录被删除之前应该是空目录。就是说,该目录中的所有文件必须用rm命令全部,另外,当前工作目录必须在被删除目录之上,不能是被删除目录本身,也不能是被删除目录的子目录

虽然还可以用带有-r选项的rm命令递归删除一个目录中的所有文件和该目录本身,但是这样做存在很大的危险性。

  • 语法
rmdir(选项)(参数)
  • 选项
-p或--parents:删除指定目录后,若该目录的上层目录已变成空目录,则将其一并删除;
--ignore-fail-on-non-empty:此选项使rmdir命令忽略由于删除非空目录时导致的错误信息;
-v或-verboes:显示命令的详细执行过程;
--help:显示命令的帮助信息;
--version:显示命令的版本信息。
  • 参数
目录列表:要删除的空目录列表。当删除多个空目录时,目录名之间使用空格隔开。
  • 实例
删除子目录os_1和其父目录bin
cd /usr/meng/test
rmdir -p bin/os_1

cd

==cd命令用来切换工作目录至dirname。 其中dirName表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录)。另外,~也表示为home directory的意思,.则是表示目前所在的目录,..则表示目前目录位置的上一层目录。==

  • 语法
cd (选项) (参数)
  • 选项
-p 如果要切换到的目标目录是一个符号连接,直接切换到符号连接指向的目标目录
-L 如果要切换的目标目录是一个符号的连接,直接切换到字符连接名代表的目录,而非符号连接所指向的目标目录。
- 当仅实用"-"一个选项时,当前工作目录将被切换到环境变量"OLDPWD"所表示的目录。
  • 实例
cd    进入用户主目录;
cd ~  进入用户主目录;
cd -  返回进入此目录之前所在的目录;
cd ..  返回上级目录(若当前目录为“/“,则执行完后还在“/";".."为上级目录的意思);
cd ../..  返回上两级目录;
cd !$  把上个命令的参数作为cd参数使用。

touch

==touch命令有两个功能:一是用于把已存在文件的时间标签更新为系统当前的时间(默认方式),它们的数据将原封不动地保留下来;二是用来创建新的空文件。==

  • 语法
touch(选项)(参数)
  • 选项
-a:或--time=atime或--time=access或--time=use  只更改存取时间;
-c:或--no-create  不建立任何文件;
-d:<时间日期> 使用指定的日期时间,而非现在的时间;
-f:此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题;
-m:或--time=mtime或--time=modify  只更该变动时间;
-r:<参考文件或目录>  把指定文件或目录的日期时间,统统设成和参考文件或目录的日期时间相同;
-t:<日期时间>  使用指定的日期时间,而非现在的时间;
--help:在线帮助;
--version:显示版本信息。
  • 参数
文件:指定要设置时间属性的文件列表。
  • 实例
touch ex2
在当前目录下建立一个空文件ex2,然后,利用ls -l命令可以发现文件ex2的大小为0,表示它是空文件。

cp

==cp命令用来将一个或多个源文件或者目录复制到指定的目的文件或目录。它可以将单个源文件复制成一个指定文件名的具体的文件或一个已经存在的目录下。cp命令还支持同时复制多个文件,当一次复制多个文件时,目标文件参数必须是一个已经存在的目录,否则将出现错误==

  • 语法
cp(选项)(参数)
  • 选项
-a:此参数的效果和同时指定"-dpR"参数相同;
-d:当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;
-i:覆盖既有文件之前先询问用户;
-l:对源文件建立硬连接,而非复制文件;
-p:保留源文件或目录的属性;
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-s:对源文件建立符号连接,而非复制文件;
-u:使用这项参数后只会在源文件的更改时间较目标文件更新时或是名称相互对应的目标文件并不存在时,才复制文件;
-S:在备份文件时,用指定的后缀“SUFFIX”代替文件的默认后缀;
-b:覆盖已存在的文件目标前将目标文件备份;
-v:详细显示命令执行的操作。
  • 参数
 源文件:制定源文件列表。默认情况下,cp命令不能复制目录,如果要复制目录,则必须使用-R选项;
目标文件:指定目标文件。当“源文件”为多个文件时,要求“目标文件”为指定的目录。
  • 实例
1. 如果把一个文件复制到一个目标文件中,而目标文件已经存在,那么,该目标文件的内容将被破坏。此命令中所有参数既可以是绝对路径名,也可以是相对路径名。通常会用到点.或点点..的形式。例如,下面的命令将指定文件复制到当前目录下:
$ cp ../mary/homework/assign .

2. 所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录。如果没有文件复制的权限,则系统会显示出错信息。
将文件file复制到目录/usr/men/tmp下,并改名为file1
$ cp file /usr/men/tmp/file1

3. 将目录/usr/men下的所有文件及其子目录复制到目录/usr/zh中
$ cp -r /usr/men /usr/zh

4. 交互式地将目录/usr/men中的以m打头的所有.c文件复制到目录/usr/zh中
$ cp -i /usr/men m*.c /usr/zh

5. 我们在Linux下使用cp命令复制文件时候,有时候会需要覆盖一些同名文件,覆盖文件的时候都会有提示:需要不停的按Y来确定执行覆盖。文件数量不多还好,但是要是几百个估计按Y都要吐血了,于是折腾来半天总结了一个方法:
$ cp aaa/* /bbb

6. 复制目录aaa下所有到/bbb目录下,这时如果/bbb目录下有和aaa同名的文件,需要按Y来确认并且会略过aaa目录下的子目录。
$ cp -r aaa/* /bbb

7.这次依然需要按Y来确认操作,但是没有忽略子目录。
$ cp -r -a aaa/* /bbb

8. 依然需要按Y来确认操作,并且把aaa目录以及子目录和文件属性也传递到了/bbb。
$ \cp -r -a aaa/* /bbb
成功,没有提示按Y、传递了目录属性、没有略过目录。

mv

==mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中。source表示源文件或目录,target表示目标文件或目录。如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆盖。==

mv命令可以用来将源文件移至一个目标文件中,或将一组文件移至一个目标目录中。源文件被移至目标文件有两种不同的结果:

  1. 如果目标文件是到某一目录文件的路径,源文件会被移到此目录下,且文件名不变。
  2. 如果目标文件不是目录文件,则源文件名(只能有一个)会变为此目标文件名,并覆盖己存在的同名文件。如果源文件和目标文件在同一个目录下,mv的作用就是改文件名。当目标文件是目录文件时,源文件或目录参数可以有多个,则所有的源文件都会被移至目标文件中。所有移到该目录下的文件都将保留以前的文件名。
    注意事项:mv与cp的结果不同,mv好像文件“搬家”,文件个数并未增加。而cp对文件进行复制,文件个数增加了。
  • 语法
mv(选项)(参数)
  • 选项
--backup=<备份模式>:若需覆盖文件,则覆盖前先行备份;
-b:当文件存在时,覆盖前,为其创建一个备份;
-f:若目标文件或目录与现有的文件或目录重复,则直接覆盖现有的文件或目录;
-i:交互式操作,覆盖前先行询问用户,如果源文件与目标文件或目标目录中的文件同名,则询问用户是否覆盖目标文件。用户输入”y”,表示将覆盖目标文件;输入”n”,表示取消对源文件的移动。这样可以避免误将文件覆盖。
--strip-trailing-slashes:删除源文件中的斜杠“/”;
-S<后缀>:为备份文件指定后缀,而不使用默认的后缀;
--target-directory=<目录>:指定源文件要移动到目标目录;
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
  • 参数
源文件:源文件列表。
目标文件:如果“目标文件”是文件名则在移动文件的同时,将其改名为“目标文件”;如果“目标文件”是目录名则将源文件移动到“目标文件”下。
  • 实例
1. 将文件ex3改名为new1
$ mv ex3 new1

2.将目录/usr/men中的所有文件移到当前目录(用.表示)中:
$ mv /usr/men/* .

rm

==rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉。对于链接文件,只是删除整个链接文件,而原有文件保持不变。==

注意:使用rm命令要格外小心。因为一旦删除了一个文件,就无法再恢复它。所以,在删除文件之前,最好再看一下文件的内容,确定是否真要删除。rm命令可以用-i选项,这个选项在使用文件扩展名字符删除多个文件时特别有用。使用这个选项,系统会要求你逐一确定是否要删除。这时,必须输入y并按Enter键,才能删除文件。如果仅按Enter键或其他字符,文件不会被删除

  • 语法
rm (选项)(参数)
  • 选项
-d:直接把欲删除的目录的硬连接数据删除成0,删除该目录;
-f:强制删除文件或目录;
-i:删除已有文件或目录之前先询问用户;
-r或-R:递归处理,将指定目录下的所有文件与子目录一并处理;
--preserve-root:不对根目录进行递归操作;
-v:显示指令的详细执行过程
  • 参数
文件:指定被删除的文件列表,如果参数中含有目录,则必须加上-r或者-R选项。
  • 实例
1. 交互式删除当前目录下的文件test和example
$ rm -i test example
$ Remove test ?n(不删除文件test)
$ Remove example ?y(删除文件example)

2. 删除当前目录下除隐含文件外的所有文件和子目录
$ rm -r *
应注意,这样做是非常危险的!

ln

==ln命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。如果要创建符号连接必须使用"-s"选项==。

注意:符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。

  • 语法
ln(选项)(参数)
  • 选项
-b或--backup:删除,覆盖目标文件之前的备份;
-d或-F或——directory:建立目录的硬连接;
-f或——force:强行建立文件或目录的连接,不论文件或目录是否存在;
-i或——interactive:覆盖既有文件之前先询问用户;
-n或--no-dereference:把符号连接的目的目录视为一般文件;
-s或——symbolic:对源文件建立符号连接,而非硬连接;
-S<字尾备份字符串>或--suffix=<字尾备份字符串>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它;
-v或——verbose:显示指令执行过程;
-V<备份方式>或--version-control=<备份方式>:用“-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用“-S”参数变更,当使用“-V”参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串;
--help:在线帮助;
--version:显示版本信息。
  • **参数
源文件:指定连接的源文件。如果使用-s选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件;
目标文件:指定源文件的目标连接文件。
  • 实例
1. 将目录/usr/mengqc/mub1下的文件m2.c链接到目录/usr/liu下的文件a2.c
$ cd /usr/mengqc
$ ln /mub1/m2.c /usr/liu/a2.c

2. 在执行ln命令之前,目录/usr/liu中不存在a2.c文件。执行ln之后,在/usr/liu目录中才有a2.c这一项,表明m2.c和a2.c链接起来(注意,二者在物理上是同一文件),利用ls -l命令可以看到链接数的变化。
在目录/usr/liu下建立一个符号链接文件abc,使它指向目录/usr/mengqc/mub1
$ ln -s /usr/mengqc/mub1 /usr/liu/abc

执行该命令后,/usr/mengqc/mub1代表的路径将存放在名为/usr/liu/abc的文件中。

find

==find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示==

  • 语法
find(选项)(参数)
  • 选项
-amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
-anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
-atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
-cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
-cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
-daystart:从本日开始计算时间;
-depth:从指定目录下最深层的子目录开始查找;
-empty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
-exec<执行指令>:假设find指令的回传值为True,就执行该指令;
-false:将find指令的回传值皆设为False;
-fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
-follow:排除符号连接;
-fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
-fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
-fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
-fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
-gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
-group<群组名称>:查找符合指定之群组名称的文件或目录;
-help或——help:在线帮助;
-ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
-iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
-inum<inode编号>:查找符合指定的inode编号的文件或目录;
-ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
-iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
-links<连接数目>:查找符合指定的硬连接数目的文件或目录;
-iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
-ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
-maxdepth<目录层级>:设置最大目录层级;
-mindepth<目录层级>:设置最小目录层级;
-mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
-mount:此参数的效果和指定“-xdev”相同;
-mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
-name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
-nogroup:找出不属于本地主机群组识别码的文件或目录;
-noleaf:不去考虑目录至少需拥有两个硬连接存在;
-nouser:找出不属于本地主机用户识别码的文件或目录;
-ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
-path<范本样式>:指定字符串作为寻找目录的范本样式;
-perm<权限数值>:查找符合指定的权限数值的文件或目录;
-print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
-print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
-printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
-prune:不寻找字符串作为寻找文件或目录的范本样式;
-regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
-size<文件大小>:查找符合指定的文件大小的文件;
-true:将find指令的回传值皆设为True;
-type<文件类型>:只寻找符合指定的文件类型的文件;
-uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
-used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
-user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
-version或——version:显示版本信息;
-xdev:将范围局限在先行的文件系统中;
-xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。
  • 参数
起始目录:查找文件的起始目录。  
  • 实例
  1. 根据文件或者正则表达式进行匹配
1. 列出当前目录及子目录下所有文件和文件夹
$ find .

2. 在/home目录下查找以.txt结尾的文件名
$ find /home -name "*.txt"

3.同上,但忽略大小写
$ find /home -iname "*.txt"

4. 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
$ find . \( -name "*.txt" -o -name "*.pdf" \)
或
$ find . -name "*.txt" -o -name "*.pdf"

5. 匹配文件路径或者文件
$ find /usr/ -path "*local*"

6. 基于正则表达式匹配文件路径
$ find . -regex ".*\(\.txt\|\.pdf\)$"

7. 同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"
  1. 否定参数
找出/home下不是以.txt结尾的文件
$ find /home ! -name "*.txt"
  1. 根据文件类型进行搜索
find . -type 类型参数

类型参数列表

  • f 普通文件
  • l 符号连接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p Fifo
  1. 基于目录深度搜索
1. 向下最大深度限制为3
$ find . -maxdepth 3 -type f

2. 搜索出深度距离当前目录至少2个子目录的所有文件
$ find . -mindepth 2 -type f
  1. 根据文件时间戳进行搜索
$ find . -type f 时间戳

UNIX/Linux文件系统每个文件都有三种时间戳

  • 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
1. 搜索最近七天内被访问过的所有文件
$ find . -type f -atime -7

2. 搜索恰好在七天前被访问过的所有文件
$ find . -type f -atime 

3. 搜索超过七天内被访问过的所有文件
$ find . -type f -atime +7

4. 搜索访问时间超过10分钟的所有文件
$ find . -type f -amin +10

5. 找出比file.log修改时间更长的所有文件
$ find . -type f -newer file.log
  1. 根据文件大小进行匹配
$ find . -type f -size 文件大小单元

文件大小单元

  • b —— 块(512字节)
  • c —— 字节
  • w —— 字(2字节)
  • k —— 千字节
  • M —— 兆字节
  • G —— 吉字节
1. 搜索大于10KB的文件
$ find . -type f -size +10k

2. 搜索小于10KB的文件
$ find . -type f -size -10k

3. 搜索等于10KB的文件
$ find . -type f -size 10k
  1. 删除匹配文件
删除当前目录下所有.txt文件
$ find . -type f -name "*.txt" -delete
  1. 根据文件权限/所有权进行匹配
1. 当前目录下搜索出权限为777的文件
$ find . -type f -perm 777

2.找出当前目录下权限不是644的php文件
$ find . -type f -name "*.php" ! -perm 644

3.找出当前目录用户tom拥有的所有文件
$ find . -type f -user tom

4. 找出当前目录用户组sunk拥有的所有文件
$ find . -type f -group sunk
  1. 借助-exec选项与其他命令结合使用
找出当前目录下所有root的文件,并把所有权更改为用户tom
find .-type f -user root -exec chown tom {} \;

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除
find $HOME/. -name "*.txt" -ok rm {} \;

上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt

将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令
-exec ./text.sh {} \;
  1. 搜索但跳出指定的目录
find . -path "./sk" -prune -o -name "*.txt" -print
  1. find其他技巧收集
find . -empty

查看文件及内容处理命令(7个)

cat

==cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。==

注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。

  • 语法
cat(选项)(参数)
  • 选项
-n或-number:有1开始对所有输出的行数编号;
-b或--number-nonblank:和-n相似,只不过对于空白行不编号;
-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;
-A:显示不可打印字符,行尾显示“$”;
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;
  • 参数
文件列表:指定要连接的文件列表。
  • 实例
设ml和m2是当前目录下的两个文件

cat m1 (在屏幕上显示文件ml的内容)
cat m1 m2 (同时显示文件ml和m2的内容)
cat m1 m2 > file (将文件ml和m2合并后放入文件file中)

more

==more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)==。

该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)可以用下列不同的方法对提示做出回答:

  • 按Space键:显示文本的下一屏内容。
  • 按Enier键:只显示文本的下一行内容。
  • 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
  • 按H键:显示帮助屏,该屏上有相关的帮助信息。
  • 按B键:显示上一屏内容。
  • 按Q键:退出rnore命令。
  • 语法
more(语法)(参数)
  • 选项
-<数字>:指定每屏显示的行数;
-d:显示“[press space to continue,'q' to quit.]”和“[Press 'h' for instructions]”;
-c:不进行滚屏操作。每次刷新这个屏幕;
-s:将多个空行压缩成一行显示;
-u:禁止下划线;
+<数字>:从指定数字的行开始显示。
  • 参数
文件:指定分页显示内容的文件。
  • 实例
1. 显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
$ more -dc file

2. 显示文件file的内容,每10行显示一次,而且在显示之前先清屏。
$ more -c -10 file

less

==less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键==

  • 语法
less(选项)(参数)
  • 选项
-e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异;
-N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。
  • 参数
文件:指定要分屏显示内容的文件。

==head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。==

  • 语法
head(选项)(参数)
  • 选项
-n<数字>:指定显示头部内容的行数;
-c<字符数>:指定显示头部内容的字符数;
-v:总是显示文件名的头信息;
-q:不显示文件名的头信息。
  • 参数
文件列表:指定显示头部内容的文件列表。

tail

==tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为“-”,则读取标准输入==。

注意:如果表示字节或行数的N值之前有一个”+”号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1 048576(1M)。

  • 语法
tail(选项)(参数)
  • 选项
--retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项“——follow=name”连用;
-c<N>或——bytes=<N>:输出文件尾部的N(N为整数)个字节内容;
-f<name/descriptor>或;--follow<nameldescript>:显示文件最新追加的内容。“name”表示以文件名的方式监视文件的变化。“-f”与“-fdescriptor”等效;
-F:与选项“-follow=name”和“--retry"连用时功能相同;
-n<N>或——line=<N>:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>:与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或——quiet或——silent:当有多个文件参数时,不输出各个文件名;
-s<秒数>或——sleep-interal=<秒数>:与“-f”选项连用,指定监视文件变化时间隔的秒数;
-v或——verbose:当有多个文件参数时,总是输出各个文件名;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。
  • 参数
文件列表:指定要显示尾部内容的文件列表。
  • 实例
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)

grep

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

  • 选项
-a 不要忽略二进制数据。
-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。
-c 计算符合范本样式的列数。
-C<显示列数>或-<显示列数>  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。
-e<范本样式> 指定字符串作为查找文件内容的范本样式。
-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。
-F 将范本样式视为固定字符串的列表。
-G 将范本样式视为普通的表示法来使用。
-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
-H 在显示符合范本样式的那一列之前,标示该列的文件名称。
-i 忽略字符大小写的差别。
-l 列出文件内容符合指定的范本样式的文件名称。
-L 列出文件内容不符合指定的范本样式的文件名称。
-n 在显示符合范本样式的那一列之前,标示出该列的编号。
-q 不显示任何信息。
-R/-r 此参数的效果和指定“-d recurse”参数相同。
-s 不显示错误信息。
-v 反转查找。
-w 只显示全字符合的列。
-x 只显示全列符合的列。
-y 此参数效果跟“-i”相同。
-o 只输出文件中匹配到的部分。

grep命令常见用法

  1. 在文件中搜索一个单词,命令会返回一个包含“match_pattern”的文本行:
grep match_pattern file_name
grep "match_pattern" file_name
  1. 在多个文件中查找
grep "match_pattern" file_1 file_2 file_3 ...
  1. 输出除之外的所有行 -v 选项
grep -v "match_pattern" file_name
  1. 标记匹配颜色 --color=auto 选项
grep "match_pattern" file_name --color=auto
  1. 使用正则表达式 -E 选项
grep -E "[1-9]+"
或
egrep "[1-9]+"
  1. 只输出文件中匹配到的部分 -o 选项
echo this is a test line. | grep -o -E "[a-z]+\."
line.

echo this is a test line. | egrep -o "[a-z]+\."
line.
  1. 统计文件或者文本中包含匹配字符串的行数 -c 选项
grep -c "text" file_name
  1. 输出包含匹配字符串的行数 -n 选项
grep "text" -n file_name
或
cat file_name | grep "text" -n

#多个文件
grep "text" -n file_1 file_2
  1. 打印样式匹配所位于的字符或字节偏移
echo gun is not unix | grep -b -o "not"
7:not

#一行中字符串的字符便宜是从该行的第一个字符开始计算,起始值为0。选项 -b -o 一般总是配合使用。
  1. 搜索多个文件并查找匹配文本在哪些文件中
grep -l "text" file1 file2 file3...
  • grep递归搜索文件
  1. 在多级目录中对文本进行递归搜索
grep "text" . -r -n
# .表示当前目录。
  1. 忽略匹配样式中的字符大小写
echo "hello world" | grep -i "HELLO"
hello
  1. 选项 -e 制动多个匹配样式
echo this is a text line | grep -e "is" -e "line" -o
is
line

#也可以使用-f选项来匹配多个样式,在样式文件中逐行写出需要匹配的字符。
cat patfile
aaa
bbb

echo aaa bbb ccc ddd eee | grep -f patfile -o
  1. 在grep搜索结果中包括或者排除指定文件
#只在目录中所有的.php和.html文件中递归搜索字符"main()"
grep "main()" . -r --include *.{php,html}

#在搜索结果中排除所有README文件
grep "main()" . -r --exclude "README"

#在搜索结果中排除filelist文件列表里的文件
grep "main()" . -r --exclude-from filelist
  1. 使用0值字节后缀的grep与xargs
#测试文件:
echo "aaa" > file1
echo "bbb" > file2
echo "aaa" > file3

grep "aaa" file* -lZ | xargs -0 rm

#执行后会删除file1和file3,grep输出用-Z选项来指定以0值字节作为终结符文件名(\0),xargs -0 读取输入并用0值字节终结符分隔文件名,然后删除匹配文件,-Z通常和-l结合使用。
  1. grep静默输出
grep -q "test" filename

#不会输出任何信息,如果命令运行成功返回0,失败则返回非0值。一般用于条件测试。
  1. 打印出匹配文本之前或者之后的行
#显示匹配某个结果之后的3行,使用 -A 选项:
seq 10 | grep "5" -A 3
5
6
7
8

#显示匹配某个结果之前的3行,使用 -B 选项:
seq 10 | grep "5" -B 3
2
3
4
5

#显示匹配某个结果的前三行和后三行,使用 -C 选项:
seq 10 | grep "5" -C 3
2
3
4
5
6
7
8

#如果匹配结果有多个,会用“--”作为各匹配结果之间的分隔符:
echo -e "a\nb\nc\na\nb\nc" | grep a -A 1
a
b
--
a
b

file

==file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程==。

  • 语法
file(选项)(参数)
  • 选项
-b:列出辨识结果时,不显示文件名称;
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号连接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-z:尝试去解读压缩文件的内容。
  • 参数
文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
  • 实例
  1. 显示文件类型
[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text

[root@localhost ~]# file -b install.log      <== 不显示文件名称
UTF-8 Unicode text

[root@localhost ~]# file -i install.log      <== 显示MIME类别。
install.log: text/plain; charset=utf-8

[root@localhost ~]# file -b -i install.log
text/plain; charset=utf-8
  1. 显示符号链接的文件类型
[root@localhost ~]# ls -l /var/mail
lrwxrwxrwx 1 root root 10 08-13 00:11 /var/mail -> spool/mail

[root@localhost ~]# file /var/mail
/var/mail: symbolic link to `spool/mail'

[root@localhost ~]# file -L /var/mail
/var/mail: directory

[root@localhost ~]# file /var/spool/mail
/var/spool/mail: directory

[root@localhost ~]# file -L /var/spool/mail
/var/spool/mail: directory

其他命令(15个)

cut

==cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容,类似于下的type命令。==

说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。

当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。

  • 语法
cut(选项)(参数)
  • 选项
-b:仅显示行中指定直接范围的内容;
-c:仅显示行中指定范围的字符;
-d:指定字段的分隔符,默认的字段分隔符为“TAB”;
-f:显示指定字段的内容;
-n:与“-b”选项连用,不分割多字节字符;
--complement:补足被选择的字节、字符或字段;
--out-delimiter=<字段分隔符>:指定输出内容是的字段分割符;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。
  • 参数
文件:指定要进行内容过滤的文件。
  • 实例
  1. 例如有一个学生报表信息,包含No、Name、Mark、Percent:
[root@localhost text]# cat test.txt 
No Name Mark Percent
01 tom 69 91
02 jack 71 87
03 alex 68 98
  1. 使用 -f 选项提取指定字段:
[root@localhost text]# cut -f 1 test.txt 
No
01
02
03

---
[root@localhost text]# cut -f2,3 test.txt 
Name Mark
tom 69
jack 71
alex 68
  1. --complement 选项提取指定字段之外的列(打印除了第二列之外的列):
[root@localhost text]# cut -f2 --complement test.txt 
No Mark Percent
01 69 91
02 71 87
03 68 98
  1. 使用 -d 选项指定字段分隔符:
[root@localhost text]# cat test2.txt 
No;Name;Mark;Percent
01;tom;69;91
02;jack;71;87
03;alex;68;98

---
[root@localhost text]# cut -f2 -d";" test2.txt 
Name
tom
jack
alex

指定字段的字符或者字节范围

cut命令可以将一串字符作为列来显示,字符字段的记法:

  • N-:从第N个字节、字符、字段到结尾;
  • N-M:从第N个字节、字符、字段到第M个(包括M在内)字节、字符、字段;
  • -M:从第1个字节、字符、字段到第M个(包括M在内)字节、字符、字段。

上面是记法,结合下面选项将摸个范围的字节、字符指定为字段:

  • -b 表示字节;
  • -c 表示字符;
  • -f 表示定义字段

示例

[root@localhost text]# cat test.txt 
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
  1. 打印第1个到第3个字符:
[root@localhost text]# cut -c1-3 test.txt 
abc
abc
abc
abc
abc
  1. 打印前2个字符:
[root@localhost text]# cut -c-2 test.txt 
ab
ab
ab
ab
ab
  1. 打印从第5个字符开始到结尾:
[root@localhost text]# cut -c5- test.txt 
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz
efghijklmnopqrstuvwxyz

split

==split命令可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志等。==

  • 选项
-b:值为每一输出档案的大小,单位为 byte。
-C:每一输出档中,单行的最大 byte 数。
-d:使用数字作为后缀。
-l:值为每一输出档的列数大小。
  • 实例
  1. 生成一个大小为100KB的测试文件:
[root@localhost split]# dd if=/dev/zero bs=100k count=1 of=date.file
1+0 records in
1+0 records out
102400 bytes (102 kB) copied, 0.00043 seconds, 238 MB/s
  1. 使用split命令将上面创建的date.file文件分割成大小为10KB的小文件
[root@localhost split]# split -b 10k date.file 
[root@localhost split]# ls
date.file  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj
  1. 文件被分割成多个带有字母的后缀文件,如果想用数字后缀可使用-d参数,同时可以使用-a length来指定后缀的长度:
[root@localhost split]# split -b 10k date.file -d -a 3
[root@localhost split]# ls
date.file  x000  x001  x002  x003  x004  x005  x006  x007  x008  x009
  1. 为分割后的文件指定文件名的前缀:
[root@localhost split]# split -b 10k date.file -d -a 3 split_file
[root@localhost split]# ls
date.file  split_file000  split_file001  split_file002  split_file003  split_file004  split_file005  split_file006  split_file007  split_file008  split_file009
  1. 使用-l选项根据文件的行数来分割文件,例如把文件分割成每个包含10行的小文件:
split -l 10 date.file

paste

==paste命令用于将多个文件按照列队列进行合并==

  • 语法
paste(选项)(参数)
  • 选项
-d<间隔字符>或--delimiters=<间隔字符>:用指定的间隔字符取代跳格字符;
-s或——serial串列进行而非平行处理。
  • 参数
文件列表:指定需要合并的文件列表。

sort

==sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。==

  • 语法
sort(选项)(参数)
  • 选项
-b:忽略每行前面开始出的空格字符;
-c:检查文件是否已经按照顺序排序;
-d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
-f:排序时,将小写字母视为大写字母;
-i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
-m:将几个排序号的文件进行合并;
-M:将前面3个字母依照月份的缩写进行排序;
-n:依照数值的大小排序;
-o<输出文件>:将排序后的结果存入制定的文件;
-r:以相反的顺序来排序;
-t<分隔字符>:指定排序时所用的栏位分隔字符;
+<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
  • 参数
文件:指定待排序的文件列表。
  • 实例
  1. sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
[root@mail text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5

[root@mail text]# sort sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5
  1. 忽略相同行使用-u选项或者uniq:
[root@mail text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5

[root@mail text]# sort -u sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5

或者

[root@mail text]# uniq sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
  1. sort的-n、-r、-k、-t选项的使用:
[root@mail text]# cat sort.txt
AAA:BB:CC
aaa:30:1.6
ccc:50:3.3
ddd:20:4.2
bbb:10:2.5
eee:40:5.4
eee:60:5.1

#将BB列按照数字从小到大顺序排列:
[root@mail text]# sort -nk 2 -t: sort.txt
AAA:BB:CC
bbb:10:2.5
ddd:20:4.2
aaa:30:1.6
eee:40:5.4
ccc:50:3.3
eee:60:5.1

#将CC列数字从大到小顺序排列:
[root@mail text]# sort -nrk 3 -t: sort.txt
eee:40:5.4
eee:60:5.1
ddd:20:4.2
ccc:50:3.3
bbb:10:2.5
aaa:30:1.6
AAA:BB:CC

# -n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号
  1. -k选项的具体语法格式:
k选项的语法格式:

FStart.CStart Modifie,FEnd.CEnd Modifier
-------Start--------,-------End--------
 FStart.CStart 选项  ,  FEnd.CEnd 选项

这个语法格式可以被其中的逗号,分为两大部分,Start部分和End部分。Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。

  1. 从公司英文名称的第二个字母开始进行排序:
$ sort -t ' ' -k 1.2 facebook.txt
baidu 100 5000
sohu 100 4500
google 110 5000
guge 50 3000

使用了-k 1.2,表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。

  1. 只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt
baidu 100 5000
google 110 5000
sohu 100 4500
guge 50 3000

由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。

uniq

==uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。==

  • 语法
uniq(选项)(参数)
  • 选项
-c或——count:在每列旁边显示该行重复出现的次数;
-d或--repeated:仅显示重复出现的行列;
-f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
-s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
-u或——unique:仅显示出一次的行列;
-w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
  • 参数
输入文件:指定要去除的重复行文件。如果不指定此项,则从标准读取数据;
输出文件:指定要去除重复行后的内容要写入的输出文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。
  • 实例
  1. 删除重复行:
uniq file.txt
sort file.txt | uniq
sort -u file.txt
  1. 只显示单一行:
uniq -u file.txt
sort file.txt | uniq -u
  1. 统计各行在文件中出现的次数:
sort file.txt | uniq -c
  1. 在文件中找出重复的行:
sort file.txt | uniq -d

wc

==wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据==。

  • 语法
wc(选项)(参数)
  • 选项
-c或--bytes或——chars:只显示Bytes数;
-l或——lines:只显示列数;
-w或——words:只显示字数。
  • 参数
文件:需要统计的文件列表。

iconv

==iconv命令是用来转换文件的编码方式的,比如它可以将UTF8编码的转换成GB18030的编码,反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数,可以用来在C/C++程序中很方便的转换字符编码,这在抓取网页的程序中很有用处,而iconv命令在调试此类程序时用得着。==

  • 语法
iconv -f encoding [-t encoding] [inputfile]... 
  • 选项
-f encoding :把字符从encoding编码开始转换。 
-t encoding :把字符转换到encoding编码。 
-l :列出已知的编码字符集合 
-o file :指定输出文件 
-c :忽略输出的非法字符 
-s :禁止警告信息,但不是错误信息 
--verbose :显示进度信息 
-f和-t所能指定的合法字符在-l选项的命令里面都列出来了。 
  • 实例
  1. 列出当前支持的字符编码:
iconv -l 
  1. 将文件file1转码,转后文件输出到fil2中:
iconv file1 -f EUC-JP-MS -t UTF-8 -o file2 

这里,没-o那么会输出到标准输出。

dos2unix

==dos2unix命令用来将DOS格式的文本文件转换成UNIX格式的(DOS/MAC to UNIX text file format converter)。DOS下的文本文件是以\r\n作为断行标志的,表示成十六进制就是0D 0A。而Unix下的文本文件是以\n作为断行标志的,表示成十六进制就是0A。DOS格式的文本文件在Linux底下,用较低版本的vi打开时行尾会显示^M,而且很多命令都无法很好的处理这种格式的文件,如果是个shell脚本,。而Unix格式的文本文件在Windows下用Notepad打开时会拼在一起显示。因此产生了两种格式文件相互转换的需求,对应的将UNIX格式文本文件转成成DOS格式的是unix2dos命令。==

  • 语法
dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
  • 选项
-k:保持输出文件的日期不变
-q:安静模式,不提示任何警告信息。
-V:查看版本
-c:转换模式,模式有:ASCII, 7bit, ISO, Mac, 默认是:ASCII。
-o:写入到源文件
-n:写入到新文件
  • 参数
参数:需要转换到文件。
  • 实例
  1. 最简单的用法就是dos2unix直接跟上文件名:
dos2unix file
  1. 如果一次转换多个文件,把这些文件名直接跟在dos2unix之后。(注:也可以加上-o参数,也可以不加,效果一样)
dos2unix file1 file2 file3
dos2unix -o file1 file2 file3
  1. 上面在转换时,都会直接在原来的文件上修改,如果想把转换的结果保存在别的文件,而源文件不变,则可以使用-n参数。
dos2unix oldfile newfile
  1. 如果要保持文件时间戳不变,加上-k参数。所以上面几条命令都是可以加上-k参数来保持文件时间戳的。
dos2unix -k file
dos2unix -k file1 file2 file3
dos2unix -k -o file1 file2 file3
dos2unix -k -n oldfile newfile

diff

==diff命令在最简单的情况下,比较给定的两个文件的不同。如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入。diff命令是以逐行的方式,比较文本文件的异同处。如果该命令指定进行目录的比较,则将会比较该目录中具有相同文件名的文件,而不会对其子目录文件进行任何比较操作==。

  • 语法
diff(选项)(参数)
  • 选项
-<行数>:指定要显示多少行的文本。此参数必须与-c或-u参数一并使用;
-a或——text:diff预设只会逐行比较文本文件;
-b或--ignore-space-change:不检查空格字符的不同;
-B或--ignore-blank-lines:不检查空白行;
-c:显示全部内容,并标出不同之处;
-C<行数>或--context<行数>:与执行“-c-<行数>”指令相同;
-d或——minimal:使用不同的演算法,以小的单位来做比较;
-D<巨集名称>或ifdef<巨集名称>:此参数的输出格式可用于前置处理器巨集;
-e或——ed:此参数的输出格式可用于ed的script文件;
-f或-forward-ed:输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处;
-H或--speed-large-files:比较大文件时,可加快速度;
-l<字符或字符串>或--ignore-matching-lines<字符或字符串>:若两个文件在某几行有所不同,而之际航同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异;
-i或--ignore-case:不检查大小写的不同;
-l或——paginate:将结果交由pr程序来分页;
-n或——rcs:将比较结果以RCS的格式来显示;
-N或--new-file:在比较目录时,若文件A仅出现在某个目录中,预设会显示:Only in目录,文件A 若使用-N参数,则diff会将文件A 与一个空白的文件比较;
-p:若比较的文件为C语言的程序码文件时,显示差异所在的函数名称;
-P或--unidirectional-new-file:与-N类似,但只有当第二个目录包含了第一个目录所没有的文件时,才会将这个文件与空白的文件做比较;
-q或--brief:仅显示有无差异,不显示详细的信息;
-r或——recursive:比较子目录中的文件;
-s或--report-identical-files:若没有发现任何差异,仍然显示信息;
-S<文件>或--starting-file<文件>:在比较目录时,从指定的文件开始比较;
-t或--expand-tabs:在输出时,将tab字符展开;
-T或--initial-tab:在每行前面加上tab字符以便对齐;
-u,-U<列数>或--unified=<列数>:以合并的方式来显示文件内容的不同;
-v或——version:显示版本信息;
-w或--ignore-all-space:忽略全部的空格字符;
-W<宽度>或--width<宽度>:在使用-y参数时,指定栏宽;
-x<文件名或目录>或--exclude<文件名或目录>:不比较选项中所指定的文件或目录;
-X<文件>或--exclude-from<文件>;您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件;
-y或--side-by-side:以并列的方式显示文件的异同之处;
--help:显示帮助;
--left-column:在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容;
--suppress-common-lines:在使用-y参数时,仅显示不同之处。
  • 参数
文件1:指定要比较的第一个文件;
文件2:指定要比较的第二个文件。
  • 实例
  1. 将目录/usr/li下的文件"test.txt"与当前目录下的文件"test.txt"进行比较,输入如下命令:
diff /usr/li test.txt     #使用diff指令对文件进行比较
  1. 上面的命令执行后,会将比较后的不同之处以指定的形式列出,如下所示:
n1 a n3,n4  
n1,n2 d n3  
n1,n2 c n3,n4 

其中,字母"a"、"d"、"c"分别表示添加、删除及修改操作。而"n1"、"n2"表示在文件1中的行号,"n3"、"n4"表示在文件2中的行号。

注意:以上说明指定了两个文件中不同处的行号及其相应的操作。在输出形式中,每一行后面将跟随受到影响的若干行。其中,以<开始的行属于文件1,以>开始的行属于文件2。

vimdiff

==vimdiff 快速比较和合并少量文件==

纯文本文件比较和合并工具一直是软件开发过程中比较重要的组成部分,vimdiff 能够在比较出来的多处差异之间快速定位,很容易的进行文件合并操作。
在需要快速比较和合并少量文件的时候,vimdiff是很好的选择。

vimdiff 基本用法

首先保证系统中的diff命令是可用的。Vim的diff模式是依赖于diff命令的。

启动方法

  1. vimdiff file1 file2 …
  2. vim -d file1 file2 …

df

==df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 ==

  • 语法
df(选项)(参数)
  • 选项
-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息
  • 参数
文件:指定文件系统上的文件。
  • 实例
  1. 查看系统磁盘设备,默认是KB为单位:
[root@LinServ-1 ~]# df
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda2            146294492  28244432 110498708  21% /
/dev/sda1              1019208     62360    904240   7% /boot
tmpfs                  1032204         0   1032204   0% /dev/shm
/dev/sdb1            2884284108 218826068 2518944764   8% /data1
  1. 使用-h选项以KB以上的单位来显示,可读性高:
[root@LinServ-1 ~]# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda2             140G   27G  106G  21% /
/dev/sda1             996M   61M  884M   7% /boot
tmpfs                1009M     0 1009M   0% /dev/shm
/dev/sdb1             2.7T  209G  2.4T   8% /data1
  1. 查看全部文件系统:
[root@LinServ-1 ~]# df -a
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda2            146294492  28244432 110498708  21% /
proc                         0         0         0   -  /proc
sysfs                        0         0         0   -  /sys
devpts                       0         0         0   -  /dev/pts
/dev/sda1              1019208     62360    904240   7% /boot
tmpfs                  1032204         0   1032204   0% /dev/shm
/dev/sdb1            2884284108 218826068 2518944764   8% /data1
none                         0         0         0   -  /proc/sys/fs/binfmt_misc

chattr

==chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式==:

a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
  • 语法
chattr(选项)
  • 选项
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
  • 实例
  1. 用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/fstab

然后试一下rm、mv、rename等命令操作于该文件,都是得到Operation not permitted的结果。

  1. 让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:
chattr +a /data1/user_act.log

lsattr

==lsattr命令用于查看文件的第二扩展文件系统属性。==

  • 语法
lsattr(选项)(参数)
  • 选项
-E:可显示设备属性的当前值,但这个当前值是从用户设备数据库中获得的,而不是从设备直接获得的。
-D:显示属性的名称,属性的默认值,描述和用户是否可以修改属性值的标志。
-R:递归的操作方式;
-V:显示指令的版本信息;
-a:列出目录中的所有文件,包括隐藏文件。

lsattr经常使用的几个选项-D,-E,-R这三个选项不可以一起使用,它们是互斥的,经常使用的还有-l,-H,使用lsattr时,必须指出具体的设备名,用-l选项指出要显示设备的逻辑名称,否则要用-c,-s,-t等选项唯一的确定某个已存在的设备。

  • 参数
文件:指定显示文件系统属性的文件名。
  • 实例
lsattr -E -l rmt0 -H
lsattr -EO -l rmt0

rev

==rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,最后一个字符最先输出,依次类推。==

  • 语法
rev(参数)
  • 参数
文件:指定要反序显示内容的文件。
  • 实例
[root@localhost ~]# cat iptables.bak
# Generated by iptables-save v1.3.5 on Thu Dec 26 21:25:15 2013
*filter
:INPUT DROP [48113:2690676]
:FORWARD accept [0:0]
:OUTPUT ACCEPT [3381959:1818595115]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Thu Dec 26 21:25:15 2013

[root@localhost ~]# rev iptables.bak    
3102 51:52:12 62 ceD uhT no 5.3.1v evas-selbatpi yb detareneG #
retlif*
]6760962:31184[ PORD TUPNI:
]0:0[ TPECCA DRAWROF:
]5115958181:9591833[ TPECCA TUPTUO:
 TPECCA j- ol i- TUPNI A-
 TPECCA j- 22 tropd-- pct m- pct p- TUPNI A-
 TPECCA j- 08 tropd-- pct m- pct p- TUPNI A-
 TPECCA j- DEHSILBATSE,DETALER etats-- etats m- TUPNI A-
 TPECCA j- pmci p- TUPNI A-
 TPECCA j- ol o- TUPTUO A-
TIMMOC
3102 51:52:12 62 ceD uhT no detelpmoC #

文件压缩及解压缩命令(4个)

tar

==tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。==

首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录变成一个总的文件;压缩则是将一个大的文件通过一些压缩算法变成一个小文件。

为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

  • 语法
tar(选项)(参数)
  • 选项
-A或--catenate:新增文件到以存在的备份文件;
-B:设置区块大小;
-c或--create:建立新的备份文件;
-C <目录>:这个选项用在解压缩,若要在特定目录解压缩,可以使用这个选项。
-d:记录文件的差别;
-x或--extract或--get:从备份文件中还原文件;
-t或--list:列出备份文件的内容;
-z或--gzip或--ungzip:通过gzip指令处理备份文件;
-Z或--compress或--uncompress:通过compress指令处理备份文件;
-f<备份文件>或--file=<备份文件>:指定备份文件;
-v或--verbose:显示指令执行过程;
-r:添加文件到已经压缩的文件;
-u:添加改变了和现有的文件到已经存在的压缩文件;
-j:支持bzip2解压文件;
-v:显示操作过程;
-l:文件系统边界设置;
-k:保留原有文件不覆盖;
-m:保留文件不被覆盖;
-w:确认压缩文件的正确性;
-p或--same-permissions:用原来的文件权限还原文件;
-P或--absolute-names:文件名使用绝对名称,不移除文件名称前的“/”号;
-N <日期格式> 或 --newer=<日期时间>:只将较指定日期更新的文件保存到备份文件里;
--exclude=<范本样式>:排除符合范本样式的文件。
  • 参数
文件或目录:指定要打包的文件或目录列表
  • 实例
  1. 将文件全部打包成tar包:
tar -cvf log.tar log2012.log    仅打包,不压缩! 
tar -zcvf log.tar.gz log2012.log   打包后,以 gzip 压缩 
tar -jcvf log.tar.bz2 log2012.log  打包后,以 bzip2 压缩 

在选项f之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。 如果加z选项,则以.tar.gz或.tgz来代表gzip压缩过的tar包;如果加j选项,则以.tar.bz2来作为tar包名。

  1. 查阅上述tar包内有哪些文件:
tar -ztvf log.tar.gz
由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上z这个选项了。
  1. 将tar包解压缩:
tar -zxvf /opt/soft/test/log.tar.gz
在预设的情况下,我们可以将压缩档在任何地方解开的
  1. 只将tar内的部分文件解压出来:
tar -zxvf /opt/soft/test/log30.tar.gz log2013.log
我可以透过tar -ztvf来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!
  1. 文件备份下来,并且保存其权限:
tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log
这个-p的属性是很重要的,尤其是当您要保留原本文件的属性时。
  1. 在文件夹当中,比某个日期新的文件才备份:
tar -N "2012/11/13" -zcvf log17.tar.gz test
  1. 备份文件夹内容是排除部分文件:
tar --exclude scf/service -zcvf scf.tar.gz scf/*
  1. 其实最简单的使用 tar 就只要记忆底下的方式即可:
压 缩:tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 询:tar -jtv -f filename.tar.bz2
解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

unzip

==unzip命令用于解压缩由zip命令压缩的“.zip”压缩包。==

  • 语法
unzip(选项)(参数)
  • 选项
-c:将解压缩的结果显示到屏幕上,并对字符做适当的转换;
-f:更新现有的文件;
-l:显示压缩文件内所包含的文件;
-p:与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换;
-t:检查压缩文件是否正确;
-u:与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中;
-v:执行时显示详细的信息;
-z:仅显示压缩文件的备注文字;
-a:对文本文件进行必要的字符转换;
-b:不要对文本文件进行字符转换;
-C:压缩文件中的文件名称区分大小写;
-j:不处理压缩文件中原有的目录路径;
-L:将压缩文件中的全部文件名改为小写;
-M:将输出结果送到more程序处理;
-n:解压缩时不要覆盖原有的文件;
-o:不必先询问用户,unzip执行后覆盖原有的文件;
-P<密码>:使用zip的密码选项;
-q:执行时不显示任何信息;
-s:将文件名中的空白字符转换为底线字符;
-V:保留VMS的文件版本信息;
-X:解压缩时同时回存文件原来的UID/GID;
-d<目录>:指定文件解压缩后所要存储的目录;
-x<文件>:指定不要处理.zip压缩文件中的哪些文件;
-Z:unzip-Z等于执行zipinfo指令。
  • 参数
压缩包:指定要解压的“.zip”压缩包。
  • 实例
  1. 将压缩文件text.zip在当前目录下解压缩。
unzip test.zip
  1. 将压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。
unzip -n test.zip -d /tmp
  1. 查看压缩文件目录,但不解压。
unzip -v test.zip
  1. 将压缩文件test.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件。
unzip -o test.zip -d tmp/

gzip

gzip命令用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多处“.gz”扩展名

gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。gzip不仅可以用来压缩大的、较少使用的文件以节省磁盘空间,还可以和tar命令一起构成Linux操作系统中比较流行的压缩文件格式。据统计,gzip命令对文本文件有60%~70%的压缩率。减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。

  • 语法
gzip(选项)(参数)
  • 选项
-a或——ascii:使用ASCII文字模式;
-d或--decompress或----uncompress:解开压缩文件;
-f或——force:强行压缩文件。不理会文件名称或硬连接是否存在以及该文件是否为符号连接;
-h或——help:在线帮助;
-l或——list:列出压缩文件的相关信息;
-L或——license:显示版本与版权信息;
-n或--no-name:压缩文件时,不保存原来的文件名称及时间戳记;
-N或——name:压缩文件时,保存原来的文件名称及时间戳记;
-q或——quiet:不显示警告信息;
-r或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-S或<压缩字尾字符串>或----suffix<压缩字尾字符串>:更改压缩字尾字符串;
-t或——test:测试压缩文件是否正确无误;
-v或——verbose:显示指令执行过程;
-V或——version:显示版本信息;
-<压缩效率>:压缩效率是一个介于1~9的数值,预设值为“6”,指定愈大的数值,压缩效率就会愈高;
--best:此参数的效果和指定“-9”参数相同;
--fast:此参数的效果和指定“-1”参数相同。
  • 参数
文件列表:指定要压缩的文件列表。

把上例中每个压缩的文件解压,并列出详细的信息

  • 实例
  1. 把test6目录下的每个文件压缩成.gz文件
gzip *
  1. 把上例中每个压缩的文件解压,并列出详细的信息
gzip -dv *
  1. 详细显示例1中每个压缩的文件的信息,并不解压
gzip -l *
  1. 压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz
gzip -r log.tar
  1. 递归的压缩目录
gzip -rv test6

这样,所有test下面的文件都变成了.gz,目录依然存在只是目录里面的文件相应变成了.gz.这就是压缩,和打包不同。因为是对目录操作,所以需要加上-r选项,这样也可以对子目录进行递归了。

  1. 递归地解压目录
gzip -dr test6

zip

==zip命令可以用来解压缩文件,或者对文件进行打包操作。zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件==

  • 语法
zip(选项)(参数)
  • 选项
-A:调整可执行的自动解压缩文件;
-b<工作目录>:指定暂时存放文件的目录;
-c:替每个被压缩的文件加上注释;
-d:从压缩文件内删除指定的文件;
-D:压缩文件内不建立目录名称;
-f:此参数的效果和指定“-u”参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中;
-F:尝试修复已损坏的压缩文件;
-g:将文件压缩后附加在已有的压缩文件之后,而非另行建立新的压缩文件;
-h:在线帮助;
-i<范本样式>:只压缩符合条件的文件;
-j:只保存文件名称及其内容,而不存放任何目录名称;
-J:删除压缩文件前面不必要的数据;
-k:使用MS-DOS兼容格式的文件名称;
-l:压缩文件时,把LF字符置换成LF+CR字符;
-ll:压缩文件时,把LF+cp字符置换成LF字符;
-L:显示版权信息;
-m:将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中;
-n<字尾字符串>:不压缩具有特定字尾字符串的文件;
-o:以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同;
-q:不显示指令执行过程;
-r:递归处理,将指定目录下的所有文件和子目录一并处理;
-S:包含系统和隐藏文件;
-t<日期时间>:把压缩文件的日期设成指定的日期;
-T:检查备份文件内的每个文件是否正确无误;
-u:更换较新的文件到压缩文件内;
-v:显示指令执行过程或显示版本信息;
-V:保存VMS操作系统的文件属性;
-w:在文件名称里假如版本编号,本参数仅在VMS操作系统下有效;
-x<范本样式>:压缩时排除符合条件的文件;
-X:不保存额外的文件属性;
-y:直接保存符号连接,而非该链接所指向的文件,本参数仅在UNIX之类的系统下有效;
-z:替压缩文件加上注释;
-$:保存第一个被压缩文件所在磁盘的卷册名称;
-<压缩效率>:压缩效率是一个介于1~9的数值。
  • 参数
zip压缩包:指定要创建的zip压缩包;
文件列表:指定要压缩的文件列表。
  • 实例
  1. 将/home/Blinux/html/这个目录下所有文件和文件夹打包为当前目录下的html.zip:
zip -q -r html.zip /home/Blinux/html
  1. 上面的命令操作是将绝对地址的文件及文件夹进行压缩,以下给出压缩相对路径目录,比如目前在Bliux这个目录下,执行以下操作可以达到以上同样的效果:
zip -q -r html.zip html
  1. 比如现在我的html目录下,我操作的zip压缩命令是:
zip -q -r html.zip *

信息显示命令(7个)

uname

==uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。==

  • 语法
uname(选项)
  • 选项
-a或--all:显示全部的信息;
-m或--machine:显示电脑类型;
-n或-nodename:显示在网络上的主机名称;
-r或--release:显示操作系统的发行编号;
-s或--sysname:显示操作系统名称;
-v:显示操作系统的版本;
-p或--processor:输出处理器类型或"unknown";
-i或--hardware-platform:输出硬件平台或"unknown";
-o或--operating-system:输出操作系统名称;
--help:显示帮助;
--version:显示版本信息。
  • 实例
使用uname命令查看全部信息:

[root@localhost ~]# uname    #单独使用uname命令时相当于uname -s
Linux

[root@localhost ~]# uname -a
Linux localhost 2.6.18-348.6.1.el5 #1 SMP Tue May 21 15:34:22 EDT 2013 i686 i686 i386 GNU/Linux

[root@localhost ~]# uname -m
i686

[root@localhost ~]# uname -n
localhost

[root@localhost ~]# uname -r
2.6.18-4-686

[root@localhost ~]# uname -s
Linux

[root@localhost ~]# uname -v
#1 SMP Tue May 21 15:34:22 EDT 2013

[root@localhost ~]# uname -p
i686

[root@localhost ~]# uname -i
i386

[root@localhost ~]# uname -o
GNU/Linux

[root@localhost ~]# uname --version
uname (GNU coreutils) 5.97
Copyright (C) 2006 free Software Foundation, Inc.
这是自由软件。您可以按照 GNU GPL 协议 <http://www.gnu.org/licenses/gpl.html> 的条款再发布此软件的副本,但我们无法保证相关法律不对这一情形进行限制。

由 David MacKenzie 编写。

hostname

==hostname命令用于显示和设置系统的主机名称。环境变量HOSTNAME也保存了当前的主机名。在使用hostname命令设置主机名后,系统并不会永久保存新的主机名,重新启动机器之后还是原来的主机名。如果需要永久修改主机名,需要同时修改/etc/hosts和/etc/sysconfig/network的相关内容。==

  • 语法
hostname(选项)(参数)
  • 选项
-v:详细信息模式;
-a:显示主机别名;
-d:显示DNS域名;
-f:显示FQDN名称;
-i:显示主机的ip地址;
-s:显示短主机名称,在第一个点处截断;
-y:显示NIS域名。
  • 参数
主机名:指定要设置的主机名。
  • 实例
[root@AY1307311912260196fcZ ~]# hostname
AY1307311912260196fcZ

dmesg

==dmesg命令被用于检查和控制内核的环形缓冲区。kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在/var/log/dmesg文件里。==

  • 语法
dmesg(选项)
  • 选项
-c:显示信息后,清除ring buffer中的内容;
-s<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小;
-n:设置记录信息的层级。
  • 实例
[root@localhost ~]# dmesg | head
Linux version 2.6.18-348.6.1.el5 (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Tue May 21 15:34:22 EDT 2013
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000010000 - 000000000009f400 (usable)
 BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 000000007f590000 (usable)
 BIOS-e820: 000000007f590000 - 000000007f5e3000 (ACPI NVS)
 BIOS-e820: 000000007f5e3000 - 000000007f5f0000 (ACPI data)
 BIOS-e820: 000000007f5f0000 - 000000007f600000 (reserved)
 BIOS-e820: 00000000e0000000 - 00000000e8000000 (reserved)

file

==file命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。==

  • 语法
file(选项)(参数)
  • 选项
-b:列出辨识结果时,不显示文件名称;
-c:详细显示指令执行过程,便于排错或分析程序执行的情形;
-f<名称文件>:指定名称文件,其内容有一个或多个文件名称时,让file依序辨识这些文件,格式为每列一个文件名称;
-L:直接显示符号连接所指向的文件类别;
-m<魔法数字文件>:指定魔法数字文件;
-v:显示版本信息;
-z:尝试去解读压缩文件的内容。
  • 参数
文件:要确定类型的文件列表,多个文件之间使用空格分开,可以使用shell通配符匹配多个文件。
  • 实例
  1. 显示文件类型
[root@localhost ~]# file install.log
install.log: UTF-8 Unicode text

[root@localhost ~]# file -b install.log      <== 不显示文件名称
UTF-8 Unicode text

[root@localhost ~]# file -i install.log      <== 显示MIME类别。
install.log: text/plain; charset=utf-8

[root@localhost ~]# file -b -i install.log
text/plain; charset=utf-8
  1. 显示符号链接的文件类型
[root@localhost ~]# ls -l /var/mail
lrwxrwxrwx 1 root root 10 08-13 00:11 /var/mail -> spool/mail

[root@localhost ~]# file /var/mail
/var/mail: symbolic link to `spool/mail'

[root@localhost ~]# file -L /var/mail
/var/mail: directory

[root@localhost ~]# file /var/spool/mail
/var/spool/mail: directory

[root@localhost ~]# file -L /var/spool/mail
/var/spool/mail: directory

stat

==stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。==

  • 语法
stat(选项)(参数)
  • 选项
-L:支持符号连接;
-f:显示文件系统状态而非文件状态;
-t:以简洁方式输出信息;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。
  • 参数
文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。
  • 实例
[root@localhost ~]# ls -l myfile
-rw-r--r-- 1 root root 0 2010-10-09 myfile

[root@localhost ~]# stat myfile
file: “myfile”
Size: 0               Blocks: 8          IO Block: 4096   一般空文件
Device: fd00h/64768d    Inode: 194805815   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2010-12-12 12:22:35.000000000 +0800
Modify: 2010-10-09 20:44:21.000000000 +0800
Change: 2010-10-09 20:44:21.000000000 +0800

[root@localhost ~]# stat -f myfile
File: "myfile"
id: 0        Namelen: 255     type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 241555461  free: 232910771  Available: 220442547
Inodes: Total: 249364480  Free: 249139691

[root@localhost ~]# stat -t myfile
myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096

cal

==cal命令用于显示当前日历,或者指定日期的日历。==

  • 语法
cal(选项)(参数)
  • 选项
-l:显示单月输出;
-3:显示临近三个月的日历;
-s:将星期日作为月的第一天;
-m:将星期一作为月的第一天;
-j:显示“julian”日期;
-y:显示当前年的日历。
  • 参数
月:指定月份;
年:指定年份。
  • 实例
  1. 单独执行cal命令会打印出日历:
[root@localhost ~]# cal
    十二月 2013     
日 一 二 三 四 五 六
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

---

[root@localhost ~]# cal -j
        十二月 2013        
  日   一   二   三   四   五   六
335 336 337 338 339 340 341
342 343 344 345 346 347 348
349 350 351 352 353 354 355
356 357 358 359 360 361 362
363 364 365

---

[root@localhost ~]# cal -3
    十一月 2013           十二月 2013            一月 2014      
日 一 二 三 四 五 六  日 一 二 三 四 五 六  日 一 二 三 四 五 六
                1  2   1  2  3  4  5  6  7            1  2  3  4
 3  4  5  6  7  8  9   8  9 10 11 12 13 14   5  6  7  8  9 10 11
10 11 12 13 14 15 16  15 16 17 18 19 20 21  12 13 14 15 16 17 18
17 18 19 20 21 22 23  22 23 24 25 26 27 28  19 20 21 22 23 24 25
24 25 26 27 28 29 30  29 30 31              26 27 28 29 30 31  

搜索文件命令(4个)

which

==which命令用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录。which指令会在环境变量$PATH设置的目录里查找符合条件的文件。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。==

  • 语法
which(选项)(参数)
  • 选项
-n<文件名长度>:制定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名;
-p<文件名长度>:与-n参数相同,但此处的<文件名长度>包含了文件的路径;
-w:指定输出时栏位的宽度;
-V:显示版本信息。
  • 参数
指令名:指令名列表。
  • 实例

查找文件、显示命令路径:

[root@localhost ~]# which pwd
/bin/pwd

[root@localhost ~]#  which adduser
/usr/sbin/adduser

说明:which是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以,不同的 PATH 配置内容所找到的命令当然不一样的!

whereis

==whereis命令用来定位指令的二进制程序、源代码文件和man手册页等相关文件的路径。==

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。

  • 语法
whereis(选项)(参数)
  • 选项
-b:只查找二进制文件;
-B<目录>:只在设置的目录下查找二进制文件;
-f:不显示文件名前的路径名称;
-m:只查找说明文件;
-M<目录>:只在设置的目录下查找说明文件;
-s:只查找原始代码文件;
-S<目录>只在设置的目录下查找原始代码文件;
-u:查找不包含指定类型的文件。
  • 参数
指令名:要查找的二进制程序、源文件和man手册页的指令名。
  • 实例

将相关的文件都查找出来

[root@localhost ~]# whereis tomcat
tomcat:

[root@localhost ~]# whereis svn
svn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz

说明:tomcat没安装,找不出来,svn安装找出了很多相关文件

只将二进制文件查找出来

[root@localhost ~]# whereis -b svn
svn: /usr/bin/svn /usr/local/svn

[root@localhost ~]# whereis -m svn
svn: /usr/share/man/man1/svn.1.gz

[root@localhost ~]# whereis -s svn
svn:

说明:whereis -m svn查出说明文档路径,whereis -s svn找source源文件。

locate/slocate

==locate命令和slocate命令都用来查找文件或目录。==

locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/locatedb,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

  • 语法
locate/slocate(选项)(参数)
  • 选项
-d<目录>或--database=<目录>:指定数据库所在的目录;
-u:更新slocate数据库;
--help:显示帮助;
--version:显示版本信息。
  • 参数
查找字符串:要查找的文件名中含有的字符串。
  • 实例

搜索etc目录下所有以sh开头的文件:

locate /etc/sh

搜索用户主目录下,所有以m开头的文件:

locate ~/m

搜索用户主目录下,所有以m开头的文件,并且忽略大小写:

locate -i ~/m

用户管理命令(10个)

useradd

==useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。==

在Slackware中,adduser指令是个script程序,利用交谈的方式取得输入的用户帐号资料,然后再交由真正建立帐号的useradd命令建立新用户,如此可方便管理员建立用户帐号。在Red Hat Linux中,adduser命令则是useradd命令的符号连接,两者实际上是同一个指令。

  • 语法
useradd(选项)(参数)
  • 选项
-c<备注>:加上备注文字。备注文字会保存在passwd的备注栏位中;
-d<登入目录>:指定用户登入时的启始目录;
-D:变更预设值;
-e<有效期限>:指定帐号的有效期限;
-f<缓冲天数>:指定在密码过期后多少天即关闭该帐号;
-g<群组>:指定用户所属的群组;
-G<群组>:指定用户所属的附加群组;
-m:自动建立用户的登入目录;
-M:不要自动建立用户的登入目录;
-n:取消建立以用户名称为名的群组;
-r:建立系统帐号;
-s<shell>:指定用户登入后所使用的shell;
-u<uid>:指定用户id。
  • 参数
用户名:要创建的用户名。
  • 实例
新建用户加入组:

useradd –g sales jack –G company,employees    //-g:加入主要组、-G:加入次要组
建立一个新用户账户,并设置ID:

useradd caojh -u 544
需要说明的是,设定ID值时尽量要大于500,以免冲突。因为Linux安装后会建立一些特殊用户,一般0到499之间的值留给bin、mail这样的系统账号。

usermod

==usermod命令用于修改用户的基本信息。usermod命令不允许你改变正在线上的使用者帐号名称。当usermod命令用来改变user id,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NIS server须在server上更动相关的NIS设定。==

  • 语法
usermod(选项)(参数)
  • 选项
-c<备注>:修改用户帐号的备注文字;
-d<登入目录>:修改用户登入时的目录;
-e<有效期限>:修改帐号的有效期限;
-f<缓冲天数>:修改在密码过期后多少天即关闭该帐号;
-g<群组>:修改用户所属的群组;
-G<群组>;修改用户所属的附加群组;
-l<帐号名称>:修改用户帐号名称;
-L:锁定用户密码,使密码无效;
-s<shell>:修改用户登入后所使用的shell;
-u<uid>:修改用户ID;
-U:解除密码锁定。
  • 参数
登录名:指定要修改信息的用户登录名。
  • 实例
  1. 将newuser2添加到组staff中:
usermod -G staff newuser2
  1. 修改newuser的用户名为newuser1:
usermod -l newuser1 newuser
  1. 锁定账号newuser1:
usermod -L newuser1
  1. 解除对newuser1的锁定:
usermod -U newuser1

userdel

==userdel命令用于删除给定的用户,以及与用户相关的文件。若不加选项,则仅删除用户帐号,而不删除相关文件。==

  • 语法
userdel(选项)(参数)
  • 选项
-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件。
  • 参数
用户名:要删除的用户名。
  • 实例

userdel命令很简单,比如我们现在有个用户linuxde,其家目录位于/var目录中,现在我们来删除这个用户:

userdel linuxde       //删除用户linuxde,但不删除其家目录及文件;
userdel -r linuxde    //删除用户linuxde,其家目录及文件一并删除;

请不要轻易用-r选项;他会删除用户的同时删除用户所有的文件和目录,切记如果用户目录下有重要的文件,在删除前请备份。

其实也有最简单的办法,但这种办法有点不安全,也就是直接在/etc/passwd中删除您想要删除用户的记录;但最好不要这样做,/etc/passwd是极为重要的文件,可能您一不小心会操作失误。

groupadd

passwd

chage

id

su

visudo

sudo

基础网络操作命令(10个)

telnet

ssh

scp

wget

ping

route

ifconfig

ifup

ifdown

netstat

==netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。==

语法选项
netstat [选项]

-a或--all:显示所有连线中的Socket; 
-A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址; 
-c或--continuous:持续列出网络状态; 
-C或--cache:显示路由器配置的快取信息; 
-e或--extend:显示网络其他相关信息; 
-F或--fib:显示FIB; 
-g或--groups:显示多重广播功能群组组员名单; 
-h或--help:在线帮助; 
-i或--interfaces:显示网络界面信息表单; 
-l或--listening:显示监控中的服务器的Socket; 
-M或--masquerade:显示伪装的网络连线; 
-n或--numeric:直接使用ip地址,而不通过域名服务器; 
-N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称; 
-o或--timers:显示计时器; 
-p或--programs:显示正在使用Socket的程序识别码和程序名称; 
-r或--route:显示Routing Table; 
-s或--statistice:显示网络工作信息统计表; 
-t或--tcp:显示TCP传输协议的连线状况; 
-u或--udp:显示UDP传输协议的连线状况; 
-v或--verbose:显示指令执行过程; 
-V或--version:显示版本信息; 
-w或--raw:显示RAW传输协议的连线状况; 
-x或--unix:此参数的效果和指定"-A unix"参数相同; 
--ip或--inet:此参数的效果和指定"-A inet"参数相同。
  • 例子
  1. 列出所有端口情况
[root@xiesshavip002 ~]# netstat -a      # 列出所有端口
[root@xiesshavip002 ~]# netstat -at     # 列出所有TCP端口
[root@xiesshavip002 ~]# netstat -au     # 列出所有UDP端口
  1. 列出所有处于监听状态的 Sockets
[root@xiesshavip002 ~]# netstat -l   # 只显示监听端口
[root@xiesshavip002 ~]# netstat -lt  # 显示监听TCP端口
[root@xiesshavip002 ~]# netstat -lu  # 显示监听UDP端口
[root@xiesshavip002 ~]# netstat -lx  # 显示监听UNIX端口
  1. 显示每个协议的统计信息
[root@xiesshavip002 ~]# netstat -s     # 显示所有端口的统计信息
[root@xiesshavip002 ~]# netstat -st    # 显示所有TCP的统计信息
[root@xiesshavip002 ~]# netstat -su    # 显示所有UDP的统计信息
  1. 显示 PID 和进程名称
[root@xiesshavip002 ~]# netstat -p
  1. 显示核心路由信息
[root@xiesshavip002 ~]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         gateway         0.0.0.0         UG        0 0          0 eth0
192.168.130.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
[root@xiesshavip002 ~]# netstat -rn   # 显示数字格式,不查询主机名称
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.130.1   0.0.0.0         UG        0 0          0 eth0
192.168.130.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0
  1. 查看端口和服务
[root@xiesshavip002 ~]# netstat -antp | grep ssh
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      734/sshd            
tcp        0     52 192.168.130.20:22       119.129.118.189:58737   ESTABLISHED 1846/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      734/sshd            
[root@xiesshavip002 ~]# netstat -antp | grep 22
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      734/sshd            
tcp        0     52 192.168.130.20:22       119.129.118.189:58737   ESTABLISHED 1846/sshd: root@pts 
tcp6       0      0 :::22                   :::*                    LISTEN      734/sshd            
[root@xiesshavip002 ~]#
netstat --help
[root@xiesshavip002 ~]# netstat --help
usage: netstat [-vWeenNcCF] [<Af>] -r         netstat {-V|--version|-h|--help}
       netstat [-vWnNcaeol] [<Socket> ...]
       netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]

        -r, --route              display routing table
        -I, --interfaces=<Iface> display interface table for <Iface>
        -i, --interfaces         display interface table
        -g, --groups             display multicast group memberships
        -s, --statistics         display networking statistics (like SNMP)
        -M, --masquerade         display masqueraded connections

        -v, --verbose            be verbose
        -W, --wide               don't truncate IP addresses
        -n, --numeric            don't resolve names
        --numeric-hosts          don't resolve host names
        --numeric-ports          don't resolve port names
        --numeric-users          don't resolve user names
        -N, --symbolic           resolve hardware names
        -e, --extend             display other/more information
        -p, --programs           display PID/Program name for sockets
        -o, --timers             display timers
        -c, --continuous         continuous listing

        -l, --listening          display listening server sockets
        -a, --all                display all sockets (default: connected)
        -F, --fib                display Forwarding Information Base (default)
        -C, --cache              display routing cache instead of FIB
        -Z, --context            display SELinux security context for sockets

  <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-w|--raw} {-x|--unix}
           --ax25 --ipx --netrom
  <AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
  List of possible address families (which support routing):
    inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) 
    x25 (CCITT X.25) 

深入网络操作命令(6个)

lsof

route

mail

mutt

nslookup

dig

有关磁盘文件系统的命令(8个)

mount

umount

df

du

fsck

dd

dumpe2fs

dump

关机和查看系统信息的命令(3个)

shutdown

halt

init

系统管理相关命令(8个)

uptime

top

free

vmstat

mpstat

iostat

sar

chkconfig

系统安全相关命令(10个)

chmod

chown

chgrp

chage

passwd

su

sudo

umask

chattr

lsattr

查看系统用户登陆信息的命令(7个)

whoami

who

w

last

lastlog

users

finger

查看硬件信息相关命令(8个)

ifconfig

free

fdisk

ethtool

mii-tool

dmidecode

dmesg

lspci

系统性能监视高级命令 (12个)

内存

top

[root@slave1 ~]# top
top - 22:18:35 up  1:26,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997956 total,   227900 free,   595000 used,   175056 buff/cache
KiB Swap:  5119996 total,  5119996 free,        0 used.   222056 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
   550 root      20   0  298716   6124   4792 S  0.3  0.6   0:05.79 vmtoolsd                                                                                
  1098 zabbix    20   0   80876   2184   1240 S  0.3  0.2   0:00.50 zabbix_agentd                                                                           
  2031 root      20   0  161960   2220   1564 R  0.3  0.2   0:00.04 top                                                                                     
     1 root      20   0  128060   6608   4088 S  0.0  0.7   0:01.64 systemd                                                                                 
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                                                                
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.10 ksoftirqd/0                                                                             
     5 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   0:00.11 kworker/u256:0                                                                          
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                                                                             
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh          

第一行:任务队列信息,同 uptime 命令的执行结果。

22:41:55 (当前系统时间)

up 5 min(系统运行时间)

1 user (当前登录用户数)

load average: 0.08, 0.09, 0.05 (系统的平均负载数,表示 1分钟、5分钟、15分钟到现在的平均数)

第二行:进程统计信息

71 total (系统当前总进程总数)

1 running (正在运行的进程数)

70 sleeping (睡眠进程数)

0 stopped (停止进程数)

0 zombie (僵尸进程数)

第三行:CPU 统计信息

0.0%us (用户空间CPU占用率)

0.2%sy (内核空间CPU占用率)

0.0%ni (用户进程空间改变过优先级的进程CPU的占用率)

99.8%id (空闲CPU占有率)

0.0%wa (等待输入输出的CPU时间百分比)

0.0%hi (硬件中断请求)

0.0%si (软件中断请求)

0.0%st (分配给运行在其它虚拟机上的任务的实际 CPU时间)

us: is meaning of "user CPU time"

sy: is meaning of "system CPU time"

ni: is meaning of" nice CPU time

id: is meaning of "idle"

wa: is meaning of "iowait"

hi:is meaning of "hardware irq

si : is meaning of "software irq

st : is meaning of "steal time"

第四行:内存状态

1018628k total (物理内存总量 1G)

201588k used (已使用的内存 200M)

817040k free (空闲内存 800M)

23112k buffers (内核缓存使用23M)

第五行 swap交换分区信息

1044476k total (交换分区总量 1G)

0 k used (已使用交换分区内存 0)

1044476k free (空闲交换分区 1G)

79948k cached (缓冲交换区 80M)

  1. 进程信息

PID (进程id)

USER (进程所有者的用户名)

PR (进程优先级)

NI (nice值。负值表示高优先级,正值表示低优先级)

VIRT (进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES)

RES (进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA)

SHR (共享内存大小,单位kb)

S (进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程)

%CPU (上次更新到现在的CPU时间占用百分比)

%MEM (进程使用的物理内存百分比)

TIME+ (进程使用的CPU时间总计,单位1/100秒)

COMMAND (进程名称[命令名/命令行])

free

[root@slave1 ~]# free 
              total        used        free      shared  buff/cache   available
Mem:         997956      597432      140664        8004      259860      216048
Swap:       5119996         264     5119732

image.png

第一部分Mem行:

  • total 内存总数: 15.7G
  • used 已经使用的内存数: 15.6G
  • free 空闲的内存数: 93M
  • shared 当前已经废弃不用,总是0
  • buffers Buffer 缓存内存数: 298M
  • cached Page 缓存内存数:14G

对操作系统来讲是Mem的参数,buffers/cached 都是属于被使用,所以它认为free只有93M。
我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

第二部分(-/+ buffers/cache):

  • (-buffers/cache) used内存数:1.2G (指的第一部分Mem行中的used – buffers – cached)
  • (+buffers/cache) free内存数: 14.4G (指的第一部分Mem行中的free + buffers + cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.
对应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。

第三部分Swap交换分区:

大家自行Google了解。

vmstat

[root@slave1 ~]# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229024   2080 172084    0    0   432    27  256  737  1  4 95  0  0
2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
root@slave1 ~]# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229180   2080 172152    0    0   230    15  224  506  1  2 97  0  0
 0  0      0 229204   2080 172152    0    0     0     0  203  249  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  177  233  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  189  239  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  188  243  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  167  224  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  172  230  0  1 99  0  0
这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

r : 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b : 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd : 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free : 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff : Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache : cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi : 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo : 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in : 每秒CPU的中断次数,包括时间中断

cs : 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us : 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id : 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt : 等待IO CPU时间。

sar

[root@slave1 ~]# sar
Linux 3.10.0-862.el7.x86_64 (slave1)    07/17/2019  _x86_64_    (1 CPU)

10:46:24 AM       LINUX RESTART

10:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:00:01 AM     all      0.04      0.00      0.23      0.00      0.00     99.73
11:10:01 AM     all      0.04      0.00      0.15      0.00      0.00     99.81
11:20:01 AM     all      0.10      0.00      0.31      0.02      0.00     99.58
11:30:01 AM     all      1.44      0.00      1.10      0.01      0.00     97.45
11:40:01 AM     all      3.66      0.05      1.56      0.02      0.00     94.72
11:50:01 AM     all      0.03      0.00      0.12      0.00      0.00     99.85
Average:        all      0.88      0.01      0.58      0.01      0.00     98.53

CPU:

all : 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
    如果要查看二进制文件test中的内容,需键入如下sar命令:

sar -u -f test

mpstat

[root@slave1 ~]# mpstat 
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

09:00:52 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
09:00:52 AM  all    0.12    0.00    0.38    0.01    0.00    0.01    0.00    0.00    0.00   99.47

它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息,
而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。
以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值

让我们看一看这些列值的含义:

%user 表示处理用户进程所使用 CPU 的百分比。用户进程是用于应用程序(如 Oracle 数据库)的非内核进程。

%nice 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。

%system 表示内核进程使用的 CPU 百分比

%iowait 表示等待进行 I/O 所使用的 CPU 时间百分比

%irq 表示用于处理系统中断的 CPU 百分比

%soft 表示用于软件中断的 CPU 百分比

%idle 显示 CPU 的空闲时间

%intr/s 显示每秒 CPU 接收的中断总数

当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计,
而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题

针对 Oracle 用户的用法

与 vmstat 相似,mpstat 命令还产生与 CPU 有关的统计信息,因此所有与 CPU 问题有关的讨论也都适用于 mpstat。
当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,
您知道在当前负载下 I/O 子系统出现了某些问题。该信息对于解决 Oracle 数据库性能问题非常方便

iostat

[root@slave1 ~]# iostat
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.36    0.01    0.00   99.52

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.17        26.54         6.05     272257      62046
scd0              0.00         0.10         0.00       1028          0

avg-cpu段:

%user :在用户级别运行所使用的CPU的百分比.

%nice: nice操作所使用的CPU的百分比.

%sys: 在系统级别(kernel)运行所使用CPU的百分比.

%iowait: CPU等待硬件I/O时,所占用CPU百分比.

%idle : CPU空闲时间的百分比.

Device段 :

tps : 每秒钟发送到的I/O请求数.

Blk_read /s : 每秒读取的block数.

Blk_wrtn/s : 每秒写入的block数.

Blk_read : 读入的block总数.

Blk_wrtn : 写入的block总数.

ps -aux

[root@slave1 ~]# ps -aux 
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.6 128060  6608 ?        Ss   06:33   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    06:33   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    06:33   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   06:33   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    06:33   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    06:33   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    06:33   0:00 [rcu_bh]

==1. ps常用参数详解==

1)ps a 显示现行终端机下的所有程序,包括其他用户的程序

2)ps -A 显示所有进程。

3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

4)ps -e 此参数的效果和指定"A"参数相同。

5)ps e 列出程序时,显示每个程序所使用的环境变量。

6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

7)ps -H 显示树状结构,表示程序间的相互关系。

8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

9)ps s 采用程序信号的格式显示程序状况。

10)ps S 列出程序时,包括已中断的子程序资料。

11)ps -t<终端机编号>  指定终端机编号,并列出属于该终端机的程序的状况。

12)ps u  以用户为主的格式来显示程序状况。

13)ps x  显示所有程序,不以终端机来区分。
==2. ps 注释解释==

USER 用户名

UID 用户ID(User ID)

PID 进程ID(Process ID)

PPID 父进程的进程ID(Parent Process id)

SID 会话ID(Session id)

%CPU 进程的cpu占用率

%MEM 进程的内存占用率

VSZ 进程所使用的虚存的大小(Virtual Size)

RSS 进程使用的驻留集大小或者是实际内存的大小,Kbytes字节。

TTY 与进程关联的终端(tty)

STAT 进程的状态:进程状态使用字符表示的(STAT的状态码)

R 运行 Runnable (on run queue) 正在运行或在运行队列中等待。

S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号。

I 空闲 Idle

Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。

D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。

T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。

P 等待交换页

W 无驻留页 has no resident pages 没有足够的记忆体分页可分配。

X 死掉的进程

< 高优先级进程 高优先序的进程

N 低优先 级进程 低优先序的进程

L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内

s进程的领导者(在它之下有子进程);

l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)

+位于后台的进程组

START 进程启动时间和日期

TIME 进程使用的总cpu时间

COMMAND 正在执行的命令行命令

NI 优先级(Nice)

PRI 进程优先级编号(Priority)

WCHAN 进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。

FLAGS 与进程相关的数字标识

sar

[root@slave1 ~]# sar
Linux 3.10.0-862.el7.x86_64 (slave1)    07/17/2019  _x86_64_    (1 CPU)

10:46:24 AM       LINUX RESTART

10:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:00:01 AM     all      0.04      0.00      0.23      0.00      0.00     99.73
11:10:01 AM     all      0.04      0.00      0.15      0.00      0.00     99.81
11:20:01 AM     all      0.10      0.00      0.31      0.02      0.00     99.58
11:30:01 AM     all      1.44      0.00      1.10      0.01      0.00     97.45
11:40:01 AM     all      3.66      0.05      1.56      0.02      0.00     94.72
11:50:01 AM     all      0.03      0.00      0.12      0.00      0.00     99.85
Average:        all      0.88      0.01      0.58      0.01      0.00     98.53

CPU:

all : 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
    如果要查看二进制文件test中的内容,需键入如下sar命令:
    sar -u -f test

CPU

top

[root@slave1 ~]# top
top - 22:18:35 up  1:26,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997956 total,   227900 free,   595000 used,   175056 buff/cache
KiB Swap:  5119996 total,  5119996 free,        0 used.   222056 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
   550 root      20   0  298716   6124   4792 S  0.3  0.6   0:05.79 vmtoolsd                                                                                
  1098 zabbix    20   0   80876   2184   1240 S  0.3  0.2   0:00.50 zabbix_agentd                                                                           
  2031 root      20   0  161960   2220   1564 R  0.3  0.2   0:00.04 top                                                                                     
     1 root      20   0  128060   6608   4088 S  0.0  0.7   0:01.64 systemd                                                                                 
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                                                                
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.10 ksoftirqd/0                                                                             
     5 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   0:00.11 kworker/u256:0                                                                          
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                                                                             
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh          

第一行:任务队列信息,同 uptime 命令的执行结果。

22:41:55 (当前系统时间)

up 5 min(系统运行时间)

1 user (当前登录用户数)

load average: 0.08, 0.09, 0.05 (系统的平均负载数,表示 1分钟、5分钟、15分钟到现在的平均数)

第二行:进程统计信息

71 total (系统当前总进程总数)

1 running (正在运行的进程数)

70 sleeping (睡眠进程数)

0 stopped (停止进程数)

0 zombie (僵尸进程数)

第三行:CPU 统计信息

0.0%us (用户空间CPU占用率)

0.2%sy (内核空间CPU占用率)

0.0%ni (用户进程空间改变过优先级的进程CPU的占用率)

99.8%id (空闲CPU占有率)

0.0%wa (等待输入输出的CPU时间百分比)

0.0%hi (硬件中断请求)

0.0%si (软件中断请求)

0.0%st (分配给运行在其它虚拟机上的任务的实际 CPU时间)

us: is meaning of "user CPU time"

sy: is meaning of "system CPU time"

ni: is meaning of" nice CPU time

id: is meaning of "idle"

wa: is meaning of "iowait"

hi:is meaning of "hardware irq

si : is meaning of "software irq

st : is meaning of "steal time"

第四行:内存状态

1018628k total (物理内存总量 1G)

201588k used (已使用的内存 200M)

817040k free (空闲内存 800M)

23112k buffers (内核缓存使用23M)

第五行 swap交换分区信息

1044476k total (交换分区总量 1G)

0 k used (已使用交换分区内存 0)

1044476k free (空闲交换分区 1G)

79948k cached (缓冲交换区 80M)

  1. 进程信息

PID (进程id)

USER (进程所有者的用户名)

PR (进程优先级)

NI (nice值。负值表示高优先级,正值表示低优先级)

VIRT (进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES)

RES (进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA)

SHR (共享内存大小,单位kb)

S (进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程)

%CPU (上次更新到现在的CPU时间占用百分比)

%MEM (进程使用的物理内存百分比)

TIME+ (进程使用的CPU时间总计,单位1/100秒)

COMMAND (进程名称[命令名/命令行])

htop

image.png
htop 类似于 top 命令,但可以让你在垂直和水平方向上滚动,所以你可以看到系统上运行的所有进程,
以及他们完整的命令行。可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing)。
htop 是 Linux 系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要
ncurses。与 Linux传统的 top 相比,htop 更加人性化。它可让用户交互式操作,支持颜色主题,可横向
或纵向滚动浏览进程列表,并支持鼠标操作。与 top 相比,htop有以下优点:

  • 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
  • 在启动上,比top 更快。
  • 杀进程时不需要输入进程号。
  • htop 支持鼠标操作。
  • top 已经很老了。

可以看到总共分四个区域:

  • 第一区域:CPU、内存、Swap的使用情况;
  • 第二区域:任务、线程、平均负载及系统运行时间的信息。平均负载部分提供了三个数字,这仅仅表示的是过去的5分钟、10分钟和15分钟系统的平均负载而已,在单核的系统中平均负载为1表示的是百分之百的 CPU 利用率。最后,运行时间 (uptime)标示的数字是从系统启动起到当前的运行总时间。
  • 第三区域:当前系统中的所有进程。各列说明:

PID:进程标志号,是非零正整数

USER:进程所有者的用户名

PR:进程的优先级别

NI:进程的优先级别数值

VIRT:进程占用的虚拟内存值

RES:进程占用的物理内存值

SHR:进程使用的共享内存值

S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数

%CPU:该进程占用的CPU使用率

%MEM:该进程占用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间

COMMAND:进程启动的启动命令名称

  • 第四区域:当前界面中F1-F10功能键中定义的快捷功能。即 底部菜单栏。

    vmstat

[root@slave1 ~]# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229024   2080 172084    0    0   432    27  256  737  1  4 95  0  0
2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
root@slave1 ~]# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229180   2080 172152    0    0   230    15  224  506  1  2 97  0  0
 0  0      0 229204   2080 172152    0    0     0     0  203  249  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  177  233  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  189  239  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  188  243  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  167  224  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  172  230  0  1 99  0  0
这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

r : 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b : 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd : 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free : 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff : Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache : cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi : 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo : 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in : 每秒CPU的中断次数,包括时间中断

cs : 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us : 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id : 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt : 等待IO CPU时间。

mpstat

[root@slave1 ~]# mpstat 
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

09:00:52 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
09:00:52 AM  all    0.12    0.00    0.38    0.01    0.00    0.01    0.00    0.00    0.00   99.47

它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息,
而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。
以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值

让我们看一看这些列值的含义:

%user 表示处理用户进程所使用 CPU 的百分比。用户进程是用于应用程序(如 Oracle 数据库)的非内核进程。

%nice 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。

%system 表示内核进程使用的 CPU 百分比

%iowait 表示等待进行 I/O 所使用的 CPU 时间百分比

%irq 表示用于处理系统中断的 CPU 百分比

%soft 表示用于软件中断的 CPU 百分比

%idle 显示 CPU 的空闲时间

%intr/s 显示每秒 CPU 接收的中断总数

当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计,
而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题

针对 Oracle 用户的用法

与 vmstat 相似,mpstat 命令还产生与 CPU 有关的统计信息,因此所有与 CPU 问题有关的讨论也都适用于 mpstat。
当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,
您知道在当前负载下 I/O 子系统出现了某些问题。该信息对于解决 Oracle 数据库性能问题非常方便

iostat

[root@slave1 ~]# iostat
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.36    0.01    0.00   99.52

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.17        26.54         6.05     272257      62046
scd0              0.00         0.10         0.00       1028          0

avg-cpu段:

%user :在用户级别运行所使用的CPU的百分比.

%nice: nice操作所使用的CPU的百分比.

%sys: 在系统级别(kernel)运行所使用CPU的百分比.

%iowait: CPU等待硬件I/O时,所占用CPU百分比.

%idle : CPU空闲时间的百分比.

Device段 :

tps : 每秒钟发送到的I/O请求数.

Blk_read /s : 每秒读取的block数.

Blk_wrtn/s : 每秒写入的block数.

Blk_read : 读入的block总数.

Blk_wrtn : 写入的block总数.

sar

[root@slave1 ~]# sar
Linux 3.10.0-862.el7.x86_64 (slave1)    07/17/2019  _x86_64_    (1 CPU)

10:46:24 AM       LINUX RESTART

10:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:00:01 AM     all      0.04      0.00      0.23      0.00      0.00     99.73
11:10:01 AM     all      0.04      0.00      0.15      0.00      0.00     99.81
11:20:01 AM     all      0.10      0.00      0.31      0.02      0.00     99.58
11:30:01 AM     all      1.44      0.00      1.10      0.01      0.00     97.45
11:40:01 AM     all      3.66      0.05      1.56      0.02      0.00     94.72
11:50:01 AM     all      0.03      0.00      0.12      0.00      0.00     99.85
Average:        all      0.88      0.01      0.58      0.01      0.00     98.53

CPU:

all : 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
    如果要查看二进制文件test中的内容,需键入如下sar命令:
    sar -u -f test

I/O

vmstat

[root@slave1 ~]# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229024   2080 172084    0    0   432    27  256  737  1  4 95  0  0
2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
root@slave1 ~]# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229180   2080 172152    0    0   230    15  224  506  1  2 97  0  0
 0  0      0 229204   2080 172152    0    0     0     0  203  249  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  177  233  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  189  239  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  188  243  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  167  224  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  172  230  0  1 99  0  0
这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

r : 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b : 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd : 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free : 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff : Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache : cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi : 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo : 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in : 每秒CPU的中断次数,包括时间中断

cs : 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us : 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id : 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt : 等待IO CPU时间。

mpstat

[root@slave1 ~]# mpstat 
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

09:00:52 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
09:00:52 AM  all    0.12    0.00    0.38    0.01    0.00    0.01    0.00    0.00    0.00   99.47

它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息, 而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。 以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值

让我们看一看这些列值的含义:

%user 表示处理用户进程所使用 CPU 的百分比。用户进程是用于应用程序(如 Oracle 数据库)的非内核进程。

%nice 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。

%system 表示内核进程使用的 CPU 百分比

%iowait 表示等待进行 I/O 所使用的 CPU 时间百分比

%irq 表示用于处理系统中断的 CPU 百分比

%soft 表示用于软件中断的 CPU 百分比

%idle 显示 CPU 的空闲时间

%intr/s 显示每秒 CPU 接收的中断总数

当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计, 而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题

针对 Oracle 用户的用法

与 vmstat 相似,mpstat 命令还产生与 CPU 有关的统计信息,因此所有与 CPU 问题有关的讨论也都适用于 mpstat。 当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时, 您知道在当前负载下 I/O 子系统出现了某些问题。该信息对于解决 Oracle 数据库性能问题非常方便。

iostat

[root@slave1 ~]# iostat
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.36    0.01    0.00   99.52

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.17        26.54         6.05     272257      62046
scd0              0.00         0.10         0.00       1028          0

avg-cpu段:

%user :在用户级别运行所使用的CPU的百分比.

%nice: nice操作所使用的CPU的百分比.

%sys: 在系统级别(kernel)运行所使用CPU的百分比.

%iowait: CPU等待硬件I/O时,所占用CPU百分比.

%idle : CPU空闲时间的百分比.

Device段 :

tps : 每秒钟发送到的I/O请求数.

Blk_read /s : 每秒读取的block数.

Blk_wrtn/s : 每秒写入的block数.

Blk_read : 读入的block总数.

Blk_wrtn : 写入的block总数.

CPU:

all : 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。 如果要查看二进制文件test中的内容,需键入如下sar命令: sar -u -f test

sar

[root@slave1 ~]# sar
Linux 3.10.0-862.el7.x86_64 (slave1)    07/17/2019  _x86_64_    (1 CPU)

10:46:24 AM       LINUX RESTART

10:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:00:01 AM     all      0.04      0.00      0.23      0.00      0.00     99.73
11:10:01 AM     all      0.04      0.00      0.15      0.00      0.00     99.81
11:20:01 AM     all      0.10      0.00      0.31      0.02      0.00     99.58
11:30:01 AM     all      1.44      0.00      1.10      0.01      0.00     97.45
11:40:01 AM     all      3.66      0.05      1.56      0.02      0.00     94.72
11:50:01 AM     all      0.03      0.00      0.12      0.00      0.00     99.85
Average:        all      0.88      0.01      0.58      0.01      0.00     98.53

ss

ss是Socket Statistics的缩写。顾名思义,==ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容==。==ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效==。

当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。

ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。

  • ==ss常见命令参数==
Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help           this message
   -V, --version        output version information
   -n, --numeric        don't resolve service names
   -r, --resolve       resolve host names
   -a, --all            display all sockets
   -l, --listening      display listening socket
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes      show process using socket
   -i, --info           show internal TCP information
   -s, --summary        show socket usage summary
 
   -4, --ipv4          display only IP version 4 sockets
   -6, --ipv6          display only IP version 6 sockets
   -0, --packet display PACKET sockets
   -t, --tcp            display only TCP sockets
   -u, --udp            display only UDP sockets
   -d, --dccp           display only DCCP sockets
   -w, --raw            display only RAW sockets
   -x, --unix           display only Unix domain sockets
   -f, --family=FAMILY display sockets of type FAMILY
 
   -A, --query=QUERY, --socket=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]
 
   -D, --diag=FILE      Dump raw information about TCP sockets to FILE
   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]
  • ==常用的命令展示==
ss -t -a 【显示TCP连接】

  -t: tcp

  -a:  all

  -l:  listening         【ss -l列出所有打开的网络连接端口】

  -s:  summary        【显示 Sockets 摘要】

  -p:  progress

  -n:  numeric         【不解析服务名称】

  -r:  resolve        【解析服务名称】

  -m: memory        【显示内存情况】
  1. 查看进程使用的socket
ss –pl

image.png

  1. 找出打开套接字/端口应用程序
ss -lp | grep 22

image.png

  1. 显示所有UDP Sockets
ss -u –a

image.png

  1. 显示所有状态为established的SMTP连接
ss -o state 'established'
ss -o state established '( dport = :smtp or sport = :smtp )'

image.png

  1. 列举出处于 FIN-WAIT-1状态的源端口为 80或者 443,目标网络为 193.233.7/24所有 tcp套接字
ss -o state FIN-WAIT-1 dst 192.168.25.100/24
  1. 匹配远程地址和端口号
ss dst 192.168.25.100
ss dst 192.168.25.100:50460
  1. 匹配本地地址和端口号
ss src 192.168.25.140
  1. ss 和 netstat 效率对比
time netstat –an 【效率低】

image.png

time ss    【效率高】

image.png

进程

ipcs

==ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息。==

  • 语法
ipcs(选项)
  • 选项
-a:显示全部可显示的信息;
-q:显示活动的消息队列信息;
-m:显示活动的共享内存信息;
-s:显示活动的信号量信息。
  • 实例
ipcs -a
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x7401833d 2654208    root      600        4          0                       
0x00000000 3145729    root      600        4194304    9          dest         
0x7401833c 2621442    root      600        4          0                       
0xd201012b 3080195    root      600        1720       2

ipcrm

==ipcrm命令用来删除一个或更多的消息队列、信号量集或者共享内存标识。==

  • 语法
ipcrm [ -m SharedMemoryID ] [ -M SharedMemoryKey ] [ -q MessageID ] [ -Q MessageKey ] [ -s SemaphoreID ] [ -S SemaphoreKey ]
  • 选项
-m SharedMemory id 删除共享内存标识 SharedMemoryID。与 SharedMemoryID 有关联的共享内存段以及数据结构都会在最后一次拆离操作后删除。
-M SharedMemoryKey 删除用关键字 SharedMemoryKey 创建的共享内存标识。与其相关的共享内存段和数据结构段都将在最后一次拆离操作后删除。
-q MessageID 删除消息队列标识 MessageID 和与其相关的消息队列和数据结构。
-Q MessageKey 删除由关键字 MessageKey 创建的消息队列标识和与其相关的消息队列和数据结构。
-s SemaphoreID 删除信号量标识 SemaphoreID 和与其相关的信号量集及数据结构。
-S SemaphoreKey 删除由关键字 SemaphoreKey 创建的信号标识和与其相关的信号量集和数据结构。
msgctl、shmctl 和 semctl 子例程提供了删除操作的细节。标识和关键字可以用 ipcs 命令找到。
  • 示例
    如果要删除和 SharedMemoryID 18602 相关的共享内存段,请输入:
ipcrm -m 18602

lsof

==lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。==

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

  • 语法
lsof(选项)
  • 选项
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
  • 实例
lsof
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so
init          1 root  mem       REG                8,2    95464    7824116 /lib64/libselinux.so.1
init          1 root  mem       REG                8,2   247496    7823947 /lib64/libsepol.so.1
init          1 root   10u     FIFO               0,17                1233 /dev/initctl
migration     2 root  cwd       DIR                8,2     4096          2 /
migration     2 root  rtd       DIR                8,2     4096          2 /
migration     2 root  txt   unknown                                        /proc/2/exe
ksoftirqd     3 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     3 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     3 root  txt   unknown                                        /proc/3/exe
migration     4 root  cwd       DIR                8,2     4096          2 /
migration     4 root  rtd       DIR                8,2     4096          2 /
migration     4 root  txt   unknown                                        /proc/4/exe
ksoftirqd     5 root  cwd       DIR                8,2     4096          2 /
ksoftirqd     5 root  rtd       DIR                8,2     4096          2 /
ksoftirqd     5 root  txt   unknown                                        /proc/5/exe
events/0      6 root  cwd       DIR                8,2     4096          2 /
events/0      6 root  rtd       DIR                8,2     4096          2 /
events/0      6 root  txt   unknown                                        /proc/6/exe
events/1      7 root  cwd       DIR                8,2     4096          2 /
  • ==lsof输出各列信息的意义如下:==
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
  • ==文件描述符列表:==
cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
lnn:library references (AIX);
er:FD information error (see NAME column);
jld:jail directory (FreeBSD);
ltx:shared library text (code and data);
mxx :hex memory-mapped type number xx.
m86:DOS Merge mapped file;
mem:memory-mapped file;
mmap:memory-mapped device;
pd:parent directory;
rtd:root directory;
tr:kernel trace file (OpenBSD);
v86  VP/ix mapped file;
0:表示标准输出
1:表示标准输入
2:表示标准错误
  • ==一般在标准输出、标准错误、标准输入后还跟着文件状态模式:==

u:表示该文件被打开并处于读取/写入模式。
r:表示该文件被打开并处于只读模式。
w:表示该文件被打开并处于。
空格:表示该文件的状态模式为unknow,且没有锁定。
-:表示该文件的状态模式为unknow,且被锁定。
  • ==同时在文件状态模式后面,还跟着相关的锁:==
N:for a Solaris NFS lock of unknown type;
r:for read lock on part of the file;
R:for a read lock on the entire file;
w:for a write lock on part of the file;(文件的部分写锁)
W:for a write lock on the entire file;(整个文件的写锁)
u:for a read and write lock of any length;
U:for a lock of unknown type;
x:for an SCO OpenServer Xenix lock on part      of the file;
X:for an SCO OpenServer Xenix lock on the      entire file;
space:if there is no lock.
  • ==文件类型:==
DIR:表示目录。
CHR:表示字符类型。
BLK:块设备类型。
UNIX: UNIX 域套接字。
FIFO:先进先出 (FIFO) 队列。
IPv4:网际协议 (IP) 套接字。
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

strace

==strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的。当然strace与专业的调试工具比如说gdb之类的是没法相比的,因为它不是一个专业的调试器。==

strace的最简单的用法就是执行一个指定的命令,在指定的命令结束之后它也就退出了。在命令执行的过程中,strace会记录和解析命令进程的所有系统调用以及这个进程所接收到的所有的信号值。

  • 语法
strace  [  -dffhiqrtttTvxx  ] [ -acolumn ] [ -eexpr ] ...
    [ -ofile ] [-ppid ] ...  [ -sstrsize ] [ -uusername ]
    [ -Evar=val ] ...  [ -Evar  ]...
    [ command [ arg ...  ] ]

strace  -c  [ -eexpr ] ...  [ -Ooverhead ] [ -Ssortby ]
    [ command [ arg...  ] ]
  • 选项
-c 统计每一系统调用的所执行的时间,次数和出错的次数等.
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column 设置返回值的输出位置.默认 为40.
-e expr 指定一个表达式,用来控制如何跟踪.格式:[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open 表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file 只跟踪有关文件操作的系统调用.
-e trace=process 只跟踪有关进程控制的系统调用.
-e trace=network 跟踪与网络有关的所有系统调用.
-e strace=signal 跟踪所有与系统信号有关的 系统调用
-e trace=ipc 跟踪所有与进程通讯有关的系统调用
-e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set 将指定的系统调用的参数以十六进制显示.
-e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5
-e write=set 输出写入到指定文件中的数据.
-o filename 将strace的输出写入文件filename
-p pid 跟踪指定的进程pid.
-s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username 以username的UID和GID执行被跟踪的命令
  • 实例
    追踪系统调用
  1. 现在我们做一个很简单的程序来演示strace的基本用法。这个程序的C语言代码如下:
# filename test.c
#include <stdio.h>
 
int main()
{
    int a;
    scanf("%d", &a);
    printf("%09d\n", a);
    return 0;
}
  1. 然后我们用gcc -o test test.c编译一下,得到一个可执行的文件test。然后用strace调用执行:
strace ./test
  1. 执行期间会要求你输入一个整数,我们输入99,最后得到如下的结果:
// 直接执行test的结果
oracle@orainst[orcl]:~ $./test

// 执行的结果
99
000000099

// 通过strace执行test的结果
oracle@orainst[orcl]:~ $strace ./test

// strace的trace结果
execve("./test", ["./test"], [/* 41 vars */]) = 0
uname({sys="Linux", node="orainst.desktop.mycompany.com", ...}) = 0
brk(0)                                  = 0x8078000
fstat64(3, {st_mode=S_IFREG|0644, st_size=65900, ...}) = 0
old_mmap(NULL, 65900, PROT_READ, MAP_PRIVATE, 3, 0) = 0xbf5ef000
close(3)                                = 0
open("/lib/tls/libc.so.6", O_RDONLY)    = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200X\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1571692, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5ee000
old_mmap(NULL, 1275340, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0xa02000
old_mmap(0xb34000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x132000) = 0xb34000
old_mmap(0xb37000, 9676, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb37000
close(3)                                = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xbf5ee740, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0xbf5ef000, 65900)               = 0
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5ff000
read(0, 99
"99\n", 1024)                   = 3
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5fe000
write(1, "000000099\n", 10000000099
)             = 10
munmap(0xbf5fe000, 4096)                = 0
exit_group(0)                           = ?

从trace结构可以看到,系统首先调用execve开始一个新的进行,接着进行些环境的初始化操作,最后停顿在”read(0,”上面,这也就是执行到了我们的scanf函数,等待我们输入数字呢,在输入完99之后,在调用write函数将格式化后的数值”000000099″输出到屏幕,最后调用exit_group退出进行,完成整个程序的执行过程。

跟踪信号传递

  1. 我们还是使用上面的那个test程序,来观察进程接收信号的情况。还是先strace ./test,等到等待输入的画面的时候不要输入任何东西,然后打开另外一个窗口,输入如下的命令
killall test
  1. 这时候就能看到我们的程序推出了,最后的trace结果如下:
oracle@orainst[orcl]:~
$strace ./test

execve("./test", ["./test"], [/* 41 vars */]) = 0
uname({sys="Linux", node="orainst.desktop.mycompany.com", ...}) = 0
brk(0)                                  = 0x9ae2000
old_mmap(NULL, 65900, PROT_READ, MAP_PRIVATE, 3, 0) = 0xbf5ef000
close(3)                                = 0
open("/lib/tls/libc.so.6", O_RDONLY)    = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200X\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1571692, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5ee000
old_mmap(NULL, 1275340, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x2e9000
old_mmap(0x41b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x132000) = 0x41b000
old_mmap(0x41e000, 9676, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x41e000
close(3)                                = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xbf5ee740, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0xbf5ef000, 65900)               = 0
fstat64(0, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5ff000
read(0, 0xbf5ff000, 1024)               = ? ERESTARTSYS (To be restarted)
--- SIGTERM (Terminated) @ 0 (0) ---
+++ killed by SIGTERM +++

trace中很清楚的告诉你test进程”+++ killed by SIGTERM +++”。

系统调用统计
strace不光能追踪系统调用,通过使用参数-c,它还能将进程所有的系统调用做一个统计分析给你,下面就来看看strace的统计,这次我们执行带-c参数的strace:

strace -c ./test

最后能得到这样的trace结果:

oracle@orainst[orcl]:~
$strace -c ./test

---
execve("./test", ["./test"], [/* 41 vars */]) = 0
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 45.90    0.000140           5        27        25 open
 34.43    0.000105           4        24        21 stat64
  7.54    0.000023           5         5           old_mmap
  2.62    0.000008           8         1           munmap
  1.97    0.000006           6         1           uname
  1.97    0.000006           2         3           fstat64
  1.64    0.000005           3         2         1 read
  1.31    0.000004           2         2           close
  0.98    0.000003           3         1           brk
  0.98    0.000003           3         1           mmap2
  0.66    0.000002           2         1           set_thread_area
------ ----------- ----------- --------- --------- ----------------
100.00    0.000305                    68        47 total

这里很清楚的告诉你调用了那些系统函数,调用次数多少,消耗了多少时间等等这些信息,这个对我们分析一个程序来说是非常有用的。

  • 常用参数说明

除了-c参数之外,strace还提供了其他有用的参数给我们,让我们能很方便的得到自己想要的信息,下面就对那些常用的参数一一做个介绍。

重定向输出

参数-o用在将strace的结果输出到文件中,如果不指定-o参数的话,默认的输出设备是STDERR,也就是说使用”-o filename”和” 2>filename”的结果是一样的。

# 这两个命令都是将strace结果输出到文件test.txt中
strace -c -o test.txt ./test
strace -c ./test  2>test.txt

对系统调用进行计时

strace可以使用参数-T将每个系统调用所花费的时间打印出来,每个调用的时间花销现在在调用行最右边的尖括号里面。

oracle@orainst[orcl]:~
$strace -T ./test

// 这里只摘录部分结果
read(0, 1
"1\n", 1024)                    = 2 <2.673455>
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 <0.000014>
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xbf5fe000 <0.000017>
write(1, "000000001\n", 10000000001
)             = 10 <0.000016>
munmap(0xbf5fe000, 4096)                = 0 <0.000020>
exit_group(0)                           = ?

系统调用的时间

这是一个很有用的功能,strace会将每次系统调用的发生时间记录下来,只要使用-t/tt/ttt三个参数就可以看到效果了,具体的例子可以自己去尝试。

参数 输出样式 说明
-t 10:33:04 exit_group(0) 输出结果精确到秒
-tt 10:33:48.159682 exit_group(0) 输出结果精确到微妙
-ttt 1262169244.788478 exit_group(0) 精确到微妙,而且时间表示为unix时间戳

截断输出

-s参数用于指定trace结果的每一行输出的字符串的长度,下面看看test程序中-s参数对结果有什么影响,现指定-s为20,然后在read的是是很我们输入一个超过20个字符的数字串

strace -s 20 ./test

read(0, 2222222222222222222222222      // 我们输入的2一共有25个
"22222222222222222222"..., 1024) = 26  // 而我们看到的结果中2只有20个

trace一个现有的进程

strace不光能自己初始化一个进程进行trace,还能追踪现有的进程,参数-p就是取这个作用的,用法也很简单,具体如下。

strace -p pid
  • 综合例子

说了那么多的功能和参数,现在我们来一个实用点的,就是研究下Oracle的lgwr进程,看看这个进程是不是像文档所说的那样没3s钟写一次log文件,考虑到lgwr写日志的触发条件比较多,我们需要找一个空闲的Oracle实例做这个实验。

我们先要得到lgwr进程的pid,运行下面的命令

ps -ef|grep lgwr

oracle    5912     1  0 Nov12 ?        00:14:56 ora_lgwr_orcl

得到lgwr的pid是5912,现在启动strace,然后将trace的几个输出到lgwr.txt文件中,执行下面的命令

strace -tt -s 10 -o lgwr.txt -p 5912

过一会之后停止strace,然后查看结果。由于输出的结果比较多,为了方便我们只看Oracle写入log文件时用的pwrite函数的调用

grep pwrite\(20 lgwr.txt

等等,为什么grep的时候用的是”pwrite(2″呢?,因为我知道我这个机器打开的当前的log文件的句柄编号都是2开始的。具体查找方法是先使用下面的语句找出当前活动的日志文件都有哪些:

select member, v$log.status from v$log, v$logfile
where v$log.group#=v$logfile.group#;

得到

MEMBER                                             STATUS
-------------------------------------------------- ----------------
/db/databases/orcl/redo-01-a/redo-t01-g03-m1.log    INACTIVE
/db/databases/orcl/redo-03-a/redo-t01-g03-m2.log    INACTIVE
/db/databases/orcl/redo-02-a/redo-t01-g02-m1.log    CURRENT
/db/databases/orcl/redo-04-a/redo-t01-g02-m2.log    CURRENT
/db/databases/orcl/redo-01-a/redo-t01-g01-m1.log    INACTIVE
/db/databases/orcl/redo-03-a/redo-t01-g01-m2.log    INACTIVE
/db/databases/orcl/redo-02-a/redo-t01-g04-m1.log    INACTIVE
/db/databases/orcl/redo-04-a/redo-t01-g04-m2.log    INACTIVE

然后到/proc中去找打开文件的句柄:

ll /proc/.5912/fd/

得到

lrwx------    1 oracle   dba            64 Dec 30 10:55 18 -> /db/databases/orcl/redo-01-a/redo-t01-g01-m1.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 19 -> /db/databases/orcl/redo-03-a/redo-t01-g01-m2.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 20 -> /db/databases/orcl/redo-02-a/redo-t01-g02-m1.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 21 -> /db/databases/orcl/redo-04-a/redo-t01-g02-m2.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 22 -> /db/databases/orcl/redo-01-a/redo-t01-g03-m1.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 23 -> /db/databases/orcl/redo-03-a/redo-t01-g03-m2.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 24 -> /db/databases/orcl/redo-02-a/redo-t01-g04-m1.log
lrwx------    1 oracle   dba            64 Dec 30 10:55 25 -> /db/databases/orcl/redo-04-a/redo-t01-g04-m2.log

现在能看到我机器当前日志文件的句柄分别是20和21。

现在我们得到如下结果

11:13:55.603245 pwrite(20, "\1\"\0\0J!"..., 1536, 4363264) = 1536
11:13:55.603569 pwrite(21, "\1\"\0\0J!"..., 1536, 4363264) = 1536
11:13:55.606888 pwrite(20, "\1\"\0\0M!"..., 1536, 4364800) = 1536
11:13:55.607172 pwrite(21, "\1\"\0\0M!"..., 1536, 4364800) = 1536
11:13:55.607934 pwrite(20, "\1\"\0\0P!"..., 1536, 4366336) = 1536
11:13:55.608199 pwrite(21, "\1\"\0\0P!"..., 1536, 4366336) = 1536
11:13:55.610260 pwrite(20, "\1\"\0\0S!"..., 1536, 4367872) = 1536
11:13:55.610530 pwrite(21, "\1\"\0\0S!"..., 1536, 4367872) = 1536
11:14:00.602446 pwrite(20, "\1\"\0\0V!"..., 1536, 4369408) = 1536
11:14:00.602750 pwrite(21, "\1\"\0\0V!"..., 1536, 4369408) = 1536
11:14:00.606386 pwrite(20, "\1\"\0\0Y!"..., 1536, 4370944) = 1536
11:14:00.606676 pwrite(21, "\1\"\0\0Y!"..., 1536, 4370944) = 1536
11:14:00.607900 pwrite(20, "\1\"\0\0\\"..., 1024, 4372480) = 1024
11:14:00.608161 pwrite(21, "\1\"\0\0\\"..., 1024, 4372480) = 1024
11:14:00.608816 pwrite(20, "\1\"\0\0^!"..., 1024, 4373504) = 1024
11:14:00.609071 pwrite(21, "\1\"\0\0^!"..., 1024, 4373504) = 1024
11:14:00.611142 pwrite(20, "\1\"\0\0`!"..., 1536, 4374528) = 1536
11:14:00.611454 pwrite(21, "\1\"\0\0`!"..., 1536, 4374528) = 1536
11:14:05.602804 pwrite(20, "\1\"\0\0c!"..., 1024, 4376064) = 1024
11:14:05.603119 pwrite(21, "\1\"\0\0c!"..., 1024, 4376064) = 1024
11:14:05.607731 pwrite(20, "\1\"\0\0e!"..., 1024, 4377088) = 1024
11:14:05.608020 pwrite(21, "\1\"\0\0e!"..., 1024, 4377088) = 1024
11:14:05.608690 pwrite(20, "\1\"\0\0g!"..., 1024, 4378112) = 1024
11:14:05.608962 pwrite(21, "\1\"\0\0g!"..., 1024, 4378112) = 1024
11:14:05.611022 pwrite(20, "\1\"\0\0i!"..., 1536, 4379136) = 1536
11:14:05.611283 pwrite(21, "\1\"\0\0i!"..., 1536, 4379136) = 1536

负载

uptime

==uptime命令能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。==

  • 语法
uptime(选项)
  • 选项
-V:显示指令的版本信息。
  • 实例

使用uptime命令查看系统负载:

[root@LinServ-1 ~]# uptime -V    #显示uptime命令版本信息
procps version 3.2.7

[root@LinServ-1 ~]# uptime
 15:31:30 up 127 days,  3:00,  1 user,  load average: 0.00, 0.00, 0.00

显示内容说明:
``
15:31:30 //系统当前时间
up 127 days, 3:00 //主机已运行时间,时间越大,说明你的机器越稳定。
1 user //用户连接数,是总连接数而不是用户数
load average: 0.00, 0.00, 0.00 // 系统平均负载,统计最近1,5,15分钟的系统平均负载

那么什么是系统平均负载呢? 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。

如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。

如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。
### mount 
==**mount命令用于加载文件系统到指定的加载点。此命令的最常用于挂载cdrom,使我们可以访问cdrom中的数据,因为你将光盘插入cdrom中,Linux并不会自动挂载,必须使用Linux mount命令来手动完成挂载。**==

- **语法**

mount(选项)(参数)

- **选项**

-V:显示程序版本;
-l:显示已加载的文件系统列表;
-h:显示帮助信息并退出;
-v:冗长模式,输出指令执行的详细信息;
-n:加载没有写入文件“/etc/mtab”中的文件系统;
-r:将文件系统加载为只读模式;
-a:加载文件“/etc/fstab”中描述的所有文件系统。

- **参数**

设备文件名:指定要加载的文件系统对应的设备名;
加载点:指定加载点目录。

- **实例**

mount -t auto /dev/cdrom /mnt/cdrom
mount: mount point /mnt/cdrom does not exist /mnt/cdrom目录不存在,需要先创建。

cd /mnt
-bash: cd: /mnt: No such file or directory

mkdir -p /mnt/cdrom 创建/mnt/cdrom目录
ls
bin dev home lib media mnt proc sbin srv tmp var
boot etc initrd lost+found misc opt root selinux sys usr

mount -t auto /dev/cdrom /mnt/cdrom 挂载cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only 挂载成功

ll /mnt/cdrom 查看cdrom里面内容
total 859
dr-xr-xr-x 4 root root 2048 Sep 4 2005 CentOS
-r--r--r-- 2 root root 8859 Mar 19 2005 centosdocs-man.css
-r--r--r-- 9 root root 18009 Mar 1 2005 GPL
dr-xr-xr-x 2 root root 241664 May 7 02:32 headers
dr-xr-xr-x 4 root root 2048 May 7 02:23 images
dr-xr-xr-x 2 root root 4096 May 7 02:23 isolinux
dr-xr-xr-x 2 root root 18432 May 2 18:50 NOTES
-r--r--r-- 2 root root 5443 May 7 01:49 RELEASE-NOTES-en.html
dr-xr-xr-x 2 root root 2048 May 7 02:34 repodata
-r--r--r-- 9 root root 1795 Mar 1 2005 rpm-GPG-KEY
-r--r--r-- 2 root root 1795 Mar 1 2005 RPM-GPG-KEY-centos4
-r--r--r-- 1 root root 571730 May 7 01:39 yumgroups.xml

### umount 
==**umount命令用于卸载已经加载的文件系统。利用设备名或挂载点都能umount文件系统,不过最好还是通过挂载点卸载,以免使用绑定挂载(一个设备,多个挂载点)时产生混乱。**==

- **语法**

umount(选项)(参数)

- **选项**

-a:卸除/etc/mtab中记录的所有文件系统;
-h:显示帮助;
-n:卸除时不要将信息存入/etc/mtab文件中;
-r:若无法成功卸除,则尝试以只读的方式重新挂入文件系统;
-t<文件系统类型>:仅卸除选项中所指定的文件系统;
-v:执行时显示详细的信息;
-V:显示版本信息。

- **参数**

文件系统:指定要卸载的文件系统或者其对应的设备文件名。

- **实例**

下面两条命令分别通过设备名和挂载点卸载文件系统,同时输出详细信息:

通过设备名卸载

umount -v /dev/sda1
/dev/sda1 umounted

通过挂载点卸载

umount -v /mnt/mymount/
/tmp/diskboot.img umounted

如果设备正忙,卸载即告失败。卸载失败的常见原因是,某个打开的shell当前目录为挂载点里的某个目录:

umount -v /mnt/mymount/
umount: /mnt/mymount: device is busy
umount: /mnt/mymount: device is busy

有时,导致设备忙的原因并不好找。碰到这种情况时,可以用lsof列出已打开文件,然后搜索列表查找待卸载的挂载点:

lsof | grep mymount 查找mymount分区里打开的文件
bash 9341 francois cwd DIR 8,1 1024 2 /mnt/mymount
从上面的输出可知,mymount分区无法卸载的原因在于,francois运行的PID为9341的bash进程。


对付系统文件正忙的另一种方法是执行延迟卸载:

umount -vl /mnt/mymount/ 执行延迟卸载

延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等到设备不再繁忙时才清理所有相关资源。卸载可移动存储介质还可以用eject命令。下面这条命令会卸载cd并弹出CD:

eject /dev/cdrom 卸载并弹出CD

### df du 
==**df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。**==

- **语法**

df(选项)(参数)

- **选项**

-a或--all:包含全部的文件系统;
--block-size=<区块大小>:以指定的区块大小来显示区块数目;
-h或--human-readable:以可读性较高的方式来显示信息;
-H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
-i或--inodes:显示inode的信息;
-k或--kilobytes:指定区块大小为1024字节;
-l或--local:仅显示本地端的文件系统;
-m或--megabytes:指定区块大小为1048576字节;
--no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
-P或--portability:使用POSIX的输出格式;
--sync:在取得磁盘使用信息前,先执行sync指令;
-t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
-T或--print-type:显示文件系统的类型;
-x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
--help:显示帮助;
--version:显示版本信息。

- **参数**

文件:指定文件系统上的文件。

- **实例**

查看系统磁盘设备,默认是KB为单位:

[root@LinServ-1 ~]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda2 146294492 28244432 110498708 21% /
/dev/sda1 1019208 62360 904240 7% /boot
tmpfs 1032204 0 1032204 0% /dev/shm
/dev/sdb1 2884284108 218826068 2518944764 8% /data1

使用-h选项以KB以上的单位来显示,可读性高:

[root@LinServ-1 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 140G 27G 106G 21% /
/dev/sda1 996M 61M 884M 7% /boot
tmpfs 1009M 0 1009M 0% /dev/shm
/dev/sdb1 2.7T 209G 2.4T 8% /data1
查看全部文件系统:

[root@LinServ-1 ~]# df -a
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda2            146294492  28244432 110498708  21% /
proc                         0         0         0   -  /proc
sysfs                        0         0         0   -  /sys
devpts                       0         0         0   -  /dev/pts
/dev/sda1              1019208     62360    904240   7% /boot
tmpfs                  1032204         0   1032204   0% /dev/shm
/dev/sdb1            2884284108 218826068 2518944764   8% /data1
none                         0         0         0   -  /proc/sys/fs/binfmt_misc
### fsck 
==**fsck命令被用于检查并且试图修复文件系统中的错误。当文件系统发生错误四化,可用fsck指令尝试加以修复。**==

- **语法**

fsck(选项)(参数)

- **选项**

-a:自动修复文件系统,不询问任何问题;
-A:依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统;
-N:不执行指令,仅列出实际执行会进行的动作;
-P:当搭配"-A"参数使用时,则会同时检查所有的文件系统;
-r:采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式;
-R:当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查;
-s:依序执行检查作业,而非同时执行;
-t<文件系统类型>:指定要检查的文件系统类型;
-T:执行fsck指令时,不显示标题信息;
-V:显示指令执行过程。

- **参数**

文件系统:指定要查看信息的文件系统。

- **实例**

linux的文件系统损坏会导致linux不正常关机,出错的时候如果系统告诉你是哪一块硬盘的分区有问题,比如是/dev/hda2,接着用如下的命令去对付它:

fsck -y /dev/hda2

结束后使用reboot命令重启系统这样就好了!

如果不知道时哪个地方出了问题,可以直接:

fsck

在随后的多个确认对话框中输入:y

结束后同样使用reboot命令重启系统这样就好了!
### dd 
==**dd命令用于复制文件并对原文件的内容进行转换和格式化处理。dd命令功能很强大的,对于一些比较底层的问题,使用dd命令往往可以得到出人意料的效果。用的比较多的还是用dd来备份裸设备。但是不推荐,如果需要备份oracle裸设备,可以使用rman备份,或使用第三方软件备份,使用dd的话,管理起来不太方便。**==

建议在有需要的时候使用dd 对物理磁盘操作,如果是文件系统的话还是使用tar backup cpio等其他命令更加方便。另外,使用dd对磁盘操作时,最好使用块设备文件。

- **语法**

dd(选项)

- **选项**

bs=<字节数>:将 ibs(输入)与 obs(输出)设成指定的字节数;
cbs=<字节数>:转换时,每次只转换指定的字节数;
conv=<关键字>:指定文件转换的方式;
count=<区块数>:仅读取指定的区块数;
ibs=<字节数>:每次读取的字节数;
obs=<字节数>:每次输出的字节数;
of=<文件>:输出到文件;
seek=<区块数>:一开始输出时,跳过指定的区块数;
skip=<区块数>:一开始读取时,跳过指定的区块数;
--help:帮助;
--version:显示版本信息。

- **实例**

[root@localhost text]# dd if=/dev/zero of=sun.txt bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

[root@localhost text]# du -sh sun.txt
1.1M sun.txt


该命令创建了一个1M大小的文件sun.txt,其中参数解释:

- if 代表输入文件。如果不指定if,默认就会从stdin中读取输入。
- of 代表输出文件。如果不指定of,默认就会将stdout作为默认输出。
- bs 代表字节为单位的块大小。
- count 代表被复制的块数。
- /dev/zero 是一个字符设备,会不断返回0值字节(\0)。

块大小可以使用的计量单位表


单元大小| 代码
---|---
字节(1B)| c
字节(2B)| w
块(512B)|    b
千字节(1024B)  |k
兆字节(1024KB)|    M
吉字节(1024MB)|    G

以上命令可以看出dd命令来测试内存操作速度:

1048576 bytes (1.0 MB) copied, 0.006107 seconds, 172 MB/s

### dumpe2fs 
==**dumpe2fs命令用于打印“ext2/ext3”文件系统的超级块和快组信息。**==

- **语法**

dumpe2fs(选项)(参数)

- **选项**

-b:打印文件系统中预留的块信息;
-ob<超级块>:指定检查文件系统时使用的超级块;
-OB<块大小>:检查文件系统时使用的指定的块大小;
-h:仅显示超级块信息;
-i:从指定的文件系统映像文件中读取文件系统信息;
-x:以16进制格式打印信息块成员。

- **参数**

文件系统:指定要查看信息的文件系统。


- **实例**

dumpe2fs /dev/hda1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /
last mounted on:
Filesystem UUID: 845ccd40-1f3b-4729-a63d-cb80f51b082a
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 5242880
Block count: 5241817
Reserved block count: 262090
free blocks: 4434157
Free inodes: 5170836
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 1022
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 32768
Inode blocks per group: 1024
Filesystem created: Sun Mar 24 02:09:14 2013
Last mount time: Thu Aug 1 16:42:07 2013
Last write time: Thu Aug 1 16:42:07 2013
Mount count: 10
Maximum mount count: -1
Last checked: Sun Mar 24 02:09:14 2013
Check interval: 0 ()
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 128
Journal inode: 8
First orphan inode: 3735559
Default directory hash: tea
Directory Hash Seed: e3f7162e-1194-4161-805d-763db89dbc69
Journal backup: inode blocks
Journal size: 128M

Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-2
Reserved GDT blocks at 3-1024
Block bitmap at 1025 (+1025), Inode bitmap at 1026 (+1026)
Inode table at 1027-2050 (+1027)
0 free blocks, 32757 free inodes, 2 directories
Free blocks:
Free inodes: 12-32768


### dump
==**dump命令用于备份ext2或者ext3文件系统。可将目录或整个文件系统备份至指定的设备,或备份成一个大文件。**==

- **语法**

dump(选项)(参数)

- **选项**

-0123456789:备份的层级;
-b<区块大小>:指定区块的大小,单位为KB;
-B<区块数目>:指定备份卷册的区块数目;
-c:修改备份磁带预设的密度与容量;
-d<密度>:设置磁带的密度。单位为BPI;
-f<设备名称>:指定备份设备;
-h<层级>:当备份层级等于或大于指定的层级时,将不备份用户标示为“nodump”的文件;
-n:当备份工作需要管理员介入时,向所有“operator”群组中的使用者发出通知;
-s<磁带长度>:备份磁带的长度,单位为英尺;
-T<日期>:指定备份的时间与日期;
-u:备份完毕后,在/etc/dumpdates中记录备份的文件系统、层级、日期与时间等;
-w:与-W类似,但仅显示需要备份的文件;
-W:显示需要备份的文件及其最后一次备份的层级、时间与日期。

- **参数**

备份源:指定要备份的文件、目录或者文件系统。

- **实例**

1. 将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为0并在/etc/dumpdates中记录相关信息:

‍dump -0u -f /tmp/homeback.bak /home

2. 将/home目录所有内容备份到/tmp/homeback.bak文件中,备份层级为1(只备份上次使用层次0备份后发生过改变的数据)并在/etc/dumpdates中记录相关信息:

dump -1u -f /tmp/homeback.bak /home

通过dump命令的备份层级,可实现完整+增量备份、完整+差异备份,在配合crontab可以实现无人值守备份。
# 关机和查看系统信息的命令(3个)
## shutdown
==**shutdown命令用来系统关机命令。shutdown指令可以关闭所有程序,并依用户的需要,进行重新开机或关机的动作。**==

- **语法**

shutdown(选项)(参数)

- **选项**

-c:当执行“shutdown -h 11:50”指令时,只要按+键就可以中断关机的指令;
-f:重新启动时不执行fsck;
-F:重新启动时执行fsck;
-h:将系统关机;
-k:只是送出信息给所有用户,但不会实际关机;
-n:不调用init程序进行关机,而由shutdown自己进行;
-r:shutdown之后重新启动;
-t<秒数>:送出警告信息和删除信息之间要延迟多少秒。

- **参数**

[时间]:设置多久时间后执行shutdown指令;
[警告信息]:要传送给所有登入用户的信息。

- **实例**

指定现在立即关机:

shutdown -h now

指定5分钟后关机,同时送出警告信息给登入用户:

shutdown +5 "System will shutdown after 5 minutes"

## halt 
==**halt命令用来关闭正在运行的Linux操作系统。halt命令会先检测系统的runlevel,若runlevel为0或6,则关闭系统,否则即调用shutdown来关闭系统。**==

- **语法**

halt(选项)

- **选项**

-d:不要在wtmp中记录;
-f:不论目前的runlevel为何,不调用shutdown即强制关闭系统;
-i:在halt之前,关闭全部的网络界面;
-n:halt前,不用先执行sync;
-p:halt之后,执行poweroff;
-w:仅在wtmp中记录,而不实际结束系统。

- **实例**

halt -p //关闭系统后关闭电源。
halt -d //关闭系统,但不留下纪录。

## init
==**init命令是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。**==

- **语法**

init(选项)(参数)

- **选项**

-b:不执行相关脚本而直接进入单用户模式;
-s:切换到单用户模式。

- **参数**

运行等级:指定Linux系统要切换到的运行等级。

- **实例**

几个常用的命令

查看系统进程命令:ps -ef | head
查看init的配置文件:more /etc/inittab
查看系统当前运行的级别:runlevel

**运行级别**

到底什么是运行级呢?简单的说,运行级就是操作系统当前正在运行的功能级别。这个级别从0到6 ,具有不同的功能。你也可以在/etc/inittab中查看它的英文介绍。

0 停机(千万不能把initdefault 设置为0)

1 单用户模式

2 多用户,没有 NFS(和级别3相似,会停止部分服务)

3 完全多用户模式

4 没有用到

5 x11(Xwindow)

6 重新启动(千万不要把initdefault 设置为6)

# 系统管理相关命令(8个)
## uptime 
==**uptime命令能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。**==

- **语法**

uptime(选项)

- **选项**

-V:显示指令的版本信息。

- **实例**

使用uptime命令查看系统负载:

[root@LinServ-1 ~]# uptime -V #显示uptime命令版本信息
procps version 3.2.7

[root@LinServ-1 ~]# uptime
15:31:30 up 127 days, 3:00, 1 user, load average: 0.00, 0.00, 0.00
```

显示内容说明:

15:31:30             //系统当前时间
up 127 days,  3:00   //主机已运行时间,时间越大,说明你的机器越稳定。
1 user               //用户连接数,是总连接数而不是用户数
load average: 0.00, 0.00, 0.00         //
系统平均负载,统计最近1,5,15分钟的系统平均负载

那么什么是系统平均负载呢? 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。

如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。

如果你的linux主机是1个双核CPU的话,当Load Average 为6的时候说明机器已经被充分使用了。

top

[root@slave1 ~]# top
top - 22:18:35 up  1:26,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 112 total,   1 running, 111 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   997956 total,   227900 free,   595000 used,   175056 buff/cache
KiB Swap:  5119996 total,  5119996 free,        0 used.   222056 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                 
   550 root      20   0  298716   6124   4792 S  0.3  0.6   0:05.79 vmtoolsd                                                                                
  1098 zabbix    20   0   80876   2184   1240 S  0.3  0.2   0:00.50 zabbix_agentd                                                                           
  2031 root      20   0  161960   2220   1564 R  0.3  0.2   0:00.04 top                                                                                     
     1 root      20   0  128060   6608   4088 S  0.0  0.7   0:01.64 systemd                                                                                 
     2 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kthreadd                                                                                
     3 root      20   0       0      0      0 S  0.0  0.0   0:00.10 ksoftirqd/0                                                                             
     5 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   0:00.11 kworker/u256:0                                                                          
     7 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/0                                                                             
     8 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh          

第一行:任务队列信息,同 uptime 命令的执行结果。

22:41:55 (当前系统时间)

up 5 min(系统运行时间)

1 user (当前登录用户数)

load average: 0.08, 0.09, 0.05 (系统的平均负载数,表示 1分钟、5分钟、15分钟到现在的平均数)

第二行:进程统计信息

71 total (系统当前总进程总数)

1 running (正在运行的进程数)

70 sleeping (睡眠进程数)

0 stopped (停止进程数)

0 zombie (僵尸进程数)

第三行:CPU 统计信息

0.0%us (用户空间CPU占用率)

0.2%sy (内核空间CPU占用率)

0.0%ni (用户进程空间改变过优先级的进程CPU的占用率)

99.8%id (空闲CPU占有率)

0.0%wa (等待输入输出的CPU时间百分比)

0.0%hi (硬件中断请求)

0.0%si (软件中断请求)

0.0%st (分配给运行在其它虚拟机上的任务的实际 CPU时间)

us: is meaning of "user CPU time"

sy: is meaning of "system CPU time"

ni: is meaning of" nice CPU time

id: is meaning of "idle"

wa: is meaning of "iowait"

hi:is meaning of "hardware irq

si : is meaning of "software irq

st : is meaning of "steal time"

第四行:内存状态

1018628k total (物理内存总量 1G)

201588k used (已使用的内存 200M)

817040k free (空闲内存 800M)

23112k buffers (内核缓存使用23M)

第五行 swap交换分区信息

1044476k total (交换分区总量 1G)

0 k used (已使用交换分区内存 0)

1044476k free (空闲交换分区 1G)

79948k cached (缓冲交换区 80M)

  1. 进程信息

PID (进程id)

USER (进程所有者的用户名)

PR (进程优先级)

NI (nice值。负值表示高优先级,正值表示低优先级)

VIRT (进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES)

RES (进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA)

SHR (共享内存大小,单位kb)

S (进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程)

%CPU (上次更新到现在的CPU时间占用百分比)

%MEM (进程使用的物理内存百分比)

TIME+ (进程使用的CPU时间总计,单位1/100秒)

COMMAND (进程名称[命令名/命令行])

free

[root@slave1 ~]# free 
              total        used        free      shared  buff/cache   available
Mem:         997956      597432      140664        8004      259860      216048
Swap:       5119996         264     5119732

image.png

第一部分Mem行:

  • total 内存总数: 15.7G
  • used 已经使用的内存数: 15.6G
  • free 空闲的内存数: 93M
  • shared 当前已经废弃不用,总是0
  • buffers Buffer 缓存内存数: 298M
  • cached Page 缓存内存数:14G

对操作系统来讲是Mem的参数,buffers/cached 都是属于被使用,所以它认为free只有93M。
我们通过free命令查看机器空闲内存时,会发现free的值很小。这主要是因为,在Linux系统中有这么一种思想,内存不用白不用,因此它尽可能的cache和buffer一些数据,以方便下次使用。但实际上这些内存也是可以立刻拿来使用的。

第二部分(-/+ buffers/cache):

  • (-buffers/cache) used内存数:1.2G (指的第一部分Mem行中的used – buffers – cached)
  • (+buffers/cache) free内存数: 14.4G (指的第一部分Mem行中的free + buffers + cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数.
对应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。

第三部分Swap交换分区:

大家自行Google了解。

vmstat

[root@slave1 ~]# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229024   2080 172084    0    0   432    27  256  737  1  4 95  0  0
2表示每个两秒采集一次服务器状态,1表示只采集一次。

实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:
root@slave1 ~]# vmstat 2 
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 229180   2080 172152    0    0   230    15  224  506  1  2 97  0  0
 0  0      0 229204   2080 172152    0    0     0     0  203  249  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  177  233  0  0 100  0  0
 0  0      0 229204   2080 172152    0    0     0     0  189  239  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  188  243  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  167  224  0  1 99  0  0
 0  0      0 229204   2080 172152    0    0     0     0  172  230  0  1 99  0  0
这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。

r : 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

b : 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd : 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

free : 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff : Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M

cache : cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)

si : 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi : 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒

bo : 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

in : 每秒CPU的中断次数,包括时间中断

cs : 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us : 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

id : 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

wt : 等待IO CPU时间。

mpstat

[root@slave1 ~]# mpstat 
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

09:00:52 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
09:00:52 AM  all    0.12    0.00    0.38    0.01    0.00    0.01    0.00    0.00    0.00   99.47

它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息,
而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。
以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值

让我们看一看这些列值的含义:

%user 表示处理用户进程所使用 CPU 的百分比。用户进程是用于应用程序(如 Oracle 数据库)的非内核进程。

%nice 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。

%system 表示内核进程使用的 CPU 百分比

%iowait 表示等待进行 I/O 所使用的 CPU 时间百分比

%irq 表示用于处理系统中断的 CPU 百分比

%soft 表示用于软件中断的 CPU 百分比

%idle 显示 CPU 的空闲时间

%intr/s 显示每秒 CPU 接收的中断总数

当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计,
而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题

针对 Oracle 用户的用法

与 vmstat 相似,mpstat 命令还产生与 CPU 有关的统计信息,因此所有与 CPU 问题有关的讨论也都适用于 mpstat。
当您看到较低的 %idle 数字时,您知道出现了 CPU 不足的问题。当您看到较高的 %iowait 数字时,
您知道在当前负载下 I/O 子系统出现了某些问题。该信息对于解决 Oracle 数据库性能问题非常方便

iostat

[root@slave1 ~]# iostat
Linux 3.10.0-862.el7.x86_64 (slave1)    07/18/2019  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.11    0.00    0.36    0.01    0.00   99.52

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               1.17        26.54         6.05     272257      62046
scd0              0.00         0.10         0.00       1028          0

avg-cpu段:

%user :在用户级别运行所使用的CPU的百分比.

%nice: nice操作所使用的CPU的百分比.

%sys: 在系统级别(kernel)运行所使用CPU的百分比.

%iowait: CPU等待硬件I/O时,所占用CPU百分比.

%idle : CPU空闲时间的百分比.

Device段 :

tps : 每秒钟发送到的I/O请求数.

Blk_read /s : 每秒读取的block数.

Blk_wrtn/s : 每秒写入的block数.

Blk_read : 读入的block总数.

Blk_wrtn : 写入的block总数.

sar

[root@slave1 ~]# sar
Linux 3.10.0-862.el7.x86_64 (slave1)    07/17/2019  _x86_64_    (1 CPU)

10:46:24 AM       LINUX RESTART

10:50:01 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:00:01 AM     all      0.04      0.00      0.23      0.00      0.00     99.73
11:10:01 AM     all      0.04      0.00      0.15      0.00      0.00     99.81
11:20:01 AM     all      0.10      0.00      0.31      0.02      0.00     99.58
11:30:01 AM     all      1.44      0.00      1.10      0.01      0.00     97.45
11:40:01 AM     all      3.66      0.05      1.56      0.02      0.00     94.72
11:50:01 AM     all      0.03      0.00      0.12      0.00      0.00     99.85
Average:        all      0.88      0.01      0.58      0.01      0.00     98.53

CPU:

all : 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。

  1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
    如果要查看二进制文件test中的内容,需键入如下sar命令:
    sar -u -f test

chkconfig

==chkconfig命令检查、设置系统的各种服务。这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务,其中包括各类常驻服务。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。==

  • 语法
chkconfig(选项)
  • 选项
--add:增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据;
--del:删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据;
--level<等级代号>:指定读系统服务要在哪一个执行等级中开启或关毕。

==等级代号列表:==

  • 等级0表示:表示关机
  • 等级1表示:单用户模式
  • 等级2表示:无网络连接的多用户命令行模式
  • 等级3表示:有网络连接的多用户命令行模式
  • 等级4表示:不可用
  • 等级5表示:带图形界面的多用户模式
  • 等级6表示:重新启动

需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。

运行级文件:

每个被chkconfig管理的服务需要在对应的init.d下的脚本加上两行或者更多行的注释。第一行告诉chkconfig缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用-代替运行级。第二行对服务进行描述,可以用\跨行注释。

例如random.init包含三行:

# chkconfig: 2345 20 80
# description: Saves and restores system entropy pool for \
# higher quality random number generation.
  • 实例
chkconfig --list             #列出所有的系统服务。
chkconfig --add httpd        #增加httpd服务。
chkconfig --del httpd        #删除httpd服务。
chkconfig --level httpd 2345 on        #设置httpd在运行级别为2、3、4、5的情况下都是on(开启)的状态。
chkconfig --list               #列出系统所有的服务启动情况。
chkconfig --list mysqld        #列出mysqld服务设置情况。
chkconfig --level 35 mysqld on #设定mysqld在等级3和5为开机运行服务,--level 35表示操作只在等级3和5执行,on表示启动,off表示关闭。
chkconfig mysqld on           

设定mysqld在各等级为on,“各等级”包括2、3、4、5等级。

如何增加一个服务:

  1. 服务脚本必须存放在/etc/ini.d/目录下;
  2. chkconfig --add servicename在chkconfig工具服务列表中增加此服务,此时服务会被在/etc/rc.d/rcN.d中赋予K/S入口了;
  3. chkconfig --level 35 mysqld on修改服务的默认启动等级。

    系统安全相关命令(10个)

    chmod

    ==chmod命令用来变更文件或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取、写入、执行3种一般权限来区分,另有3种特殊权限可供运用。用户可以使用chmod指令去变更文件与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果用户对符号连接修改权限,其改变会作用在被连接的原始文件。==
  • 权限范围的表示法如下:
  • [u] User,即文件或目录的拥有者;
  • [g] Group,即文件或目录的所属群组;
  • [o] Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
  • [a] All,即全部的用户,包含拥有者,所属群组以及其他用户;
  • [r] 读取权限,数字代号为“4”;
  • [w] 写入权限,数字代号为“2”;
  • [x] 执行或切换权限,数字代号为“1”;
  • [-] 不具任何权限,数字代号为“0”;
  • [s] 特殊功能说明:变更文件或目录的权限。

  • 语法
chmod(选项)(参数)
  • 选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quiet或——silent:不显示错误信息;
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose:显示指令执行过程;
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
<权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置;
<权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置;
<权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;
  • 参数
权限模式:指定文件的权限模式;
文件:要改变权限的文件。 
  • 知识扩展和实例

Linux用 户分为:拥有者、组群(Group)、其他(other),Linux系统中,预设的情況下,系统中所有的帐号与一般身份使用者,以及root的相关信 息, 都是记录在/etc/passwd文件中。每个人的密码则是记录在/etc/shadow文件下。 此外,所有的组群名称记录在/etc/group內!

  • 例:rwx rw- r--
r=读取属性  //值=4
w=写入属性  //值=2
x=执行属性  //值=1

chmod u+x,g+w f01  //为文件f01设置自己可以执行,组员可以写入的权限
chmod u=rwx,g=rw,o=r f01
chmod 764 f01
chmod a+x f01  //对文件f01的u,g,o都设置可执行属性
文件的属主和属组属性设置

chown user:market f01  //把文件f01给uesr,添加到market组
ll -d f1  查看目录f1的属性

chown

==chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户D,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。==

只有文件主和超级用户才可以便用该命令。

  • 语法
chown(选项)(参数)
  • 选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quite或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R或——recursive:递归处理,将指定目录下的所有文件及子目录一并处理;
-v或——version:显示指令执行过程;
--dereference:效果和“-h”参数相同;
--help:在线帮助;
--reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
--version:显示版本信息。
  • 参数
用户:组:指定所有者和所属工作组。当省略“:组”,仅改变文件所有者;
文件:指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符。
  • 实例

将目录/usr/meng及其下面的所有文件、子目录的文件主改成 liu:

chown -R liu /usr/meng

chgrp

==chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。==

在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。

  • 语法
chgrp(选项)(参数)
  • 选项
-c或——changes:效果类似“-v”参数,但仅回报更改的部分;
-f或--quiet或——silent:不显示错误信息;
-h或--no-dereference:只对符号连接的文件作修改,而不是该其他任何相关文件;
-R或——recursive:递归处理,将指令目录下的所有文件及子目录一并处理;
-v或——verbose:显示指令执行过程;
--reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;
  • 参数
组:指定新工作名称;
文件:指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开。
  • 实例
    将/usr/meng及其子目录下的所有文件的用户组改为mengxin
chgrp -R mengxin /usr/meng

chage

==chage命令是用来修改帐号和密码的有效期限。==

  • 语法
chage [选项] 用户名
  • 选项
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
  • 实例
  1. 可以编辑/etc/login.defs来设定几个参数,以后设置口令默认就按照参数设定为准:
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

2.当然在/etc/default/useradd可以找到如下2个参数进行设置:

# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
  1. 通过修改配置文件,能对之后新建用户起作用,而目前系统已经存在的用户,则直接用chage来配置。
我的服务器root帐户密码策略信息如下:

[root@linuxde ~]# chage -l root
最近一次密码修改时间                    : 3月 12, 2013
密码过期时间                            :从不
密码失效时间                           :从不
帐户过期时间                           :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :99999
在密码过期之前警告的天数                :7
  1. 我可以通过如下命令修改我的密码过期时间:
[root@linuxde ~]# chage -M 60 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间                          : 3月 12, 2013
密码过期时间                                       : 5月 11, 2013
密码失效时间                                       :从不
帐户过期时间                                       :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :60
在密码过期之前警告的天数                    :9
  1. 然后通过如下命令设置密码失效时间:
[root@linuxde ~]# chage -I 5 root
[root@linuxde ~]# chage -l root
最近一次密码修改时间                          : 3月 12, 2013
密码过期时间                                  : 5月 11, 2013
密码失效时间                                  : 5月 16, 2013
帐户过期时间                                  :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :60
在密码过期之前警告的天数                 :9

从上述命令可以看到,在密码过期后5天,密码自动失效,这个用户将无法登陆系统了。

passwd

==passwd命令用于设置用户的认证信息,包括用户密码、密码过期时间等。系统管理者则能用它管理系统用户的密码。只有管理者可以指定用户名称,一般用户只能变更自己的密码。==

  • 语法
passwd(选项)(参数)
  • 选项
-d:删除密码,仅有系统管理者才能使用;
-f:强制执行;
-k:设置只有在密码过期失效后,方能更新;
-l:锁住密码;
-s:列出密码的相关信息,仅有系统管理者才能使用;
-u:解开已上锁的帐号。
  • 参数
用户名:需要设置密码的用户名。
  • 知识扩展

与用户、组账户信息相关的文件

  1. 存放用户信息:
/etc/passwd
/etc/shadow
  1. 存放组信息:
/etc/group
/etc/gshadow
  1. 用户信息文件分析(每项用:隔开)
例如:jack:X:503:504:::/home/jack/:/bin/bash
jack  //用户名
X  //口令、密码
503  //用户id(0代表root、普通新建用户从500开始)
504  //所在组
:  //描述
/home/jack/  //用户主目录
/bin/bash  //用户缺省Shell
  1. 组信息文件分析
例如:jack:$!$:???:13801:0:99999:7:*:*:
jack  //组名
$!$  //被加密的口令
13801  //创建日期与今天相隔的天数
0  //口令最短位数
99999  //用户口令
7  //到7天时提醒
*  //禁用天数
*  //过期天数
  • 实例
  1. 如果是普通用户执行passwd只能修改自己的密码。如果新建用户后,要为新用户创建密码,则用passwd用户名,注意要以root用户的权限来创建。
[root@localhost ~]# passwd linuxde    //更改或创建linuxde用户的密码;
Changing password for user linuxde.
New UNIX password:          //请输入新密码;
Retype new UNIX password:   //再输入一次;
passwd: all authentication tokens updated successfully. //成功;
  1. 普通用户如果想更改自己的密码,直接运行passwd即可,比如当前操作的用户是linuxde。
[linuxde@localhost ~]$ passwd
Changing password for user linuxde. //更改linuxde用户的密码;
(current) UNIX password:   //请输入当前密码;
New UNIX password:         //请输入新密码;
Retype new UNIX password:  //确认新密码;
passwd: all authentication tokens updated successfully. //更改成功;
  1. 比如我们让某个用户不能修改密码,可以用-l选项来锁定:
[root@localhost ~]# passwd -l linuxde    //锁定用户linuxde不能更改密码;
Locking password for user linuxde.
passwd: Success           //锁定成功;

[linuxde@localhost ~]# su linuxde   //通过su切换到linuxde用户;
[linuxde@localhost ~]$ passwd      //linuxde来更改密码;
Changing password for user linuxde.
Changing password for linuxde
(current) UNIX password:          //输入linuxde的当前密码;
passwd: Authentication token manipulation error     //失败,不能更改密码;
  1. 再来一例:
[root@localhost ~]# passwd -d linuxde  //清除linuxde用户密码;
Removing password for user linuxde.
passwd: Success                         //清除成功;

[root@localhost ~]# passwd -S linuxde    //查询linuxde用户密码状态;
Empty password.                         //空密码,也就是没有密码;

注意:当我们清除一个用户的密码时,登录时就无需密码,这一点要加以注意。

su

==su命令用于切换当前用户身份到其他用户身份,变更时须输入所要变更的用户帐号与密码。==

  • 语法
su(选项)(参数)
  • 选项
-c<指令>或--command=<指令>:执行完指定的指令后,即恢复原来的身份;
-f或——fast:适用于csh与tsch,使shell不用去读取启动文件;
-l或——login:改变身份时,也同时变更工作目录,以及HOME,SHELL,USER,logname。此外,也会变更PATH变量;
-m,-p或--preserve-environment:变更身份时,不要变更环境变量;
-s<shell>或--shell=<shell>:指定要执行的shell;
--help:显示帮助;
--version;显示版本信息。
  • 参数
用户:指定要切换身份的目标用户。
  • 实例
  1. 变更帐号为root并在执行ls指令后退出变回原使用者:
su -c ls root
  1. 变更帐号为root并传入-f选项给新执行的shell:
su root -f
  1. 变更帐号为test并改变工作目录至test的家目录:
su -test

sudo

==sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。==

  • 语法
sudo(选项)(参数)
  • 选项
-b:在后台执行指令;
-h:显示帮助;
-H:将HOME环境变量设为新身份的HOME环境变量;
-k:结束密码的有效期限,也就是下次再执行sudo时便需要输入密码;。
-l:列出目前用户可执行与无法执行的指令;
-p:改变询问密码的提示符号;
-s<shell>:执行指定的shell;
-u<用户>:以指定的用户作为新的身份。若不加上此参数,则预设以root作为新的身份;
-v:延长密码有效期限5分钟;
-V :显示版本信息。
  • 参数
指令:需要运行的指令和对应的参数。
  • 实例
    配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。

visudo默认的是在vi里打开配置文件,用vi来修改文件。我们可以在编译时修改这个默认项。visudo不会擅自保存带有语法错误的配置文件,它会提示你出现的问题,并询问该如何处理,就像:

>>> sudoers file: syntax error, line 22 <<

此时我们有三种选择:键入“e”是重新编辑,键入“x”是不保存退出,键入“Q”是退出并保存。如果真选择Q,那么sudo将不会再运行,直到错误被纠正。

现在,我们一起来看一下神秘的配置文件,学一下如何编写它。让我们从一个简单的例子开始:让用户Foobar可以通过sudo执行所有root可执行的命令。以root身份用visudo打开配置文件,可以看到类似下面几行:

# Runas alias specification
# User privilege specificationroot    ALL=(ALL)ALL

我们一看就明白个差不多了,root有所有权限,只要仿照现有root的例子就行,我们在下面加一行(最好用tab作为空白):

foobar ALL=(ALL)    ALL

保存退出后,切换到foobar用户,我们用它的身份执行命令:

[foobar@localhost ~]$ ls /root
ls: /root: 权限不够

[foobar@localhost ~]$ sudo ls /root
PassWord:
anaconda-ks.cfg Desktop install.log install.log.syslog

好了,我们限制一下foobar的权利,不让他为所欲为。比如我们只想让他像root那样使用ls和ifconfig,把那一行改为:

foobar localhost=    /sbin/ifconfig,   /bin/ls

再来执行命令:

[foobar@localhost ~]$ sudo head -5 /etc/shadow
Password:
Sorry, user foobar is not allowed to execute '/usr/bin/head -5 /etc/shadow' as root on localhost.localdomain.

[foobar@localhost ~]$ sudo /sbin/ifconfigeth0      Linkencap:Ethernet HWaddr 00:14:85:EC:E9:9B...

现在让我们来看一下那三个ALL到底是什么意思。第一个ALL是指网络中的主机,我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。第二个括号里的ALL是指目标用户,也就是以谁的身份去执行命令。最后一个ALL当然就是指命令名了。例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:

foobar    linux=(jimmy,rene)    /bin/kill

但这还有个问题,foobar到底以jimmy还是rene的身份执行?这时我们应该想到了sudo -u了,它正是用在这种时候。 foobar可以使用sudo -u jimmy kill PID或者sudo -u rene kill PID,但这样挺麻烦,其实我们可以不必每次加-u,把rene或jimmy设为默认的目标用户即可。再在上面加一行:

Defaults:foobar    runas_default=rene

Defaults后面如果有冒号,是对后面用户的默认,如果没有,则是对所有用户的默认。就像配置文件中自带的一行:

Defaults    env_reset

另一个问题是,很多时候,我们本来就登录了,每次使用sudo还要输入密码就显得烦琐了。我们可不可以不再输入密码呢?当然可以,我们这样修改配置文件:

foobar localhost=NOPASSWD:     /bin/cat, /bin/ls

再来sudo一下:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg Desktop install.log
install.log.syslog

当然,你也可以说“某些命令用户foobar不可以运行”,通过使用!操作符,但这不是一个好主意。因为,用!操作符来从ALL中“剔出”一些命令一般是没什么效果的,一个用户完全可以把那个命令拷贝到别的地方,换一个名字后再来运行。

日志与安全

sudo为安全考虑得很周到,不仅可以记录日志,还能在有必要时向系统管理员报告。但是,sudo的日志功能不是自动的,必须由管理员开启。这样来做:

touch /var/log/sudo
vi /etc/syslog.conf

在syslog.conf最后面加一行(必须用tab分割开)并保存:

local2.debug                    /var/log/sudo

重启日志守候进程,

ps aux grep syslogd

把得到的syslogd进程的PID(输出的第二列是PID)填入下面:

kill –HUP PID

这样,sudo就可以写日志了:

[foobar@localhost ~]$ sudo ls /rootanaconda-ks.cfg
Desktop install.log
install.log.syslog
$cat /var/log/sudoJul 28 22:52:54 localhost sudo:   foobar :
TTY=pts/1 ; pwd=/home/foobar ; USER=root ; command=/bin/ls /root

不过,有一个小小的“缺陷”,sudo记录日志并不是很忠实:

[foobar@localhost ~]$ sudo cat /etc/shadow > /dev/null
cat /var/log/sudo...Jul 28 23:10:24 localhost sudo:   foobar : TTY=pts/1 ;
PWD=/home/foobar ; USER=root ; COMMAND=/bin/cat /etc/shadow

重定向没有被记录在案!为什么?因为在命令运行之前,shell把重定向的工作做完了,sudo根本就没看到重定向。这也有个好处,下面的手段不会得逞:

[foobar@localhost ~]$ sudo ls /root > /etc/shadowbash: /etc/shadow: 权限不够

sudo 有自己的方式来保护安全。以root的身份执行sudo-V,查看一下sudo的设置。因为考虑到安全问题,一部分环境变量并没有传递给sudo后面的命令,或者被检查后再传递的,比如:PATH,HOME,SHELL等。当然,你也可以通过sudoers来配置这些环境变量。

umask

==umask命令用来设置限制新建文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行, 并自动设置掩码mode来限制新文件的权限。用户可以通过再次执行umask命令来改变默认值,新的权限将会把旧的覆盖掉。==

  • 语法
umask(选项)(参数)
  • 选项
-p:输出的权限掩码可直接作为指令来执行;
-S:以符号方式输出权限掩码。
  • 参数
权限掩码:指定权限掩码。
  • 实例
    利用umask命令可以指定哪些权限将在新文件的默认权限中被删除。例如,可以使用下面的命令创建掩码,使得组用户的写权限,其他用户的读、写和执行权限都被取消:
umask u=, g=w, o=rwx

执行该命令以后,对于下面创建的新文件,其文件主的权限未做任何改变,而组用户没有写权限,其他用户的所有权限都被取消。

应注意:操作符“=”在umask命令和chmod命令中的作用恰恰相反。在chmod命令中,利用它来设置指定的权限,而其余权限则被删除;但是在umask命令中,它将在原有权限的基础上删除指定的权限。

不能直接利用umask命令创建一个可执行的文件,用户只能在其后利用chmod命令使它具有执行权限。假设执行了命令umask u=, g=w, o=rwx,虽然在命令行中,没有删去文件主和组用户的执行权限,但默认的文件权限还是640(即 rw-r-----),而不是750(rwxr-x---)。但是,如果创建的是目录或者通过编译程序创建的一个可执行文件,将不受此限制。在这种情况 下,会设置文件的执行权限。

也可以使用八进制数值来设置mode。由于在umask中所指定的权限是要从文件中删除的,所以,如果该文件原来的初始化权限是777,那么执行命令umask 022以后,该文件的权限将变为755:如果该文件原来的初始化权限是666,那么该文件的权限将变为644。

可以使用下面的命令检查新创建文件的默认权限:

umask -s

选项-s表示以字符形式显示当前的掩码。如果直接输入umask命令,不带任何参数,那么将以八进制形式显示当前的掩码。系统默认的掩码是0022。

chattr

==chattr命令用来改变文件属性。这项指令可改变存放在ext2文件系统上的文件或目录属性==

  • 这些属性共有以下8种模式:
a:让文件或目录仅供附加用途;
b:不更新文件或目录的最后存取时间;
c:将文件或目录压缩后存放;
d:将文件或目录排除在倾倒操作之外;
i:不得任意更动文件或目录;
s:保密性删除文件或目录;
S:即时更新文件或目录;
u:预防意外删除。
  • 语法
chattr(选项)
  • 选项
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v<版本编号>:设置文件或目录版本;
-V:显示指令执行过程;
+<属性>:开启文件或目录的该项属性;
-<属性>:关闭文件或目录的该项属性;
=<属性>:指定文件或目录的该项属性。
  • 实例
  1. 用chattr命令防止系统中某个关键文件被修改:
chattr +i /etc/fstab

然后试一下rm、mv、rename等命令操作于该文件,都是得到Operation not permitted的结果。

  1. 让某个文件只能往里面追加内容,不能删除,一些日志文件适用于这种操作:
chattr +a /data1/user_act.log

其它(19个)

echo

==echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串。linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。==

  • 语法
echo(选项)(参数)
  • 选项
-e:激活转义字符。
使用-e选项时,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
  • 参数
变量:指定要打印的变量。
  • 实例

用echo命令打印带有色彩的文字:

文字色:

echo -e "\e[1;31mThis is red text\e[0m"
This is red text
  • \e[1;31m 将颜色设置为红色
  • \e[0m 将颜色重新置回

颜色码:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37

背景色:

echo -e "\e[1;42mGreed Background\e[0m"
Greed Background

颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47

文字闪动:

echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"

红色数字处还有其他数字参数:0 关闭所有属性、1 设置高亮度(加粗)、4 下划线、5 闪烁、7 反显、8 消隐

printf

==printf命令格式化并输出结果到标准输出。==

  • 语法
printf(选项)(参数)
--help:在线帮助;
--version:显示版本信息。
  • 参数
输出格式:指定数据输出时的格式;
输出字符串:指定要输出的数据。
  • 格式替代符
%b 相对应的参数被视为含有要被处理的转义序列之字符串。
%c ASCII字符。显示相对应参数的第一个字符
%d, %i 十进制整数
%e, %E, %f 浮点格式
%g %e或%f转换,看哪一个较短,则删除结尾的零
%G %E或%f转换,看哪一个较短,则删除结尾的零
%o 不带正负号的八进制值
%s 字符串
%u 不带正负号的十进制值
%x 不带正负号的十六进制值,使用a至f表示10至15
%X 不带正负号的十六进制值,使用A至F表示10至15
%% 字面意义的%
  • 转义序列
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符,仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符
  • 实例
printf "hello world"

---

#!/bin/bash

printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
  • %-5s 格式为左对齐且宽度为5的字符串代替(-表示左对齐),不使用则是又对齐。
  • %-4.2f 格式为左对齐宽度为4,保留两位小数。

rpm

==rpm命令是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。==

  • 语法
rpm(选项)(参数)
  • 选项
-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合"-l"参数使用;
-d:只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或--hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或--install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。
  • 参数

软件包:指定要操纵的rpm软件包。

  1. rpm软件包的安装可以使用程序rpm来完成。执行下面的命令:
rpm -ivh your-package.rpm
其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。
  1. 安装过程中可能出现下面的警告或者提示:
... conflict with ...

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i强制安装即可

... is needed by ...
... is not installed ...

此包需要的一些软件你没有安装可以用rpm --nodeps -i来忽略此信息,也就是说rpm -i --force --nodeps可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

  • 如何安装.src.rpm软件包

有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法:

方法一:
rpm -i your-package.src.rpm
cd /usr/src/redhat/SPECS
rpmbuild -bp your-package.specs             #一个和你的软件包同名的specs文件
cd /usr/src/redhat/BUILD/your-package/      #一个和你的软件包同名的目录
./configure                                 #这一步和编译普通的源码软件一样,可以加上参数
make
make install

---

方法二:
rpm -i you-package.src.rpm
cd /usr/src/redhat/SPECS

---

前两步和方法一相同
rpmbuild -bb your-package.specs       #一个和你的软件包同名的specs文件

这时在/usr/src/redhat/RPM/i386/(根据具体包的不同,也可能是i686,noarch等等)在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。
  • 如何卸载rpm软件包
使用命令rpm -e包名,包名可以包含版本号等信息,但是不可以有后缀.rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:
rpm -e proftpd-1.2.8-1
rpm -e proftpd-1.2.8
rpm -e proftpd-
rpm -e proftpd

---

不可以是下列格式:
rpm -e proftpd-1.2.8-1.i386.rpm
rpm -e proftpd-1.2.8-1.i386
rpm -e proftpd-1.2
rpm -e proftpd-1

---

有时会出现一些错误或者警告:

... is needed by ...
这说明这个软件被其他软件需要,不能随便卸载,可以用rpm -e --nodeps强制卸载
  • 如何不安装但是获取rpm包中的文件
使用工具rpm2cpio和cpio

rpm2cpio xxx.rpm | cpio -vi
rpm2cpio xxx.rpm | cpio -idmv
rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程,d和make-directory相同,表示根据包中文件原来的路径建立目录,m表示保持文件的更新时间。
  • 如何查看与rpm包相关的文件和其他信息

下面所有的例子都假设使用软件包mysql-3.23.54a-11

1、我的系统中安装了那些rpm软件包。
rpm -qa 讲列出所有安装过的包

如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa | grep sql

2、如何获得某个软件包的文件全名。
rpm -q mysql
可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11

3、一个rpm包中的文件安装到那里去了?
rpm -ql 包名
注意这里的是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which,比如:
which mysql

4、一个rpm包中包含那些文件。
一个没有安装过的软件包,使用rpm -qlp ****.rpm
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm

5、如何获取关于一个软件包的版本,用途等相关信息?
一个没有安装过的软件包,使用rpm -qip ****.rpm
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm

6、某个程序是哪个软件包安装的,或者哪个软件包包含这个程序。
rpm -qf `which 程序名`    #返回软件包的全名
rpm -qif `which 程序名`   #返回软件包的有关信息
rpm -qlf `which 程序名`   #返回软件包的文件列表
注意,这里不是引号,而是`,就是键盘左上角的那个键。也可以使用rpm -qilf,同时输出软件包信息和文件列表。

7、某个文件是哪个软件包安装的,或者哪个软件包包含这个文件。
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz

rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1

rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1

yum

==yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。==

yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

  • 语法
yum(选项)(参数)
  • 选项
-h:显示帮助信息;
-y:对所有的提问都回答“yes”;
-c:指定配置文件;
-q:安静模式;
-v:详细模式;
-d:设置调试等级(0-10);
-e:设置错误等级(0-10);
-R:设置yum处理一个命令的最大等待时间;
-C:完全从缓存中运行,而不去下载或者更新任何头文件。
  • 参数
install:安装rpm软件包;
update:更新rpm软件包;
check-update:检查是否有可用的更新rpm软件包;
remove:删除指定的rpm软件包;
list:显示软件包的信息;
search:检查软件包的信息;
info:显示指定的rpm软件包的描述信息和概要信息;
clean:清理yum过期的缓存;
shell:进入yum的shell提示符;
resolvedep:显示rpm软件包的依赖关系;
localinstall:安装本地的rpm软件包;
localupdate:显示本地rpm软件包进行更新;
deplist:显示rpm软件包的所有依赖关系。
  • 实例

部分常用的命令包括:

  • 自动搜索最快镜像插件:yum install yum-fastestmirror
  • 安装yum图形窗口插件:yum install yumex
  • 查看可能批量安装的列表:yum grouplist
  1. 安装
yum install              #全部安装
yum install package1     #安装指定的安装包package1
yum groupinsall group1   #安装程序组group1
  1. 更新和升级
yum update               #全部更新
yum update package1      #更新指定程序包package1
yum check-update         #检查可更新的程序
yum upgrade package1     #升级指定程序包package1
yum groupupdate group1   #升级程序组group1
  1. 查找和显示
yum info package1      #显示安装包信息package1
yum list               #显示所有已经安装和可以安装的程序包
yum list package1      #显示指定程序包安装情况package1
yum groupinfo group1   #显示程序组group1信息yum search string 根据关键字string查找安装包
  1. 删除程序
yum remove &#124; erase package1   #删除程序包package1
yum groupremove group1             #删除程序组group1
yum deplist package1               #查看程序package1依赖情况
  1. 清除缓存
yum clean packages       #清除缓存目录下的软件包
yum clean headers        #清除缓存目录下的 headers
yum clean oldheaders     #清除缓存目录下旧的 headers

watch

==watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示。watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。==

  • 语法
watch(选项)(参数)
  • 选项
-n:指定指令执行的间隔时间(秒);
-d:高亮显示指令输出信息不同之处;
-t:不显示标题。
  • 参数
指令:需要周期性执行的指令。
  • 实例
#watch uptime
#watch -t uptime
#watch -d -n 1 netstat -ntlp
#watch -d 'ls -l | fgrep goface'     //监测goface的文件
#watch -t -differences=cumulative uptime
#watch -n 60 from            //监控mail
#watch -n 1 "df -i;df"       //监测磁盘inode和block数目变化情况

FreeBSD和Linux下watch命令的不同,在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果,如:watch -n 1 -d netstat -ant,而在FreeBSD下的watch命令是查看其它用户的正在运行的操作,watch允许你偷看其它terminal正在做什么,该命令只能让超级用户使用。

alias

==alias命令用来设置指令的别名。我们可以使用该命令可以将一些较长的命令进行简化。使用alias时,用户必须使用单引号''将原来的命令引起来,防止特殊字符导致错误。==

alias命令的作用只局限于该次登入的操作。若要每次登入都能够使用这些命令别名,则可将相应的alias命令存放到bash的初始化文件/etc/bashrc中。

  • 语法
alias(选项)(参数)
  • 选项
-p:打印已经设置的命令别名。
  • 参数
命令别名设置:定义命令别名,格式为“命令别名=‘实际命令’”。
  • 实例
    alias 的基本使用方法为:
alias 新的命令='原命令 -选项/参数'

例如:alias l=‘ls -lsh'将重新定义ls命令,现在只需输入l就可以列目录了。直接输入 alias 命令会列出当前系统中所有已经定义的命令别名。

要删除一个别名,可以使用 unalias 命令,如 unalias l。

查看系统已经设置的别名:

alias -p
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

date

==date命令是显示或设置系统时间与日期。==

很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。延时通常用于脚本执行过程中提供一段等待的时间。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起流逝的秒数。

  • 语法
date(选项)(参数)
  • 选项
-d<字符串>:显示字符串所指的日期与时间。字符串前后必须加上双引号;
-s<字符串>:根据字符串来设置日期与时间。字符串前后必须加上双引号;
-u:显示GMT;
--help:在线帮助;
--version:显示版本信息。
  • 参数
<+时间日期格式>:指定显示时使用的日期时间格式。

日期格式字符串列表

%H 小时,24小时制(00~23)
%I 小时,12小时制(01~12)
%k 小时,24小时制(0~23)
%l 小时,12小时制(1~12)
%M 分钟(00~59)
%p 显示出AM或PM
%r 显示时间,12小时制(hh:mm:ss %p)
%s 从1970年1月1日00:00:00到目前经历的秒数
%S 显示秒(00~59)
%T 显示时间,24小时制(hh:mm:ss)
%X 显示时间的格式(%H:%M:%S)
%Z 显示时区,日期域(CST)
%a 星期的简称(Sun~Sat)
%A 星期的全称(Sunday~Saturday)
%h,%b 月的简称(Jan~Dec)
%B 月的全称(January~December)
%c 日期和时间(Tue Nov 20 14:12:58 2012)
%d 一个月的第几天(01~31)
%x,%D 日期(mm/dd/yy)
%j 一年的第几天(001~366)
%m 月份(01~12)
%w 一个星期的第几天(0代表星期天)
%W 一年的第几个星期(00~53,星期一为第一天)
%y 年的最后两个数字(1999则是99)
  • 实例
  1. 格式化输出:
date +"%Y-%m-%d"
2009-12-07
  1. 输出昨天日期:
date -d "1 day ago" +"%Y-%m-%d"
2012-11-19
  1. 2秒后输出:
date -d "2 second" +"%Y-%m-%d %H:%M.%S"
2012-11-20 14:21.31
  1. 传说中的 1234567890 秒:
date -d "1970-01-01 1234567890 seconds" +"%Y-%m-%d %H:%m:%S"
2009-02-13 23:02:30
  1. 普通转格式:
date -d "2009-12-12" +"%Y/%m/%d %H:%M.%S"
2009/12/12 00:00.00
  1. apache格式转换:
date -d "Dec 5, 2009 12:00:37 AM" +"%Y-%m-%d %H:%M.%S"
2009-12-05 00:00.37

7.格式转换后时间游走:

date -d "Dec 5, 2009 12:00:37 AM 2 year ago" +"%Y-%m-%d %H:%M.%S"
2007-12-05 00:00.37
  1. 加减操作:
date +%Y%m%d                   //显示前天年月日
date -d "+1 day" +%Y%m%d       //显示前一天的日期
date -d "-1 day" +%Y%m%d       //显示后一天的日期
date -d "-1 month" +%Y%m%d     //显示上一月的日期
date -d "+1 month" +%Y%m%d     //显示下一月的日期
date -d "-1 year" +%Y%m%d      //显示前一年的日期
date -d "+1 year" +%Y%m%d      //显示下一年的日期
  1. 设定时间:
date -s                        //设置当前时间,只有root权限才能设置,其他只能查看
date -s 20120523               //设置成20120523,这样会把具体时间设置成空00:00:00
date -s 01:01:01               //设置具体时间,不会对日期做更改
date -s "01:01:01 2012-05-23"  //这样可以设置全部时间
date -s "01:01:01 20120523"    //这样可以设置全部时间
date -s "2012-05-23 01:01:01"  //这样可以设置全部时间
date -s "20120523 01:01:01"    //这样可以设置全部时间
  1. 有时需要检查一组命令花费的时间,举例:
#!/bin/bash

start=$(date +%s)
nmap man.linuxde.net &> /dev/null

end=$(date +%s)
difference=$(( end - start ))
echo $difference seconds.

clear

==clear命令用于清除当前屏幕终端上的任何信息。==

  • 语法
clear
  • 实例
直接输入clear命令当前终端上的任何信息就可被清除。

history

==history命令用于显示指定数目的指令命令,读取历史命令文件中的目录到历史命令缓冲区和将历史命令缓冲区中的目录写入命令文件。==

该命令单独使用时,仅显示历史命令,在命令行中,可以使用符号!执行指定序号的历史命令。例如,要执行第2个历史命令,则输入!2。

历史命令是被保存在内存中的,当退出或者登录shell时,会自动保存或读取。在内存中,历史命令仅能够存储1000条历史命令,该数量是由环境变量HISTSIZE进行控制。

  • 语法
history(选项)(参数)
  • 选项
-c:清空当前历史命令;
-a:将历史命令缓冲区中命令写入历史命令文件中;
-r:将历史命令文件中的命令读入当前历史命令缓冲区;
-w:将当前历史命令缓冲区命令写入历史命令文件中。
  • 参数
n:打印最近的n条历史命令。
  • 实例
  1. 使用history命令显示最近使用的10条历史命令,输入如下命令:
[root@localhost ~]# history 10
   92  ls
   93  cd ..
   94  ls
   95  exit
   96  ls -a
   97  cd .ssh/
   98  ls
   99  cat known_hosts
  100  exit
  101  history 10

eject

==eject命令用来退出抽取式设备。若设备已挂入,则eject命令会先将该设备卸除再退出。==

eject允许可移动介质(典型是cd-ROM、软盘、磁带、或者JAZ以及zip磁盘)在软件控制下弹出。该命令也可以控制一些多盘片CD-ROM控制器,控制一些设备支持的自动弹出功能,以及控制一些CD-ROM驱动器磁盘托盘的关闭。与name相应的设备将被弹出,name可以为设备文件或者其挂载点,也可以为完整路径或者省略前面的/dev或者/mnt设备文件名。如果没有指定name,缺省使用cdrom。

有四种不同的弹出的方法,具体要看设备是CD-ROM, SCSI设备,可移动软盘,还是磁带而定。默认的弹出会依次尝试所有四种方法,直到成功为止。如果设备当前是挂载上来的,那么在弹出前要先卸载。

  • 语法
eject(选项)(参数)
  • 选项
-a<开关>或--auto<开关>:控制设备的自动退出功能;
-c<光驱编号>或--changerslut<光驱编号>   选择光驱柜中的光驱;
-d或--default:显示预设的设备,而不是实际执行动作;
-f或--floppy:退出抽取式磁盘;
-h或--help:显示帮助;
-n或--noop:显示指定的设备;
-q或--tape:退出磁带;
-r或--cdrom:退出光盘;
-s或--scsi:以SCSI指令来退出设备;
-t或--trayclose:关闭光盘的托盘;
-v或--verbose:执行时,显示详细的说明。
  • 参数
设备名:指定弹出的设备名称。

time

==time命令用于统计给定命令所花费的总时间。==

  • 语法
time(参数)
  • 参数
指令:指定需要运行的额指令及其参数。
  • 实例
  1. 当测试一个程序或比较不同算法时,执行时间是非常重要的,一个好的算法应该是用时最短的。所有类UNIX系统都包含time命令,使用这个命令可以统计时间消耗。例如:
[root@localhost ~]# time ls
anaconda-ks.cfg  install.log  install.log.syslog  satools  text

real    0m0.009s
user    0m0.002s
sys     0m0.007s
  1. 输出的信息分别显示了该命令所花费的real时间、user时间和sys时间。
  • real时间是指挂钟时间,也就是命令开始执行到结束的时间。这个短时间包括其他进程所占用的时间片,和进程被阻塞时所花费的时间。
  • user时间是指进程花费在用户模式中的CPU时间,这是唯一真正用于执行进程所花费的时间,其他进程和花费阻塞状态中的时间没有计算在内。
  • sys时间是指花费在内核模式中的CPU时间,代表在内核中执系统调用所花费的时间,这也是真正由进程使用的CPU时间。

shell内建也有一个time命令,当运行time时候是调用的系统内建命令,应为系统内建的功能有限,所以需要时间其他功能需要使用time命令可执行二进制文件/usr/bin/time。

  1. 使用-o选项将执行时间写入到文件中:
/usr/bin/time -o outfile.txt ls
  1. 使用-a选项追加信息:
/usr/bin/time -a -o outfile.txt ls
  1. 使用-f选项格式化时间输出:
/usr/bin/time -f "time: %U" ls

-f选项后的参数:

参数 描述
%E real时间,显示格式为[小时:]分钟:秒
%U user时间。
%S sys时间。
%C 进行计时的命令名称和命令行参数。
%D 进程非共享数据区域,以KB为单位。
%x 命令退出状态。
%k 进程接收到的信号数量。
%w 进程被交换出主存的次数。
%Z 系统的页面大小,这是一个系统常量,不用系统中常量值也不同。
%P 进程所获取的CPU时间百分百,这个值等于user+system时间除以总共的运行时间。
%K 进程的平均总内存使用量(data+stack+text),单位是KB。
%w 进程主动进行上下文切换的次数,例如等待I/O操作完成。
%c 进程被迫进行上下文切换的次数(由于时间片到期)。

nohup

==nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。==

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

  • 语法
nohup(选项)(参数)
  • 选项
--help:在线帮助;
--version:显示版本信息。
  • 参数
程序及选项:要运行的程序及选项。
  • 实例
    使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中。

nc

==nc命令是netcat命令的简称,都是用来设置路由器。==

  • 语法
nc/netcat(选项)(参数)
  • 选项
-g<网关>:设置路由器跃程通信网关,最多设置8个;
-G<指向器数目>:设置来源路由指向器,其数值为4的倍数;
-h:在线帮助;
-i<延迟秒数>:设置时间间隔,以便传送信息及扫描通信端口;
-l:使用监听模式,监控传入的资料;
-n:直接使用ip地址,而不通过域名服务器;
-o<输出文件>:指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存;
-p<通信端口>:设置本地主机使用的通信端口;
-r:指定源端口和目的端口都进行随机的选择;
-s<来源位址>:设置本地主机送出数据包的IP地址;
-u:使用UDP传输协议;
-v:显示指令执行过程;
-w<超时秒数>:设置等待连线的时间;
-z:使用0输入/输出模式,只在扫描通信端口时使用。
  • 参数
主机:指定主机的IP地址或主机名称;
端口号:可以是单个整数或者是一个范围。
  • 实例

远程拷贝文件

从server1拷贝文件到server2上。需要先在server2上,用nc激活监听。

server2上运行:

[root@localhost2 tmp]# nc -lp 1234 > install.log

server1上运行:

[root@localhost1 ~]# ll install.log
-rw-r–r–   1 root root 39693 12月 20   2007 install.log

[root@localhost1 ~]# nc -w 1 192.168.228.222 1234 < install.log

克隆硬盘或分区

操作与上面的拷贝是雷同的,只需要由dd获得硬盘或分区的数据,然后传输即可。克隆硬盘或分区的操作,不应在已经mount的的系统上进行。所以,需要使用安装光盘引导后,进入拯救模式(或使用Knoppix工 具光盘)启动系统后,在server2上进行类似的监听动作:

nc -l -p 1234 | dd of=/dev/sda

server1上执行传输,即可完成从server1克隆sda硬盘到server2的任务:

dd if=/dev/sda | nc 192.168.228.222 1234

完成上述工作的前提,是需要落实光盘的拯救模式支持服务器上的网卡,并正确配置IP。

端口扫描

nc -v -w 1 192.168.228.222 -z 1-1000
localhost2 [192.168.228.222] 22 (ssh) open

保存Web页面

while true; do
    nc -l -p 80 -q 1 < somepage.html;
done

聊天

nc还可以作为简单的字符下聊天工具使用,同样的,server2上需要启动监听:

[root@localhost2 tmp]# nc -lp 1234

server1上传输:

[root@localhost1 ~]# nc 192.168.228.222 1234

这样,双方就可以相互交流了。使用Ctrl+D正常退出。

传输目录

从server1拷贝nginx-0.6.34目录内容到server2上。需要先在server2上,用nc激活监听,server2上运行:

[root@localhost2 tmp]# nc -l 1234 | tar xzvf -

server1上运行:

[root@localhost1 ~]# ll -d nginx-0.6.34
drwxr-xr-x 8 1000 1000 4096 12-23 17:25 nginx-0.6.34

[root@localhost1 ~]# tar czvf – nginx-0.6.34 | nc 192.168.228.222 1234

xargs

==xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。xargs也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。xargs的默认命令是echo,空格是默认定界符。这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。==

  • xargs命令用法
    xargs用作替换工具,读取输入数据重新格式化后输出。
  1. 定义一个测试文件,内有多行文本数据:
cat test.txt

a b c d e f g
h i j k l m n
o p q
r s t
u v w x y z
  1. 多行输入单行输出:
cat test.txt | xargs

a b c d e f g h i j k l m n o p q r s t u v w x y z
  1. -n选项多行输出:
cat test.txt | xargs -n3

a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w x
y z
  1. -d选项可以自定义一个定界符:
echo "nameXnameXnameXname" | xargs -dX

name name name name
  1. 结合-n选项使用:
echo "nameXnameXnameXname" | xargs -dX -n2

name name
name name
  1. 读取stdin,将格式化后的参数传递给命令

假设一个命令为 sk.sh 和一个保存参数的文件arg.txt:

#!/bin/bash
#sk.sh命令内容,打印出所有参数。

echo $*

arg.txt文件内容:

cat arg.txt

aaa
bbb
ccc
  1. xargs的一个选项-I,使用-I指定一个替换字符串{},这个字符串在xargs扩展时会被替换掉,当-I与xargs结合使用,每一个参数命令都会被执行一次:
cat arg.txt | xargs -I {} ./sk.sh -p {} -l

-p aaa -l
-p bbb -l
-p ccc -l
  1. 复制所有图片文件到 /data/images 目录下:
ls *.jpg | xargs -n1 -I cp {} /data/images
  1. xargs结合find使用

用rm 删除太多的文件时候,可能得到一个错误信息:/bin/rm Argument list too long. 用xargs去避免这个问题:

find . -type f -name "*.log" -print0 | xargs -0 rm -f

xargs -0将\0作为定界符。

统计一个源代码目录中所有php文件的行数:

find . -type f -name "*.php" -print0 | xargs -0 wc -l

查找所有的jpg 文件,并且压缩它们:

find . -type f -name "*.jpg" -print | xargs tar -czvf images.tar.gz

xargs其他应用

  1. 假如你有一个文件包含了很多你希望下载的URL,你能够使用xargs下载所有链接:
cat url-list.txt | xargs wget -c

==子Shell(Subshells)==

运行一个shell脚本时会启动另一个命令解释器.,就好像你的命令是在命令行提示下被解释的一样,类似于批处理文件里的一系列命令。每个shell脚本有效地运行在父shell(parent shell)的一个子进程里。这个父shell是指在一个控制终端或在一个xterm窗口中给你命令指示符的进程。

cmd1 | ( cmd2; cmd3; cmd4 ) | cmd5

如果cmd2 是cd /,那么就会改变子Shell的工作目录,这种改变只是局限于子shell内部,cmd5则完全不知道工作目录发生的变化。子shell是嵌在圆括号()内部的命令序列,子Shell内部定义的变量为局部变量。

子shell可用于为一组命令设定临时的环境变量:

COMMAND1
COMMAND2
COMMAND3
(
  IFS=:
  PATH=/bin
  unset TERMINFO
  set -C
  shift 5
  COMMAND4
  COMMAND5
  exit 3 # 只是从子shell退出。
)
# 父shell不受影响,变量值没有更改。
COMMAND6
COMMAND7

exec

==exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端。==

  • 语法
exec(选项)(参数)
  • 选项
-c:在空环境中执行指定的命令。
  • 参数
指令:要执行的指令和相应的参数。
  • 实例

首先使用echo命令将文本“Linux C++”进行输出,输入如下命令:

echo Linux C++           #输出指定信息

执行上面的指令后,输出如下信息:

Linux C++                #输出信息

然后再使用exec命令调用echo命令输出同样的信息,并且对输出的信息进行对比,输入指令如下所示:

exec -c echo Linux C++          #调用命令

执行以上命令后,其输出信息如下:

Linux C++                       #使用指定指令输出信息

通过比较两者执行后的结果来看,所实现的功能是相同的,即使用exec命令调用echo命令成功。

export

==export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。==

一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。

  • 语法
export(选项)(参数)
  • 选项
-f:代表[变量名称]中为函数名称;
-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中;
-p:列出所有的shell赋予程序的环境变量。
  • 参数
变量:指定要输出或者删除的环境变量。
  • 实例

一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。查看已经存在的环境变量:

[root@localhost ~]# export
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x hostname="localhost"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="zh_CN.UTF-8"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x logname="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
declare -x mail="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x pwd="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_CLIENT="192.168.2.111 2705 22"
declare -x SSH_CONNECTION="192.168.2.111 2705 192.168.2.2 22"
declare -x SSH_TTY="/dev/pts/0"
declare -x TERM="linux"
declare -x USER="root"

unset

==unset命令用于删除已定义的shell变量(包括环境变量)和shell函数。unset命令不能够删除具有只读属性的shell变量和环境变量。==

  • 语法
unset(选项)(参数)
  • 选项
-f:仅删除函数;
-v:仅删除变量。
  • 参数
shell变量或函数:指定要删除的shell变量或shell函数。
  • 实例
    使用unset命令将前面所创建的环境变量mylove及其对应的值进行删除,输入如下命令:
unset -v mylove         #删除指定的环境变量

执行以上命令后,系统将删除指定的环境变量。用户可以使用env命令和grep命令对其进行查询。已经删除的环境变量再次使用指令查询时,将出现查询不到指定环境变量的输出信息。

type

==type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。==

命令类型:

  • alias:别名。
  • keyword:关键字,Shell保留字。
  • function:函数,Shell函数。
  • builtin:内建命令,Shell内建命令。
  • file:文件,磁盘文件,外部命令。
  • unfound:没有找到。

  • 语法
type(选项)(参数)
  • 选项
-t:输出“file”、“alias”或者“builtin”,分别表示给定的指令为“外部指令”、“命令别名”或者“内部指令”;
-p:如果给出的指令为外部指令,则显示其绝对路径;
-a:在环境变量“PATH”指定的路径中,显示给定指令的信息,包括命令别名。
  • 参数
指令:要显示类型的指令。
  • 实例
[root@localhost ~]# type ls
ls is aliased to `ls --color=tty'

[root@localhost ~]# type cd
cd is a shell builtin

[root@localhost ~]# type date
date is /bin/date

[root@localhost ~]# type mysql
mysql is /usr/bin/mysql

[root@localhost ~]# type nginx
-bash: type: nginx: not found

[root@localhost ~]# type if
if is a shell keyword

[root@localhost ~]# type which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

[root@localhost ~]# type -a cd
cd is a shell builtin

[root@localhost ~]# type -a grep
grep is /bin/grep

标签:文件,指定,目录,命令,常用命令,Linux150,root,CPU
来源: https://www.cnblogs.com/jacqueline95/p/12084252.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有