Linux知识整理

来源:互联网 发布:应用备份软件 编辑:程序博客网 时间:2024/06/06 01:50
========================ls====================
ls命令是linux下最常用的命令。ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单。如果ls指定其他目录,那么就会显示指定目录里的文件及文件夹清单。 通过ls 命令不仅可以查看linux文件夹包含的文件而且可以查看文件权限(包括目录、文件夹、文件权限)查看目录信息等等。ls 命令在日常的linux操作中用的很多!


1. 命令格式:


ls [选项] [目录名]


2. 命令功能:


列出目标目录中所有的子目录和文件。


3. 常用参数:
-a, –all 列出目录下的所有文件,包括以 . 开头的隐含文件


-A 同-a,但不列出“.”(表示当前目录)和“..”(表示当前目录的父目录)。


-c  配合 -lt:根据 ctime 排序及显示 ctime (文件状态最后更改的时间)配合 -l:显示 ctime 但根据名称排序否则:根据 ctime 排序


-C 每栏由上至下列出项目


–color[=WHEN] 控制是否使用色彩分辨文件。WHEN 可以是’never’、’always’或’auto’其中之一


-d, –directory 将目录象文件一样显示,而不是显示其下的文件。


-D, –dired 产生适合 Emacs 的 dired 模式使用的结果


-f 对输出的文件不进行排序,-aU 选项生效,-lst 选项失效


-g 类似 -l,但不列出所有者


-G, –no-group 不列出任何有关组的信息


-h, –human-readable 以容易理解的格式列出文件大小 (例如 1K 234M 2G)


–si 类似 -h,但文件大小取 1000 的次方而不是 1024


-H, –dereference-command-line 使用命令列中的符号链接指示的真正目的地
–indicator-style=方式 指定在每个项目名称后加上指示符号<方式>:none (默认),classify (-F),file-type (-p)


-i, –inode 印出每个文件的 inode 号


-I, –ignore=样式 不印出任何符合 shell 万用字符<样式>的项目


-k 即 –block-size=1K,以 k 字节的形式表示文件的大小。


-l 除了文件名之外,还将文件的权限、所有者、文件大小等信息详细列出来。


-L, –dereference 当显示符号链接的文件信息时,显示符号链接所指示的对象而并非符号链接本身的信息


-m 所有项目以逗号分隔,并填满整行行宽


-o 类似 -l,显示文件的除组信息外的详细信息。


-r, –reverse 依相反次序排列


-R, –recursive 同时列出所有子目录层


-s, –size 以块大小为单位列出所有文件的大小


-S 根据文件大小排序


–sort=WORD 以下是可选用的 WORD 和它们代表的相应选项:


extension -X status -c
none -U time -t
size -S atime -u
time -t access -u
version -v use -u


-t 以文件修改时间排序


-u 配合 -lt:显示访问时间而且依访问时间排序


配合 -l:显示访问时间但根据名称排序
否则:根据访问时间排序


-U 不进行排序;依文件系统原有的次序列出项目


-v 根据版本进行排序


-w, –width=COLS 自行指定屏幕宽度而不使用目前的数值


-x 逐行列出项目而不是逐栏列出


-X 根据扩展名排序


-1 每行只列出一个文件


–help 显示此帮助信息并离开


–version 显示版本信息并离开


例一:列出/home/peidachang文件夹下的所有文件和目录的详细资料


命令:ls -l -R /home/peidachang (ls -lR /home/peidachang)


“ls” 是命令关键字,“-l -R”是参数,“ /home/peidachang”是命令的操作对象。


例二:列出当前目录中所有以“t”开头的目录的详细内容,可以使用如下命令:ls -l t*


例三:只列出文件下的子目录,列出 /opt/soft 文件下面的子目录


命令:ls -F /opt/soft |grep /$


命令:ls -l /opt/soft | grep “^d”


列出 /opt/soft 文件下面的子目录详细情况


例四:列出目前工作目录下所有名称是s 开头的档案,愈新的排愈后面,可以使用如下命令:


命令:ls -ltr s*


例五:列出目前工作目录下所有档案及目录;目录于名称后加”/”, 可执行档于名称后加”*” 


命令:ls -AF


例六:计算当前目录下的文件数和目录数


命令:


ls -l * |grep “^-“|wc -l —文件个数
ls -l * |grep “^d”|wc -l    —目录个数


例七: 在ls中列出文件的绝对路径


命令:ls | sed “s:^:pwd/:”


例九:列出当前目录下的所有文件(包括隐藏文件)的绝对路径, 对目录不做递归


命令:find $PWD -maxdepth 1 | xargs ls -ld


例十:递归列出当前目录下的所有文件(包括隐藏文件)的绝对路径


命令: find $PWD | xargs ls -ld


例十一:指定文件时间输出格式


命令:ls -tl –time-style=full-iso


扩展:


1. 显示彩色目录列表


打开/etc/bashrc, 加入如下一行:
alias ls=”ls –color”


下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:


    1. 蓝色–>目录
    2. 绿色–>可执行文件
    3. 红色–>压缩文件
    4. 浅蓝色–>链接文件
    5. 灰色–>其他文件




===================cd=========================
inux cd 命令可以说是Linux中最基本的命令语句


1. 命令格式:cd [目录名]


2. 命令功能:切换当前目录至dirName


3.1 例一:进入系统根目录


命令:cd / (cd .. 或者 cd .. // 或 cd ../.. //)


例2:使用 cd 命令进入当前用户主目录


“当前用户主目录”和“系统根目录”是两个不同的概念。进入当前用户主目录有两个方法。


命令1:cd 命令2:cd ~


例3:跳转到指定目录(跳转到指定目录,从根目录开始,目录名称前加 / ,当前目录内的子目录直接写名称即可)


命令:cd /opt/soft


例四:返回进入此目录之前所在的目录


命令:cd –


例五:把上个命令的参数作为cd参数使用。


命令:cd !$




===============pwd=========================
Linux中用 pwd 命令来查看”当前工作目录“的完整路径。 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录。在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置。


1.命令格式:


pwd [选项]


2.命令功能:


查看”当前工作目录“的完整路径


3.常用参数:


一般情况下不带任何参数


如果目录是链接时:


格式:pwd -P  显示出实际路径,而非使用连接(link)路径。


实例1:用 pwd 命令查看默认工作目录的完整路径


命令:pwd


实例2:使用 pwd 命令查看指定文件夹


命令:pwd


实例三:目录连接链接时,pwd -P  显示出实际路径,而非使用连接(link)路径;pwd显示的是连接路径


命令:pwd -P


实例4:/bin/pwd


命令:/bin/pwd [选项]
选项:
-L 目录连接链接时,输出连接路径
-P 输出物理路径


实例五:当前目录被删除了,而pwd命令仍然显示那个目录


===================rm====================
rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。


1.命令格式:


rm [选项] 文件…


2.命令功能:


删除一个目录中的一个或多个文件或目录,如果没有使用- r选项,则rm不会删除目录。如果使用 rm 来删除文件,通常仍可以将该文件恢复原状。


3.命令参数:


-f, --force    忽略不存在的文件,从不给出提示。


-i, --interactive 进行交互式删除


-r, -R, --recursive   指示rm将参数中列出的全部目录和子目录均递归地删除。


-v, --verbose    详细显示进行的步骤


   --help     显示此帮助信息并退出


   --version  输出版本信息并退出


   
实例一:删除文件file,系统会先询问是否删除。


命令:rm 文件名
输入rm log.log命令后,系统会询问是否删除,输入y后就会删除文件,不想删除则数据n。


实例二:强行删除file,系统不再提示。


命令:rm -f log1.log


实例三:删除任何.log文件;删除前逐一询问确认


命令:rm -i *.log


实例四:将 test1子目录及子目录中所有档案删除


命令:rm -r test1


实例五:rm -rf test2命令会将 test2 子目录及子目录中所有档案删除,并且不用一一确认


命令:rm -rf  test2


实例六:删除以 -f 开头的文件


命令:rm -- -f


实例七:自定义回收站功能


命令:myrm(){ D=/tmp/$(date +%Y%m%d%H%M%S); mkdir -p $D; mv "$@" $D && echo "moved to $D ok"; }




===================rmdir=======================
rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm – r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。


1.命令格式:


rmdir [选项]… 目录…


2.命令功能:


该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限。


3.命令参数:


- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。
  如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。
 
-v, --verbose  显示指令执行过程


4.命令实例:


实例一:rmdir 不能删除非空目录


命令:rmdir doc (说明:rmdir 目录名 命令不能直接删除非空目录)


实例2:rmdir -p 当子目录被删除后使它也成为空目录的话,则顺便一并删除
命令:rmdir -p logs




=================mv=================
mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。


1.命令格式:


mv [选项] 源文件或目录 目标文件或目录


2.命令功能:


视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。


3.命令参数:


-b :若需覆盖文件,则覆盖前先行备份。
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新(update)
-t  : –target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定mv的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。


实例一:文件改名


命令:mv test.log test1.txt (将文件test.log重命名为test1.txt)


实例二:移动文件


命令:mv test1.txt test3 (将test1.txt文件移到目录test3中)


实例三:将文件log1.txt,log2.txt,log3.txt移动到目录test3中。


命令:
mv log1.txt log2.txt log3.txt test3
mv -t /opt/soft/test/test4/ log1.txt log2.txt  log3.txt
(mv log1.txt log2.txt log3.txt test3 命令将log1.txt ,log2.txt, log3.txt 三个文件移到 test3目录中去,mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 命令又将三个文件移动到test4目录中去)


实例四:将文件file1改名为file2,如果file2已经存在,则询问是否覆盖


命令:mv -i log1.txt log2.txt


实例五:将文件file1改名为file2,即使file2存在,也是直接覆盖掉。


命令:mv -f log3.txt log2.txt
(log3.txt的内容直接覆盖了log2.txt内容,-f 这是个危险的选项,使用的时候一定要保持头脑清晰,一般情况下最好不用加上它。)




实例六:目录的移动


命令:mv dir1 dir2 (如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中。)


实例7:移动当前文件夹下的所有文件到上一级目录


命令:mv * ../


实例八:把当前目录的一个子目录里的文件移动到另一个子目录里


命令:mv test3/*.txt test5


实例九:文件被覆盖前做简单备份,前面加参数-b


命令:mv log1.txt -b log2.txt
(
-b 不接受参数,mv会去读取环境变量VERSION_CONTROL来作为备份策略。
–backup该选项指定如果目标文件存在时的动作,共有四种备份策略:


1.CONTROL=none或off : 不备份。


2.CONTROL=numbered或t:数字编号的备份


3.CONTROL=existing或nil:如果存在以数字编号的备份,则继续编号备份m+1…n:


执行mv操作前已存在以数字编号的文件log2.txt.~1~,那么再次执行将产生log2.txt~2~,以次类推。如果之前没有以数字编号的文件,则使用下面讲到的简单备份。


4.CONTROL=simple或never:使用简单备份:在被覆盖前进行了简单备份,简单备份只能有一份,再次被覆盖时,简单备份也会被覆盖。
)




===================cp==================
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一。一般情下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数。但是如果是在shell脚本中执行cp时,没有-i参数时不会询问是否覆盖。这说明命令行和shell脚本的执行方式有些不同。


1.命令格式:


用法:
   cp [选项]… [-T] 源 目的
或:cp [选项]… 源… 目录
或:cp [选项]… -t 目录 源…


2.命令功能:将源文件复制至目标文件,或将多个源文件复制至目标目录。


3.命令参数:


-a, –archive    等于-dR –preserve=all
–backup[=CONTROL    为每个已存在的目标文件创建备份
-b                类似–backup 但不接受参数
–copy-contents        在递归处理是复制特殊文件内容
-d                等于–no-dereference –preserve=links
-f, –force        如果目标文件无法打开则将其移除并重试(当 -n 选项
存在时则不需再选此项)
-i, –interactive        覆盖前询问(使前面的 -n 选项失效)
-H                跟随源文件中的命令行符号链接
-l, –link            链接文件而不复制
-L, –dereference   总是跟随符号链接
-n, –no-clobber   不要覆盖已存在的文件(使前面的 -i 选项失效)
-P, –no-dereference   不跟随源文件中的符号链接
-p                等于–preserve=模式,所有权,时间戳
–preserve[=属性列表   保持指定的属性(默认:模式,所有权,时间戳),如果
可能保持附加属性:环境、链接、xattr 等
-R, -r, –recursive  复制目录及目录内的所有项目


4.命令实例:


实例一:复制单个文件到目标目录,文件在目标文件中不存在


命令:cp log.log test5 (在没有带-a参数时,两个文件的时间是不一样的。在带了-a参数时,两个文件的时间是一致的。)


实例二:目标文件存在时,会询问是否覆盖
命令:cp log.log test5
(目标文件存在时,会询问是否覆盖。这是因为cp是cp -i的别名。目标文件存在时,即使加了-f标志,也还会询问是否覆盖。)


实例三:复制整个目录
目标目录存在时: cp -a test3 test5
目标目录不存在时: cp -a test3test4
(注意目标目录存在与否结果是不一样的。目标目录存在时,整个源目录被复制到目标目录里面。)


实例四:复制的 log.log 建立一个连结档 log_link.log
命令: cp -s log.log log_link.log
(那个 log_link.log 是由 -s 的参数造成的,建立的是一个『快捷方式』,所以您会看到在文件的最右边,会显示这个文件是『连结』到哪里去的!)




================touch======================
linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件。


1.命令格式:


touch [选项]... 文件...


2.命令参数:


-a   或--time=atime或--time=access或--time=use  只更改存取时间。
-c   或--no-create  不建立任何文档。
-d  使用指定的日期时间,而非现在的时间。
-f  此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m   或--time=mtime或--time=modify  只更改变动时间。
-r  把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t  使用指定的日期时间,而非现在的时间。


3.命令功能:


touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。 


4.使用范例:


实例一:创建不存在的文件


命令:touch log2012.log log2013.log(如果log2014.log不存在,则不创建文件)


实例二:更新log.log的时间和log2012.log时间戳相同


命令:touch -r log.log log2012.log


实例三:设定文件的时间戳


命令:touch -t 201211142234.50 log.log
(-t  time 使用指定的时间值 time 作为指定文件相应时间戳记的新值.此处的 time规定为如下形式的十进制数:      
)




===============cat=============
cat命令的用途是连接文件或标准输入并打印。这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用。 


1.命令格式:


cat [选项] [文件]...


2.命令功能:


cat主要有三大功能:


1.一次显示整个文件:cat filename
2.从键盘创建一个文件:cat > filename 只能创建新文件,不能编辑已有文件.
3.将几个文件合并为一个文件:cat file1 file2 > file


3.命令参数:


-A, --show-all           等价于 -vET
-b, --number-nonblank    对非空输出行编号
-e                       等价于 -vE
-E, --show-ends          在每行结束处显示 $
-n, --number     对输出的所有行编号,由1开始对所有输出的行数编号
-s, --squeeze-blank  有连续两行以上的空白行,就代换为一行的空白行 
-t                       与 -vT 等价
-T, --show-tabs          将跳格字符显示为 ^I
-u                       (被忽略)
-v, --show-nonprinting   使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外


4.使用实例:


实例一:把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里


命令:cat -n log2012.log log2013.log 


实例二:把 log2012.log 和 log2013.log 的文件内容加上行号(空白行不加)之后将内容附加到 log.log 里。 


命令:cat -b log2012.log log2013.log log.log


实例三:把 log2012.log 的文件内容加上行号后输入 log.log 这个文件里 
命令:cat log.log
cat -n log2012.log>log.log
cat -n log.log
(tac 是将 cat 反写过来,所以他的功能就跟 cat 相反, cat 是由第一行到最后一行连续显示在萤幕上,而 tac 则是由最后一行到第一行反向在萤幕上显示出来!)




================nl===============
nl 命令在linux系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。  


1.命令格式:


nl [选项]... [文件]...


2.命令参数:


-b  :指定行号指定的方式,主要有两种:


-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);


-b t :如果有空行,空的那一行不要列出行号(默认值);


-n  :列出行号表示的方法,主要有三种:


-n ln :行号在萤幕的最左方显示;


-n rn :行号在自己栏位的最右方显示,且不加 0 ;


-n rz :行号在自己栏位的最右方显示,且加 0 ;


-w  :行号栏位的占用的位数。


-p 在逻辑定界符处不重新开始计算。 


3.命令功能:


nl 命令读取 File 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出。 在输出中,nl 命令根据您在命令行中指定的标志来计算左边的行。 输入文本必须写在逻辑页中。每个逻辑页有头、主体和页脚节(可以有空节)。 除非使用 -p 标志,nl 命令在每个逻辑页开始的地方重新设置行号。 可以单独为头、主体和页脚节设置行计算标志(例如,头和页脚行可以被计算然而文本行不能)。


4.使用实例:


实例一:用 nl 列出 log2012.log 的内容


命令:nl log2012.log (文件中的空白行,nl 不会加上行号)


实例二:用 nl 列出 log2012.log 的内容,空本行也加上行号


命令:nl -b a log2012.log


实例3:让行号前面自动补上0,统一输出格式
命令:nl -b a -n rz log2014.log
(nl -b a -n rz 命令行号默认为六位,要调整位数可以加上参数 -w 3 调整为3位。)




============================================
more命令,功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上。 more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。more命令从前向后读取文件,因此在启动时就加载整个文件。


1.命令格式:


more [-dlfpcsu ] [-num ] [+/ pattern] [+ linenum] [file ... ] 


2.命令功能:


more命令和cat的功能一样都是查看文件里的内容,但有所不同的是more可以按页来查看文件的内容,还支持直接跳转行等功能。


3.命令参数:


+n      从笫n行开始显示
-n       定义屏幕大小为n行
+/pattern 在每个档案显示前搜寻该字串(pattern),然后从该字串前两行之后开始显示  
-c       从顶部清屏,然后显示
-d       提示“Press space to continue,’q’ to quit(按空格键继续,按q键退出)”,禁用响铃功能
-l        忽略Ctrl+l(换页)字符
-p       通过清除窗口而不是滚屏来对文件进行换页,与-c选项相似
-s       把连续的多个空行显示为一行
-u       把文件内容中的下画线去掉


4.常用操作命令:


Enter    向下n行,需要定义。默认为1行
Ctrl+F   向下滚动一屏
空格键  向下滚动一屏
Ctrl+B  返回上一屏
=       输出当前行的行号
:f     输出文件名和当前行的行号
V      调用vi编辑器
!命令   调用Shell,并执行命令 
q       退出more


5.命令实例:


实例1:显示文件中从第3行起的内容


命令:more +3 log2012.log


实例2:从文件中查找第一个出现"day3"字符串的行,并从该处前两行开始显示输出 


命令:more +/day3 log2012.log


实例3:设定每屏显示行数 


命令:more -5 log2012.log


实例4:列一个目录下的文件,由于内容太多,我们应该学会用more来分页显示。这得和管道 | 结合起来 


命令:ls -l  | more -5
(每页显示5个文件信息,按 Ctrl+F 或者 空格键 将会显示下5条文件信息。)




==================less===================
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。


在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。


1.命令格式:


less [参数]  文件 


2.命令功能:


less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。


3.命令参数:


-b <缓冲区大小> 设置缓冲区的大小
-e  当文件显示结束后,自动离开
-f  强迫打开特殊文件,例如外围设备代号、目录和二进制文件
-g  只标志最后搜索的关键词
-i  忽略搜索时的大小写
-m  显示类似more命令的百分比
-N  显示每行的行号
-o <文件名> 将less 输出的内容在指定文件中保存起来
-Q  不使用警告音
-s  显示连续空行为一行
-S  行过长时间将超出部分舍弃
-x <数字> 将“tab”键显示为规定的数字空格
/字符串:向下搜索“字符串”的功能
?字符串:向上搜索“字符串”的功能
n:重复前一个搜索(与 / 或 ? 有关)
N:反向重复前一个搜索(与 / 或 ? 有关)
b  向后翻一页
d  向后翻半页
h  显示帮助界面
Q  退出less 命令
u  向前滚动半页
y  向前滚动一行
空格键 滚动一行
回车键 滚动一页
[pagedown]: 向下翻动一页
[pageup]:   向上翻动一页


4.使用实例:


实例1:查看文件


命令:less log2013.log


实例2:ps查看进程信息并通过less分页显示 


命令:ps -ef |less


实例3:查看命令历史使用记录并通过less分页显示


命令:history | less


实例5:浏览多个文件 


命令:Less log2013.log log2014.log
(说明:输入 :n后,切换到 log2014.log 输入 :p 后,切换到log2013.log)


5.附加备注


1.全屏导航


ctrl + F - 向前移动一屏
ctrl + B - 向后移动一屏
ctrl + D - 向前移动半屏
ctrl + U - 向后移动半屏
 
2.单行导航


j - 向前移动一行
k - 向后移动一行
 
3.其它导航


G - 移动到最后一行
g - 移动到第一行
q / ZZ - 退出 less 命令
 
4.其它有用的命令


v - 使用配置的编辑器编辑当前文件
h - 显示 less 的帮助文档
&pattern - 仅显示匹配模式的行,而不是整个文件
 
5.标记导航


当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:


ma - 使用 a 标记文本的当前位置
'a - 导航到标记 a 处




==================head===================
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。 


1.命令格式:


head [参数]... [文件]...  


2.命令功能:


head 用来显示档案的开头至标准输出中,默认head命令打印其相应文件的开头10行。
 
3.命令参数:


-q 隐藏文件名
-v 显示文件名
-c<字节> 显示字节数
-n<行数> 显示的行数


4.使用实例:


实例1:显示文件的前n行


命令:head -n 5 log2014.log


实例2:显示文件前n个字节


命令:head -c 20 log2014.log


实例3:文件的除了最后n个字节以外的内容 


命令:head -c -32 log2014.log


实例4:输出文件除了最后n行的全部内容


命令:head -n -6 log2014.log




===================tail=====================
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容. 


1.命令格式;


tail[必要参数][选择参数][文件]   


2.命令功能:


用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。


3.命令参数:


-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c<数目> 显示的字节数
-n<行数> 显示行数
--pid=PID 与-f合用,表示在进程ID,PID死掉之后结束. 
-q, --quiet, --silent 从不输出给出文件名的首部 
-s, --sleep-interval=S 与-f合用,表示在每次反复的间隔休眠S秒 


4.使用实例:


实例1:显示文件末尾内容


命令:tail -n 5 log2014.log (显示文件最后5行内容)


实例2:循环查看文件内容


命令:tail -f test.log
(ping 192.168.120.204 > test.log & //在后台ping远程主机。并输出文件到test.log;这种做法也使用于一个以上的档案监视。用Ctrl+c来终止。 )


实例3:从第5行开始显示文件


命令:tail -n +5 log2014.log




=====================which===================
我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:


which  查看可执行文件的位置。


whereis 查看文件的位置。 


locate   配合数据库查看文件位置。


find   实际搜寻硬盘查询文件名称。


which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
 
1.命令格式:


which 可执行文件名称 


2.命令功能:


which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。


3.命令参数:


-n  指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p  与-n参数相同,但此处的包括了文件的路径。
-w  指定输出时栏位的宽度。
-V  显示版本信息


4.使用实例:


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


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




实例2:用 which 去找出 which


命令:which which (竟然会有两个 which ,其中一个是 alias 这就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令!)


实例3:找出 cd 这个命令


命令:which cd (cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是bash 内建的命令! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的!)




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


和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通 过遍历硬盘来查找,效率自然会很高。 


但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。 


1.命令格式:


whereis [-bmsu] [BMS 目录名 -f ] 文件名


2.命令功能:


whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis 程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。


3.命令参数:


-b   定位可执行文件。
-m   定位帮助文件。
-s   定位源代码文件。
-u   搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件。
-B   指定搜索可执行文件的路径。
-M   指定搜索帮助文件的路径。
-S   指定搜索源代码文件的路径。


4.使用实例:


实例1:将和**文件相关的文件都查找出来


命令:whereis svn (tomcat没安装,找不出来,svn安装找出了很多相关文件)




实例2:只将二进制文件 查找出来 


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




==================locate=====================
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。在一般的 distribution 之中,数据库的建立都被放在 crontab 中自动执行。


1.命令格式:


Locate [选择参数] [样式]


2.命令功能:


locate命令可以在搜寻数据库时快速找到档案,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab)


locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。


locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。


3.命令参数:


-e   将排除在寻找的范围之外。
-1  如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的权限资料。
-f   将特定的档案系统排除在外,例如我们没有到理要把 proc 档案系统中的档案放在资料库中。
-q  安静模式,不会显示任何错误讯息。
-n 至多显示 n个输出。
-r 使用正规运算式 做寻找的条件。
-o 指定资料库存的名称。
-d 指定资料库的路径
-h 显示辅助讯息
-V 显示程式的版本讯息


4.使用实例:


实例1:查找和pwd相关的所有文件


命令:locate pwd


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


命令:locate /etc/sh


实例3:搜索etc目录下,所有以m开头的文件


命令:locate /etc/m




=================find=======================
Linux下find命令在目录结构中搜索文件,并执行指定的操作。Linux下find命令提供了相当多的查找条件,功能很强大。由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。


1.命令格式:


find pathname -options [-print -exec -ok ...]


2.命令功能:


用于在文件树种查找文件,并作出相应的处理


3.命令参数:


pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
 
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } ;,注意{   }和;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。


4.命令选项:


-name   按照文件名查找文件。
-perm   按照文件权限来查找文件。
-prune  使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
 
-user   按照文件属主来查找文件。
-group  按照文件所属的组来查找文件。
-mtime -n +n  按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。
 
-nogroup  查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser   查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2  查找更改时间比文件file1新但比文件file2旧的文件。
 
-type  查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
 
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
 
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。




另外,下面三个的区别:


-amin n   查找系统中最后N分钟访问的文件
-atime n  查找系统中最后n*24小时访问的文件
-cmin n   查找系统中最后N分钟被改变文件状态的文件
-ctime n  查找系统中最后n*24小时被改变文件状态的文件
-mmin n   查找系统中最后N分钟被改变文件数据的文件
-mtime n  查找系统中最后n*24小时被改变文件数据的文件


5.使用实例:


实例1:查找指定时间内修改过的文件


命令:find -atime -2 (超找48小时内修改过的文件)


实例2:根据关键字查找


命令:find . -name "*.log"
(在当前目录查找 以.log结尾的文件。 “. “代表当前目录)


实例3:按照目录或文件的权限来查找文件


命令:find /opt/soft/test/ -perm 777
(查找/opt/soft/test/目录下 权限为 777的文件)


实例4:按类型查找


命令: find . -type f -name "*.log"(查找当目录,以.log结尾的普通文件)


实例5:查找当前所有目录并排序


命令:find . -type d | sort


实例6:按大小查找文件


命令:find . -size +1000c -print (查找当前目录大于1K的文件)




=================find exec====================
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了。 


exec解释:


-exec  参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。


{}   花括号代表前面find查找出来的文件名。


使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。


实例1:ls -l命令放在find命令的-exec选项中 


命令:find . -type f -exec ls -l {} \;
(上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。)




实例2:在目录中查找更改时间在n日以前的文件并删除它们


命令 find . -type f -mtime +14 -exec rm {} \; 
(在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。 )


实例3:在目录中查找更改时间在n日以前的文件并删除它们,在删除之前先给出提示


命令:find . -name "*.log" -mtime +5 -ok rm {} \;
(在上面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。 按y键删除文件,按n键不删除。 )


实例4:-exec中使用grep命令


命令:find /etc -name "passwd*" -exec grep "root" {} \;
(任何形式的命令都可以在-exec选项中使用。  在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个root用户。)


实例5:查找文件移动到指定目录  


命令:find . -name "*.log" -exec mv {} .. \;


实例6:用exec选项执行cp命令  


命令:find . -name "*.log" -exec cp {} test3 \;




======================find xargs=============================
在使用 find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。  


find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。  


在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。


使用实例:


实例1: 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件 


命令:find . -type f -print | xargs file


实例2:在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中


命令:find / -name "core" -print | xargs echo "" >/tmp/core.log


实例3:在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限


命令:find . -perm -7 -print | xargs chmod o-w
(执行命令后,文件夹scf、test3和test4的权限都发生改变)


实例4:用grep命令在所有的普通文件中搜索hostname这个词


命令:find . -type f -print | xargs grep "hostname"


实例5:用grep命令在当前目录下的所有普通文件中搜索hostnames这个词


命令:find . -name \* -type f -print | xargs grep "hostnames"
(注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。  )


实例6:使用xargs执行mv 


命令:find . -name "*.log" | xargs -i mv {} test4


实例7:find后执行xargs提示xargs: argument line too long解决方法:


命令:find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f
(-l1是一次处理一个;-t是处理之前打印出命令)


实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] 
(使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[] )


实例9:xargs的-p参数的使用 


命令:find . -name "*.log" | xargs -p -i mv {} ..
(-p参数会提示让你确认是否执行后面的命令,y执行,n不执行。)




========================find 命令的参数详解=======================
find一些常用参数的一些常用实例和一些具体用法和注意事项。


1.使用name选项:


文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。  可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。  不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.log的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。


find ~ -name "*.log" -print  


想要在当前目录及子目录中查找所有的‘ *.log‘文件,可以用: 


find . -name "*.log" -print  


想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:  


find . -name "[A-Z]*" -print  


想要在/etc目录中查找文件名以host开头的文件,可以用:  


find /etc -name "host*" -print  


想要查找$HOME目录中的文件,可以用:  


find ~ -name "*" -print 或find . -print  


要想让系统高负荷运行,就从根目录开始查找所有的文件。  


find / -name "*" -print  


如果想在当前目录查找文件名以一个个小写字母开头,最后是4到9加上.log结束的文件:  


命令:find . -name "[a-z]*[4-9].log" -print


2.用perm选项:


按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。  


如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:  


还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-005相当于555,


命令:find . -perm -005


3.忽略某个目录:


如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以用:  


命令:find test -path "test/test3" -prune -o -print


4.使用find查找文件的时候怎么避开某个文件目录: 


实例1:在test 目录下查找不在test4子目录之内的所有文件


命令:find test -path "test/test4" -prune -o -print
(find [-path ..] [expression] 


在路径列表的后面的是表达式 


-path "test" -prune -o -print 是 -path "test" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 
-path "test" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "test" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。 )


实例2:避开多个文件夹:


命令:find test \( -path test/test4 -o -path test/test3 \) -prune -o -print 
(圆括号表示表达式的结合。  \ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。 )




实例3:查找某一确定文件,-name等选项加在-o 之后


命令:find test \(-path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -print


5.使用user和nouser选项:


按文件属主查找文件:


实例1:在$HOME目录中查找文件属主为peida的文件 


命令:find ~ -user peida -print  


实例2:在/etc目录下查找文件属主为peida的文件: 


命令:find /etc -user peida -print  


实例3:为了查找属主帐户已经被删除的文件,可以使用-nouser选项。在/home目录下查找所有的这类文件


命令:find /home -nouser -print


说明:这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。


6.使用group和nogroup选项:


就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:  


find /apps -group gem -print  


要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件:


find / -nogroup-print


7.按照更改时间或访问时间等查找文件:


如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。  


用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。  


希望在系统根目录下查找更改时间在5日以内的文件,可以用:


find / -mtime -5 -print


为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:


find /var/adm -mtime +3 -print


8.查找比某个文件新或旧的文件:


如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。


它的一般形式为:  


newest_file_name ! oldest_file_name  


其中,!是逻辑非符号。  


实例1:查找更改时间比文件log2012.log新但比文件log2017.log旧的文件


命令:find -newer log2012.log ! -newer log2017.log


实例2:查找更改时间在比log2012.log文件新的文件  


命令:find . -newer log2012.log -print


9.使用type选项:


实例1:在/etc目录下查找所有的目录  


命令:


find /etc -type d -print  


实例2:在当前目录下查找除目录以外的所有类型的文件  


命令:


find . ! -type d -print  


实例3:在/etc目录下查找所有的符号链接文件


命令:


find /etc -type l -print


10.使用size选项:


可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。  


在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
  
实例1:在当前目录下查找文件长度大于1 M字节的文件  


命令:


find . -size +1000000c -print


实例2:在/home/apache目录下查找文件长度恰好为100字节的文件:  


命令:


find /home/apache -size 100c -print  


实例3:在当前目录下查找长度超过10块的文件(一块等于512字节) 


命令:


find . -size +10 -print


11.使用depth选项:


在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。  


实例1:find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。   


命令:find / -name "CON.FILE" -depth -print


说明:


它将首先匹配所有的文件然后再进入子目录中查找


12.使用mount选项: 


在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。


实例1:从当前目录开始查找位于本文件系统中文件名以XC结尾的文件  


命令:find . -name "*.XC" -mount -print 


=================Linux目录===================
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面我们就开始了解一下linux目录结构的相关知识。


当在使用Linux的时候,如果您通过ls –l / 就会发现,在/下包涵很多的目录,比如etc、usr、var、bin … … 等目录,而在这些目录中,我们进去看看,发现也有很多的目录或文件。文件系统在Linux下看上去就象树形结构,所以我们可以把文件系统的结构形象的称为 树形结构。


文件系统的是用来组织和排列文件存取的,所以她是可见的,在Linux中,我们可以通过ls等工具来查看其结构,在Linux系统中,我们见到的都是树形结构;比如操作系统安装在一个文件系统中,他表现为由/ 起始的树形结构。linux文件系统的最顶端是/,我们称/为Linux的root,也就是 Linux操作系统的文件系统。Linux的文件系统的入口就是/,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。


由于linux是开放源代码,各大公司和团体根据linux的核心代码做各自的操作,编程。这样就造成在根下的目录的不同。这样就造成个人不能使用他人的linux系统的PC。因为你根本不知道一些基本的配置,文件在哪里。。。这就造成了混乱。这就是FHS(Filesystem Hierarchy Standard )机构诞生的原因。该机构是linux爱好者自发的组成的一个团体,主要是是对linux做一些基本的要求,不至于是操作者换一台主机就成了linux的‘文盲’。


根据FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据而已。 这样做好处非常多,因为Linux操作系统就能够在既有的面貌下(目录架构不变)发展出开发者想要的独特风格。


事实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否与是否允许使用者随意更动, 而将目录定义成为四种交互作用的形态,用表格来说有点像底下这样:


可分享的(shareable) 不可分享的(unshareable)
不变的(static) /usr (软件放置处)/etc (配置文件)
/opt (第三方协力软件) /boot (开机与核心档)
可变动的(variable) /var/mail (使用者邮件信箱)/var/run (程序相关)
/var/spool/news (新闻组) /var/lock (程序相关)




四种类型:


1. 可分享的:


可以分享给其他系统挂载使用的目录,所以包括执行文件与用户的邮件等数据, 是能够分享给网络上其他主机挂载用的目录;


2. 不可分享的:


自己机器上面运作的装置文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。


3. 不变的:


有些数据是不会经常变动的,跟随着distribution而不变动。 例如函式库、文件说明文件、系统管理员所管理的主机服务配置文件等等;


4. 可变动的:


经常改变的数据,例如登录文件、一般用户可自行收受的新闻组等。


事实上,FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已,分别是底下这三个目录的定义:


/ (root, 根目录):与开机系统有关;


/usr (unix software resource):与软件安装/执行有关;


/var (variable):与系统运作过程有关。


一. 根目录 (/) 的意义与内容:


根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的, 同时根目录也与开机/还原/系统修复等动作有关。 由于系统开机时需要特定的开机软件、核心文件、开机所需程序、 函式库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区, 因为越大的分区内你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。


因此FHS标准建议:根目录(/)所在分区应该越小越好, 且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。 如此不但效能较佳,根目录所在的文件系统也较不容易发生问题。说白了,就是根目录和Windows的C盘一个样。


根据以上原因,FHS认为根目录(/)下应该包含如下子目录:


目录 应放置档案内容
/bin 系统有很多放置执行档的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin底下的指令可以被root与一般帐号所使用,主要有:cat,chmod(修改权限), chown, date, mv, mkdir, cp, bash等等常用的指令。
/boot 主要放置开机会使用到的档案,包括Linux核心档案以及开机选单与开机所需设定档等等。Linux kernel常用的档名为:vmlinuz ,如果使用的是grub这个开机管理程式,则还会存在/boot/grub/这个目录。
/dev 在Linux系统上,任何装置与周边设备都是以档案的型态存在于这个目录当中。 只要通过存取这个目录下的某个档案,就等于存取某个装置。比要重要的档案有/dev/null, /dev/zero, /dev/tty , /dev/lp*, / dev/hd*, /dev/sd*等等
/etc 系统主要的设定档几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。 一般来说,这个目录下的各档案属性是可以让一般使用者查阅的,但是只有root有权力修改。 FHS建议不要放置可执行档(binary)在这个目录中。 比较重要的档案有:/etc/inittab, /etc/init.d/, /etc/modprobe.conf, /etc/X11/, /etc/fstab, /etc/sysconfig/等等。 另外,其下重要的目录有:/etc/init.d/ :所有服务的预设启动script都是放在这里的,例如要启动或者关闭iptables的话: /etc/init.d/iptables start、/etc/init.d/ iptables stop




/etc/xinetd.d/ :这就是所谓的super daemon管理的各项服务的设定档目录。


/etc/X11/ :与X Window有关的各种设定档都在这里,尤其是xorg.conf或XF86Config这两个X Server的设定档。


/home 这是系统预设的使用者家目录(home directory)。 在你新增一个一般使用者帐号时,预设的使用者家目录都会规范到这里来。比较重要的是,家目录有两种代号:
~ :代表当前使用者的家目录,而 ~guest:则代表用户名为guest的家目录。
/lib 系统的函式库非常的多,而/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库而已 。 什么是函式库呢?妳可以将他想成是外挂,某些指令必须要有这些外挂才能够顺利完成程式的执行之意。 尤其重要的是/lib/modules/这个目录,因为该目录会放置核心相关的模组(驱动程式)。
/media media是媒体的英文,顾名思义,这个/media底下放置的就是可移除的装置。 包括软碟、光碟、DVD等等装置都暂时挂载于此。 常见的档名有:/media/floppy, /media/cdrom等等。
/mnt 如果妳想要暂时挂载某些额外的装置,一般建议妳可以放置到这个目录中。在古早时候,这个目录的用途与/media相同啦。 只是有了/media之后,这个目录就用来暂时挂载用了。
/opt 这个是给第三方协力软体放置的目录 。 什么是第三方协力软体啊?举例来说,KDE这个桌面管理系统是一个独立的计画,不过他可以安装到Linux系统中,因此KDE的软体就建议放置到此目录下了。 另外,如果妳想要自行安装额外的软体(非原本的distribution提供的),那么也能够将你的软体安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下。
/root 系统管理员(root)的家目录。 之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的家目录,所以我们会希望root的家目录与根目录放置在同一个分区中。
/sbin Linux有非常多指令是用来设定系统环境的,这些指令只有root才能够利用来设定系统,其他使用者最多只能用来查询而已。放在/sbin底下的为开机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。至于某些伺服器软体程式,一般则放置到/usr/sbin/当中。至于本机自行安装的软体所产生的系统执行档(system binary),则放置到/usr/local/sbin/当中了。常见的指令包括:fdisk, fsck, ifconfig, init, mkfs等等。
/srv srv可以视为service的缩写,是一些网路服务启动之后,这些服务所需要取用的资料目录。 常见的服务例如WWW, FTP等等。 举例来说,WWW伺服器需要的网页资料就可以放置在/srv/www/里面。呵呵,看来平时我们编写的代码应该放到这里了。
/tmp 这是让一般使用者或者是正在执行的程序暂时放置档案的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要资料不可放置在此目录啊。 因为FHS甚至建议在开机时,应该要将/tmp下的资料都删除。




事实上FHS针对根目录所定义的标准就仅限于上表,不过仍旧有些目录也需要我们了解一下,具体如下:






目录 应放置文件内容
/lost+found 这个目录是使用标准的ext2/ext3档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时,将一些遗失的片段放置到这个目录下。 这个目录通常会在分割槽的最顶层存在,例如你加装一个硬盘于/disk中,那在这个系统下就会自动产生一个这样的目录/disk/lost+found
/proc 这个目录本身是一个虚拟文件系统(virtual filesystem)喔。 他放置的资料都是在内存当中,例如系统核心、行程资讯(process)(是进程吗?)、周边装置的状态及网络状态等等。因为这个目录下的资料都是在记忆体(内存)当中,所以本身不占任何硬盘空间。比较重要的档案(目录)例如: /proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/*等等。呵呵,是虚拟内存吗[guest]?
/sys 这个目录其实跟/proc非常类似,也是一个虚拟的档案系统,主要也是记录与核心相关的资讯。 包括目前已载入的核心模组与核心侦测到的硬体装置资讯等等。 这个目录同样不占硬盘容量。
除了这些目录的内容之外,另外要注意的是,因为根目录与开机有关,开机过程中仅有根目录会被挂载, 其他分区则是在开机完成之后才会持续的进行挂载的行为。就是因为如此,因此根目录下与开机过程有关的目录, 就不能够与根目录放到不同的分区去。那哪些目录不可与根目录分开呢?有底下这些:


/etc:配置文件


/bin:重要执行档


/dev:所需要的装置文件


/lib:执行档所需的函式库与核心所需的模块


/sbin:重要的系统执行文件


这五个目录千万不可与根目录分开在不同的分区。请背下来啊。


二. /usr 的意义与内容:


依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分区的挂载(例如在服务器篇会谈到的NFS服务器),那么/usr确实可以分享给局域网络内的其他主机来使用喔。


/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据啦。这点要注意。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。


因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目录有点类似Windows 系统的C:Windows + C:Program files这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬盘容量。 一般来说,/usr的次目录建议有底下这些:


目录 应放置文件内容
/usr/X11R6/ 为X Window System重要数据所放置的目录,之所以取名为X11R6是因为最后的X版本为第11版,且该版的第6次释出之意。
/usr/bin/ 绝大部分的用户可使用指令都放在这里。请注意到他与/bin的不同之处。(是否与开机过程有关)
/usr/include/ c/c++等程序语言的档头(header)与包含档(include)放置处,当我们以tarball方式 (*.tar.gz 的方式安装软件)安装某些数据时,会使用到里头的许多包含档。
/usr/lib/ 包含各应用软件的函式库、目标文件(object file),以及不被一般使用者惯用的执行档或脚本(script)。 某些软件会提供一些特殊的指令来进行服务器的设定,这些指令也不会经常被系统管理员操作, 那就会被摆放到这个目录下啦。要注意的是,如果你使用的是X86_64的Linux系统, 那可能会有/usr/lib64/目录产生
/usr/local/ 统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录, 这样会比较便于管理。举例来说,你的distribution提供的软件较旧,你想安装较新的软件但又不想移除旧版, 此时你可以将新版软件安装于/usr/local/目录下,可与原先的旧版软件有分别啦。 你可以自行到/usr/local去看看,该目录下也是具有bin, etc, include, lib…的次目录
/usr/sbin/ 非系统正常运作所需要的系统指令。最常见的就是某些网络服务器软件的服务指令(daemon)
/usr/share/ 放置共享文件的地方,在这个目录下放置的数据几乎是不分硬件架构均可读取的数据, 因为几乎都是文本文件嘛。在此目录下常见的还有这些次目录:/usr/share/man:联机帮助文件




/usr/share/doc:软件杂项的文件说明


/usr/share/zoneinfo:与时区有关的时区文件


/usr/src/ 一般原始码建议放置到这里,src有source的意思。至于核心原始码则建议放置到/usr/src/linux/目录下。




三.  /var 的意义与内容:


如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运作后才会渐渐占用硬盘容量的目录。 因为/var目录主要针对常态性变动的文件,包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件, 包括程序文件(lock file, run file),或者例如MySQL数据库的文件等等。常见的次目录有:


目录 应放置文件内容
/var/cache/ 应用程序本身运作过程中会产生的一些暂存档
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置的目录。在此目录下各自的软件应该要有各自的目录。 举例来说,MySQL的数据库放置到/var/lib/mysql/而rpm的数据库则放到/var/lib/rpm去
/var/lock/ 某些装置或者是文件资源一次只能被一个应用程序所使用,如果同时有两个程序使用该装置时, 就可能产生一些错误的状况,因此就得要将该装置上锁(lock),以确保该装置只会给单一软件所使用。 举例来说,刻录机正在刻录一块光盘,你想一下,会不会有两个人同时在使用一个刻录机烧片? 如果两个人同时刻录,那片子写入的是谁的数据?所以当第一个人在刻录时该刻录机就会被上锁, 第二个人就得要该装置被解除锁定(就是前一个人用完了)才能够继续使用
/var/log/ 非常重要。这是登录文件放置的目录。里面比较重要的文件如/var/log/messages, /var/log/wtmp(记录登入者的信息)等。
/var/mail/ 放置个人电子邮件信箱的目录,不过这个目录也被放置到/var/spool/mail/目录中,通常这两个目录是互为链接文件。
/var/run/ 某些程序或者是服务启动后,会将他们的PID放置在这个目录下
/var/spool/ 这个目录通常放置一些队列数据,所谓的“队列”就是排队等待其他程序使用的数据。 这些数据被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中, 但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中, 等到被送出后就被删除。如果是工作排程数据(crontab),就会被放置到/var/spool/cron/目录中。
由于FHS仅是定义出最上层(/)及次层(/usr, /var)的目录内容应该要放置的文件或目录数据, 因此,在其他次目录层级内,就可以随开发者自行来配置了。


四. 目录树(directory tree) :


在Linux底下,所有的文件与目录都是由根目录开始的。那是所有目录与文件的源头, 然后再一个一个的分支下来,因此,我们也称这种目录配置方式为:目录树(directory tree), 这个目录树的主要特性有:


目录树的启始点为根目录 (/, root);


每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 服务器挂载某特定目录等。


每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。


五. 绝对路径与相对路径


除了需要特别注意的FHS目录配置外,在文件名部分我们也要特别注意。因为根据档名写法的不同,也可将所谓的路径(path)定义为绝对路径(absolute)与相对路径(relative)。 这两种文件名/路径的写法依据是这样的:


绝对路径:


由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;


相对路径:


相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 http://www.cnblogs.com/home/dmtsai/ 等等。反正开头不是 / 就属于相对路径的写法


而你必须要了解,相对路径是以你当前所在路径的相对位置来表示的。举例来说,你目前在 /home 这个目录下, 如果想要进入 /var/log 这个目录时,可以怎么写呢?


cd /var/log   (absolute)


cd ../var/log (relative)


因为你在 /home 底下,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的,特别注意这两个特殊的目录:


.  :代表当前的目录,也可以使用 ./ 来表示;


.. :代表上一层目录,也可以 ../ 来代表。


这个 . 与 .. 目录概念是很重要的,你常常会看到 cd .. 或 ./command 之类的指令下达方式, 就是代表上一层与目前所在目录的工作状态。


实例1:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?


命令:
cd /var/spool/mail
cd ../cron


说明:


由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中。如此就不需要在由根目录开始写起了。这个相对路径是非常有帮助的,尤其对于某些软件开发商来说。 一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录。 但如果用户想要安装到不同目录呢?就得要使用相对路径。


实例2:网络文件常常提到类似./run.sh之类的数据,这个指令的意义为何?


说明:


由于指令的执行需要变量的支持,若你的执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin, /usr/bin等为正规),此时要执行指令就得要严格指定该执行档。./代表本目录的意思,所以./run.sh代表执行本目录下, 名为run.sh的文件。




=======================Linux 文件类型与扩展名=====================
由于昨天的失误,正文有部分内容遗漏,故而今天重发。


Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz ,这些文件虽然要用不同的程序来打开,但放在Linux文件类型中衡量的话,大多是常规文件(也被称为普通文件)。


一. 文件类型


Linux文件类型常见的有:普通文件、目录文件、字符设备文件和块设备文件、符号链接文件等,现在我们进行一个简要的说明。


1. 普通文件 


我们用 ls -lh 来查看某个文件的属性,可以看到有类似-rwxrwxrwx,值得注意的是第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。这类文件的删除方式是用rm 命令。 另外,依照文件的内容,又大略可以分为:


1>. 纯文本档(ASCII):


这是Linux系统中最多的一种文件类型,称为纯文本档是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们可以用来做为设定的文件都属于这一种文件类型。 举例来说,你可以用命令: cat ~/.bashrc 来看到该文件的内容。 (cat 是将一个文件内容读出来的指令).


2>. 二进制文件(binary):


Linux系统其实仅认识且可以执行二进制文件(binary file)。Linux当中的可执行文件(scripts, 文字型批处理文件不算)就是这种格式的文件。 刚刚使用的命令cat就是一个binary file。


3>. 数据格式文件(data): 


有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在使用者登录时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件?


2. 目录文件


当我们在某个目录下执行,看到有类似 drwxr-xr-x ,这样的文件就是目录,目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。 


3. 字符设备或块设备文件 


如时您进入/dev目录,列一下文件,
我们看到/dev/tty的属性是 crw-rw-rw- ,注意前面第一个字符是 c ,这表示字符设备文件。比如猫等串口设备。我们看到 /dev/sda1 的属性是 brw-r----- ,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备。


这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。


与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:


区块(block)设备档 :


就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]!


字符(character)设备文件:


亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是一次性读取的,不能够截断输出。 举例来说,你不可能让鼠标跳到另一个画面,而是滑动到另一个地方!第一个属性为 [ c ]。


4. 数据接口文件(sockets): 


数据接口文件(或者:套接口文件),这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了。


例如:当我们启动MySQL服务器时,会产生一个mysql.sock的文件。
注意这个文件的属性的第一个字符是 s。


5. 符号链接文件: 


当我们查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名 新文件名 。上面是一个例子,表示setup.log是install.log的软链接文件。怎么理解呢?这和Windows操作系统中的快捷方式有点相似。


6. 数据输送文件(FIFO,pipe):


FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。


二. Linux文件扩展名


1. 扩展名类型


基本上,Linux的文件是没有所谓的扩展名的,一个Linux文件能不能被执行,与他的第一栏的十个属性有关, 与档名根本一点关系也没有。这个观念跟Windows的情况不相同喔!在Windows底下, 能被执行的文件扩展名通常是 .com .exe .bat等等,而在Linux底下,只要你的权限当中具有x的话,例如[ -rwx-r-xr-x ] 即代表这个文件可以被执行。


不过,可以被执行跟可以执行成功是不一样的~举例来说,在root家目录下的install.log 是一个纯文本档,如果经由修改权限成为 -rwxrwxrwx 后,这个文件能够真的执行成功吗? 当然不行~因为他的内容根本就没有可以执行的数据。所以说,这个x代表这个文件具有可执行的能力, 但是能不能执行成功,当然就得要看该文件的内容.


虽然如此,不过我们仍然希望可以藉由扩展名来了解该文件是什么东西,所以,通常我们还是会以适当的扩展名来表示该文件是什么种类的。底下有数种常用的扩展名:


*.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh 


*Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名!


*.html, *.php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件。 .html 的文件可使用网页浏览器来直接开启,至于 .php 的文件, 则可以透过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果。


基本上,Linux系统上的文件名真的只是让你了解该文件可能的用途而已,真正的执行与否仍然需要权限的规范才行。例如虽然有一个文件为可执行文件,如常见的/bin/ls这个显示文件属性的指令,不过,如果这个文件的权限被修改成无法执行时,那么ls就变成不能执行。


上述的这种问题最常发生在文件传送的过程中。例如你在网络上下载一个可执行文件,但是偏偏在你的 Linux系统中就是无法执行!呵呵!那么就是可能文件的属性被改变了。不要怀疑,从网络上传送到你的 Linux系统中,文件的属性与权限确实是会被改变的。


2. Linux文件名长度限制:


在Linux底下,使用预设的Ext2/Ext3文件系统时,针对文件名长度限制为:


单一文件或目录的最大容许文件名为 255 个字符


包含完整路径名称及目录 (/) 之完整档名为 4096 个字符


是相当长的档名!我们希望Linux的文件名可以一看就知道该文件在干嘛的, 所以档名通常是很长很长。


3. Linux文件名的字符的限制:


由于Linux在文字接口下的一些指令操作关系,一般来说,你在设定Linux底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些:


* ? > < ; & ! [ ] | \ ' " ` ( ) { }


因为这些符号在文字接口下,是有特殊意义的。另外,文件名的开头为小数点“.”时, 代表这个文件为隐藏文件!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - 或 + 来命名。




====================Linux 文件属性详解=======================
Linux 文件或目录的属性主要包括:文件或目录的节点、种类、权限模式、链接数量、所归属的用户和用户组、最近访问或修改的时间等内容。具体情况如下:


命令: ls -lih


第一列:inode
第二列:文件种类和权限;
第三列: 硬链接个数;
第四列: 属主;
第五列:所归属的组;
第六列:文件或目录的大小;
第七列和第八列:最后访问或修改时间;
第九列:文件名或目录名


文件类型:文件类型是-,表示这是一个普通文件;


文件权限:文件权限是rw-r--r-- ,表示文件属主可读、可写、不可执行,文件所归属的用户组不可写,可读,不可执行,其它用户不可写,可读,不可执行;


硬链接个数: log2012.log这个文件没有硬链接;因为数值是1,就是他本身;


文件属主:也就是这个文件归哪于哪个用户 ,它归于root,也就是第一个root;


文件属组:也就是说,对于这个文件,它归属于哪个用户组,在这里是root用户组;


文件大小:文件大小是296k个字节;


访问可修改时间 :这里的时间是最后访问的时间,最后访问和文件被修改或创建的时间,有时并不是一致的;


当然文档的属性不仅仅包括这些,这些是我们最常用的一些属性。


关于inode:


inode 译成中文就是索引节点。每个存储设备或存储设备的分区(存储设备是硬盘、软盘、U盘等等)被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。而inode呢,就是用来存储这些数 据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令, 能通过inode值最快的找到相对应的文件。


做个比喻,比如一本书,存储设备或分区就相当于这本书,Block相当于书中的每一页,inode 就相当于这本书前面的目录,一本书有很多的内容,如果想查找某部份的内容,我们可以先查目录,通过目录能最快的找到我们想要看的内容。虽然不太恰当,但还是比较形象。


当我们用ls 查看某个目录或文件时,如果加上-i 参数,就可以看到inode节点了;


log2012.log 的inode值是 2095112 ; 查看一个文件或目录的inode,要通过ls 命令的的 -i参数。




===================用 SecureCRT 来上传和下载文件=================
用SSH管理linux服务器时经常需要远程与本地之间交互文件.而直接用SecureCRT自带的上传下载功能无疑是最方便的,SecureCRT下的文件传输协议有ASCII、Xmodem、Zmodem。


文件传输协议:


文件传输是数据交换的主要形式。在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常见的传输协议有以下几种: 


ASCII:这是最快的传输协议,但只能传送文本文件。 


Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。 


Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快


Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。 


除以上几种外,还有Imodem、Jmodem、Bimodem、Kermit、Lynx等协议,由于没有多数厂商支持,这里就略去不讲。


SecureCRT可以使用linux下的zmodem协议来快速的传送文件,使用非常方便.具体步骤:


一.在使用SecureCRT上传下载之前需要给服务器安装lrzsz:


1、从下面的地址下载 lrzsz-0.12.20.tar.gz


http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gz


2、查看里面的INSTALL文档了解安装参数说明和细节


3、解压文件


tar zxvf lrzsz-0.12.20.tar.gz


4、进入目录


cd lrzsz-0.12.20


5、./configure --prefix=/usr/local/lrzsz


6、make


7、make install


8、建立软链接


#cd /usr/bin
#ln -s /usr/local/lrzsz/bin/lrz rz
#ln -s /usr/local/lrzsz/bin/lsz sz


9、测试


运行 rz 弹出SecureCRT上传窗口,用SecureCRT来上传和下载文件。


二.设置SecureCRT上传和下载的默认目录就行


options->session options ->Terminal->Xmodem/Zmodem 下在右栏directory设置上传和下载的目录


三.使用Zmodem从客户端上传文件到linux服务器


1.在用SecureCRT登陆linux终端.


2.选中你要放置上传文件的路径,在目录下然后输入rz命令,SecureCRT会弹出文件选择对话框,在查找范围中找到你要上传的文件,按Add按钮。然后OK就可以把文件上传到linux上了。


或者在Transfer->Zmodem Upoad list弹出文件选择对话框,选好文件后按Add按钮。然后OK窗口自动关闭。然后在linux下选中存放文件的目录,输入rz命令。liunx就把那个文件上传到这个目录下了。


四.使用Zmodem下载文件到客户端:


sz filename


zmodem接收可以自行启动.下载的文件存放在你设定的默认下载目录下.


rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具windows端需要支持ZModem的telnet/ssh客户端,SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可)O 运行命令rz,即是接收文件,SecureCRT就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到当前目录 O 运行命令sz file1 file2就是发文件到windows上(保存的目录是可以配置) 比ftp命令方便多了,而且服务器不用再开FTP服务了




=================chmod====================
chmod命令用于改变linux系统文件或目录的访问权限。用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。


Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作。


文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合。


有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录。


每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。 例如:


命令: ls -al


我们以log2012.log为例:-rw-r-r-- 1 root root 296k 11-13 06:03 log2012.log


第一列共有10个位置,第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。从第二个字符开始到第十个共9个字符,3个字符一组,分别表示了3组用户对文件或者目录的权限。权限字符用横线代表空许可,r代表只读,w代表写,x代表可执行。


例如:- rw- r-- r--


表示log2012.log是一个普通文件;log2012.log的属主有读写权限;与log2012.log属主同组的用户只有读权限;其他用户也只有读权限。


确定了一个文件的访问权限后,用户可以利用Linux系统提供的chmod命令来重新设定不同的访问权限。也可以利用chown命令来更改某个文件或目录的所有者。利用chgrp命令来更改某个文件或目录的用户组。 


chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。chmod命令详细情况如下。


1. 命令格式:


chmod [-cfvR] [--help] [--version] mode file   


2. 命令功能:


用于改变文件或目录的访问权限,用它控制文件或目录的访问权限。


3. 命令参数:


必要参数:


-c 当发生改变时,报告处理信息
-f 错误信息不输出
-R 处理指定目录以及其子目录下的所有文件
-v 运行时显示详细处理信息


选择参数:


--reference=<目录或者文件> 设置成具有指定目录或者文件具有相同的权限
--version 显示版本信息
<权限范围>+<权限设置> 使权限范围内的目录或者文件具有指定的权限
<权限范围>-<权限设置> 删除权限范围的目录或者文件的指定权限
<权限范围>=<权限设置> 设置权限范围内的目录或者文件的权限为指定的值


权限范围:


u :目录或者文件的当前的用户
g :目录或者文件的当前的群组
o :除了目录或者文件的当前用户或群组之外的用户或者群组
a :所有的用户及群组


权限代号:


r :读权限,用数字4表示
w :写权限,用数字2表示
x :执行权限,用数字1表示
- :删除权限,用数字0表示
s :特殊权限 


该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。


1). 文字设定法:


chmod [who] [+ | - | =] [mode] 文件名


2). 数字设定法


我们必须首先了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。


例如,如果想让某个文件的属主有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。


数字设定法的一般形式为:


chmod [mode] 文件名


数字与字符对应关系如下:


r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。 


4. 使用实例:


实例1:增加文件所有用户组可执行权限


命令:chmod a+x log2012.log


即设定文件log2012.log的属性为:文件属主(u) 增加执行权限;与文件属主同组用户(g) 增加执行权限;其他用户(o) 增加执行权限。


实例2:同时修改不同用户权限


命令:chmod ug+w,o-x log2012.log
(即设定文件text的属性为:文件属主(u) 增加写权限;与文件属主同组用户(g) 增加写权限;其他用户(o) 删除执行权限)


实例3:删除文件权限


命令:chmod a-x log2012.log (删除所有用户的可执行权限 )


实例4:使用“=”设置权限 


命令:chmod u=x log2012.log (撤销原来所有的权限,然后使拥有者具有可读权限 )


实例5:对一个目录及其子目录所有文件添加权限 


命令:chmod -R u+x test4 (递归地给test4目录下所有文件和子目录的属主分配权限 )


1). 命令:chmod 751 file   
给file的属主分配读、写、执行(7)的权限,给file的所在组分配读、执行(5)的权限,给其他用户分配执行(1)的权限


2). 命令:chmod u=rwx,g=rx,o=x file 


3). 命令chmod =r file 


4). 命令:chmod 444 file 


5). 命令:chmod a-wx,a+r   file




==============tar===============
通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就是是必不可少的一个功能强大的工具。linux中最流行的tar是麻雀虽小,五脏俱全,功能强大。


tar命令可以为linux的文件和目录创建档案。利用tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。


tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。


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


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


linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩。


1.命令格式:


tar[必要参数][选择参数][文件] 


2.命令功能:


用来压缩和解压文件。tar本身不具有压缩功能。他是调用压缩功能实现的 


3.命令参数:


必要参数有如下:


-A 新增压缩文件到已存在的压缩
-B 设置区块大小
-c 建立新的压缩文件
-d 记录文件的差别
-r 添加文件到已经压缩的文件
-u 添加改变了和现有的文件到已经存在的压缩文件
-x 从压缩的文件中提取文件
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-Z 支持compress解压文件
-v 显示操作过程
-l 文件系统边界设置
-k 保留原有文件不覆盖
-m 保留文件不被覆盖
-W 确认压缩文件的正确性


可选参数如下:


-b 设置区块数目
-C 切换到指定目录
-f 指定压缩文件
--help 显示帮助信息
--version 显示版本信息


4.常见解压/压缩命令


tar 


解包:tar xvf FileName.tar
打包:tar cvf FileName.tar DirName
(注:tar是打包,不是压缩!)


.gz


解压1:gunzip FileName.gz
解压2:gzip -d FileName.gz
压缩:gzip FileName


.tar.gz 和 .tgz


解压:tar zxvf FileName.tar.gz
压缩:tar zcvf FileName.tar.gz DirName


.bz2


解压1:bzip2 -d FileName.bz2
解压2:bunzip2 FileName.bz2
压缩: bzip2 -z FileName


.tar.bz2


解压:tar jxvf FileName.tar.bz2
压缩:tar jcvf FileName.tar.bz2 DirName


.bz


解压1:bzip2 -d FileName.bz
解压2:bunzip2 FileName.bz
压缩:未知


.tar.bz


解压:tar jxvf FileName.tar.bz
压缩:未知


.Z


解压:uncompress FileName.Z
压缩:compress FileName


.tar.Z


解压:tar Zxvf FileName.tar.Z
压缩:tar Zcvf FileName.tar.Z DirName


.zip


解压:unzip FileName.zip
压缩:zip FileName.zip DirName


.rar


解压:rar x FileName.rar
压缩:rar a FileName.rar DirName 
 
5.使用实例


实例1:将文件全部打包成tar包


命令:


tar -cvf log.tar log2012.log
tar -zcvf log.tar.gz log2012.log
tar -jcvf log.tar.bz2 log2012.log


tar -cvf log.tar log2012.log    仅打包,不压缩! 
tar -zcvf log.tar.gz log2012.log   打包后,以 gzip 压缩 
tar -zcvf log.tar.bz2 log2012.log  打包后,以 bzip2 压缩 


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


实例2:查阅上述 tar包内有哪些文件


命令:tar -ztvf log.tar.gz


由于我们使用 gzip 压缩的log.tar.gz,所以要查阅log.tar.gz包内的文件时,就得要加上 z 这个参数了。


实例3:将tar 包解压缩


命令:tar -zxvf /opt/soft/test/log.tar.gz


在预设的情况下,我们可以将压缩档在任何地方解开的


实例4:只将 /tar 内的 部分文件解压出来


命令:tar -zxvf /opt/soft/test/log30.tar.gz log2013.log


我可以透过 tar -ztvf 来查阅 tar 包内的文件名称,如果单只要一个文件,就可以透过这个方式来解压部分文件!


实例5:文件备份下来,并且保存其权限


命令:tar -zcvpf log31.tar.gz log2014.log log2015.log log2016.log 


这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时


实例6:在 文件夹当中,比某个日期新的文件才备份


命令:tar -N "2012/11/13" -zcvf log17.tar.gz test


实例7:备份文件夹内容是排除部分文件


命令:tar --exclude scf/service -zcvf scf.tar.gz scf/*


==============chgrp===============
在lunix系统里,文件或目录的权限的掌控以拥有者及所诉群组来管理。可以使用chgrp指令取变更文件与目录所属群组,这种方式采用群组名称或群组识别码都可以。Chgrp命令就是change group的缩写!要被改变的组名必须要在/etc/group文件内存在才行。


1.命令格式:


chgrp [选项] [组] [文件]


2.命令功能:


chgrp命令可采用群组名称或群组识别码的方式改变文件或目录的所属群组。使用权限是超级用户。 


3.命令参数:


必要参数:


-c 当发生改变时输出调试信息
-f 不显示错误信息
-R 处理指定目录以及其子目录下的所有文件
-v 运行时显示详细的处理信息
--dereference 作用于符号链接的指向,而不是符号链接本身
--no-dereference 作用于符号链接本身


选择参数:


--reference=<文件或者目录>
--help 显示帮助信息
--version 显示版本信息


4.使用实例:


实例1:改变文件的群组属性 


命令:chgrp -v bin log2012.log


将log2012.log文件由root群组改为bin群组


实例2:根据指定文件改变文件的群组属性 


命令:chgrp --reference=log2012.log log2013.log


改变文件log2013.log 的群组属性,使得文件log2013.log的群组属性和参考文件log2012.log的群组属性相同


实例3:改变指定目录以及其子目录下的所有文件的群组属性 


改变指定目录以及其子目录下的所有文件的群组属性


实例4:通过群组识别码改变文件群组属性


命令:chgrp -R 100 test6


通过群组识别码改变文件群组属性,100为users群组的识别码,具体群组和群组识别码可以去/etc/group文件中查看




================chown=========================
chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID;组可以是组名或者组ID;文件是以空格分开的要改变权限的文件列表,支持通配符。系统管理员经常使用chown命令,在将文件拷贝到另一个用户的名录下之后,让用户拥有使用该文件的权限。 


1.命令格式:
    
chown [选项]... [所有者][:[组]] 文件...
  
2.命令功能:
    
通过chown改变文件的拥有者和群组。在更改文件的所有者或所属群组时,可以使用用户名称和用户识别码设置。普通用户不能将自己的文件改变成其他的拥有者。其操作权限一般为管理员。
  
3.命令参数:
  
必要参数:
    
-c 显示更改的部分的信息  
-f 忽略错误信息
-h 修复符号链接    
-R 处理指定目录以及其子目录下的所有文件    
-v 显示详细的处理信息    
-deference 作用于符号链接的指向,而不是链接文件本身
  
选择参数:




--reference=<目录或文件> 把指定的目录/文件作为参考,把操作的文件/目录设置成参考文件/目录相同拥有者和群组
--from=<当前用户:当前群组> 只有当前用户和群组跟指定的用户和群组相同时才进行改变
--help 显示帮助信息
--version 显示版本信息
  
4.使用实例:
  
实例1:改变拥有者和群组
  
命令:chown mail:mail log2012.log


实例2:改变文件拥有者和群组
  
命令:chown root: log2012.log


实例3:改变文件群组


命令:chown :mail log2012.log


实例4:改变指定目录以及其子目录下的所有文件的拥有者和群组 
  
命令:chown -R -v root:mail test6




================= /etc/group文件详解=================
Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件。linux /etc/group文件是有关于系统管理员对用户和用户组管理的文件,linux用户组的所有信息都存放在/etc/group文件中。具有某种共同特征的用户集合起来就是用户组(Group)。用户组(Group)配置文件主要有 /etc/group和/etc/gshadow,其中/etc/gshadow是/etc/group的加密信息文件。
    
将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段。每个用户都属于某个用户组;一个组中可以有多个用户,一个用户也可以属于不 同的组。当一个用户同时是多个组中的成员时,在/etc/passwd文件中记录的是用户所属的主组,也就是登录时所属的默认组,而其他组称为附加组。
    
用户组的所有信息都存放在/etc/group文件中。此文件的格式是由冒号(:)隔开若干个字段,这些字段具体如下:
    
组名:口令:组标识号:组内用户列表
    
具体解释:
    
组名:
    
组名是用户组的名称,由字母或数字构成。与/etc/passwd中的登录名一样,组名不应重复。
    
口令:
    
口令字段存放的是用户组加密后的口令字。一般Linux系统的用户组都没有口令,即这个字段一般为空,或者是*。
    
组标识号:
    
组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组。别称GID.
    
组内用户列表:
    
是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。


我们以root:x:0:root,linuxsir 为例: 用户组root,x是密码段,表示没有设置密码,GID是0,root用户组下包括root、linuxsir以及GID为0的其它用户。




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


1.命令格式:


gzip[参数][文件或者目录]


2.命令功能:


gzip是个使用广泛的压缩程序,文件经它压缩过后,其名称后面会多出".gz"的扩展名。


3.命令参数:


-a或--ascii  使用ASCII文字模式。 
-c或--stdout或--to-stdout  把压缩后的文件输出到标准输出设备,不去更动原始文件。 
-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  显示版本信息。 
-num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。 


4.使用实例:


实例1:把test6目录下的每个文件压缩成.gz文件


命令:gzip *


实例2:把例1中每个压缩的文件解压,并列出详细的信息


命令:gzip -dv *


实例3:详细显示例1中每个压缩的文件的信息,并不解压


命令:gzip -l *


实例4:压缩一个tar备份文件,此时压缩文件的扩展名为.tar.gz


命令:gzip -r log.tar


实例5:递归的压缩目录


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


实例6:递归地解压目录


命令:gzip -dr test6




===================df==================
linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。


1.命令格式:


df [选项] [文件]


2.命令功能:


显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以 1KB 为单位进行显示,除非环境变量 POSIXLY_CORRECT 被指定,那样将以512字节为单位进行显示


3.命令参数:


必要参数:


-a 全部文件系统列表
-h 方便阅读方式显示
-H 等于“-h”,但是计算式,1K=1000,而不是1K=1024
-i 显示inode信息
-k 区块为1024字节
-l 只显示本地文件系统
-m 区块为1048576字节
--no-sync 忽略 sync 命令
-P 输出格式为POSIX
--sync 在取得磁盘信息前,先执行sync命令
-T 文件系统类型


选择参数:


--block-size=<区块大小> 指定区块大小
-t<文件系统类型> 只显示选定文件系统的磁盘信息
-x<文件系统类型> 不显示选定文件系统的磁盘信息
--help 显示帮助信息
--version 显示版本信息


4.使用实例:


实例1:显示磁盘使用情况


命令:df
linux中df命令的输出清单的第1列是代表文件系统对应的设备文件的路径名(一般是硬盘上的分区);第2列给出分区包含的数据块(1024字节)的数目;第3,4列分别表示已用的和可用的数据块数目。用户也许会感到奇怪的是,第3,4列块数之和不等于第2列中的块数。这是因为缺省的每个分区都留了少量空间供系统管理员使用。即使遇到普通用户空间已满的情况,管理员仍能登录和留有解决问题所需的工作空间。清单中Use% 列表示普通用户空间使用的百分比,即使这一数字达到100%,分区仍然留有系统管理员使用的空间。最后,Mounted on列表示文件系统的挂载点。


实例2:以inode模式来显示磁盘使用情况


命令:df -i


实例3:显示指定类型磁盘


命令:df -t ext3


实例4:列出各文件系统的i节点使用情况


命令:df -ia


实例5:列出文件系统的类型


命令:df -T


实例6:以更易读的方式显示目前磁盘空间和使用情况 
命令: df -h df -Hdf -lh df -k


-h更具目前磁盘空间和使用情况 以更易读的方式显示


-H根上面的-h参数相同,不过在根式化的时候,采用1000而不是1024进行容量转换


-k以单位显示磁盘的使用情况


-l显示本地的分区的磁盘空间使用率,如果服务器nfs了远程服务器的磁盘,那么在df上加上-l后系统显示的是过滤nsf驱动器后的结果


-i显示inode的使用情况。linux采用了类似指针的方式管理磁盘空间影射.这也是一个比较关键应用




===============du===============
Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的.


1.命令格式:


du [选项][文件]


2.命令功能:


显示每个文件和目录的磁盘使用空间。


3.命令参数:


-a或-all  显示目录中个别文件的大小。   
-b或-bytes  显示目录或文件大小时,以byte为单位。   
-c或--total  除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。 
-k或--kilobytes  以KB(1024bytes)为单位输出。
-m或--megabytes  以MB为单位输出。   
-s或--summarize  仅显示总计,只列出最后加总的值。
-h或--human-readable  以K,M,G为单位,提高信息的可读性。
-x或--one-file-xystem  以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。 
-L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。   
-S或--separate-dirs   显示个别目录的大小时,并不含其子目录的大小。 
-X<文件>或--exclude-from=<文件>  在<文件>指定目录或文件。   
--exclude=<目录或文件>         略过指定的目录或文件。    
-D或--dereference-args   显示指定符号链接的源文件大小。   
-H或--si  与-h参数相同,但是K,M,G是以1000为换算单位。   
-l或--count-links   重复计算硬件链接的文件。  


4.使用实例:


实例1:显示目录或者文件所占空间 


命令:du


只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的1288为当前目录的总大小


实例2:显示指定文件所占空间


命令:du log2012.log


实例3:查看指定目录的所占空间


命令:du scf


实例4:显示多个文件所占空间


命令:du log30.tar.gz log31.tar.gz


实例5:只显示总和的大小


命令:du -s


实例6:方便阅读的格式显示


命令:du -h test


实例7:文件和目录都显示
命令: du -ah test


实例8:显示几个文件或目录各自占用磁盘空间的大小,还统计它们的总和


命令:du -c log30.tar.gz log31.tar.gz


加上-c选项后,du不仅显示两个目录各自占用磁盘空间的大小,还在最后一行统计它们的总和。


实例9:按照空间大小排序


命令:du|sort -nr|more


实例10:输出当前目录下各个子目录所使用的空间


命令:du -h  --max-depth=1






===================ln======================
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。


1.命令格式:


 ln [参数][源文件或目录][目标文件或目录]


2.命令功能:


Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。


软链接:


1.软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
2.软链接可以 跨文件系统 ,硬链接不可以
3.软链接可以对一个不存在的文件名进行链接
4.软链接可以对目录进行链接


硬链接:


1.硬链接,以文件副本的形式存在。但不占用实际空间。
2.不允许给目录创建硬链接
3.硬链接只有在同一个文件系统中才能创建


这里有两点要注意:


第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;


第二,ln的链接又分软链接和硬链接两种,软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。


ln指令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录中。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。


3.命令参数:


必要参数:


-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程


选择参数:


-S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>”
-V “-V<备份方式>”或“--version-control=<备份方式>”
--help 显示帮助信息
--version 显示版本信息


4.使用实例:


实例1:给文件创建软链接


命令:ln -s log2013.log link2013


为log2013.log文件创建软链接link2013,如果log2013.log丢失,link2013将失效


实例2:给文件创建硬链接


命令:ln log2013.log ln2013


为log2013.log创建硬链接ln2013,log2013.log与ln2013的各项属性相同


实例3:接上面两实例,链接完毕后,删除和重建链接原文件


1.源文件被删除后,并没有影响硬链接文件;软链接文件在centos系统下不断的闪烁,提示源文件已经不存在


2.重建源文件后,软链接不在闪烁提示,说明已经链接成功,找到了链接文件系统;重建后,硬链接文件并没有受到源文件影响,硬链接文件的内容还是保留了删除前源文件的内容,说明硬链接已经失效


实例4:将文件链接为另一个目录中的相同名字


命令:ln log2013.log test3


在test3目录中创建了log2013.log的硬链接,修改test3目录中的log2013.log文件,同时也会同步到源文件


实例5:给目录创建软链接


命令:ln -sv /opt/soft/test/test3 /opt/soft/test/test5


1.目录只能创建软链接


2.目录创建链接必须用绝对路径,相对路径创建会不成功,会提示:符号连接的层数过多 这样的错误


3.在链接目标目录中修改文件都会在源文件目录中同步变化




=====================diff===========================
diff 命令是 linux上非常重要的工具,用于比较文件的内容,特别是比较两个版本不同的文件以找到改动的地方。diff在命令行中打印每一个行的改动。最新版本的diff还支持二进制文件。diff程序的输出被称为补丁 (patch),因为Linux系统中还有一个patch程序,可以根据diff的输出将a.c的文件内容更新为b.c。diff是svn、cvs、git等版本控制工具不可或缺的一部分。


1.命令格式:


diff[参数][文件1或目录1][文件2或目录2]


2.命令功能:


diff命令能比较单个文件或者目录内容。如果指定比较的是文件,则只有当输入为文本文件时才有效。以逐行的方式,比较文本文件的异同处。如果指定比较的是目录的的时候,diff 命令会比较两个目录下名字相同的文本文件。列出不同的二进制文件、公共子目录和只在一个目录出现的文件。


3.命令参数:


-  指定要显示多少行的文本。此参数必须与-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参数时,仅显示不同之处。


4.使用实例:


实例1:比较两个文件


命令:
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。


diff 的normal 显示格式有三种提示:


a - add
c - change
d - delete 


实例2:并排格式输出


命令:
diff log2013.log log2014.log  -y -W 50


“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容


实例3:上下文输出格式


命令:diff log2013.log log2014.log  -c


这种方式在开头两行作了比较文件的说明,这里有三中特殊字符:


“+” 比较的文件的后者比前着多一行
“-” 比较的文件的后者比前着少一行
“!” 比较的文件两者有差别的行


实例4:统一格式输出


命令:diff log2014.log log2013.log  -u


它的第一部分,也是文件的基本信息:


--- log2014.log 2012-12-07 18:01:54.000000000 +0800
+++ log2013.log 2012-12-07 16:36:26.000000000 +0800


"---"表示变动前的文件,"+++"表示变动后的文件。


第二部分,变动的位置用两个@作为起首和结束。


   @@ -1,12 +1,10 @@


前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。合在一起,就表示下面是第一个文件从第1行开始的连续12行。同样的,"+1,10"表示变动后,成为第二个文件从第1行开始的连续10行。


实例5:比较文件夹不同


命令:diff  test3 test6


实例6:比较两个文件不同,并生产补丁


命令:diff -ruN log2013.log log2014.log >patch.log




==================date==========================
在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便。


1.命令格式:


date [参数]... [+格式]


2.命令功能:


date 可以用来显示或设定系统的日期与时间。


3.命令参数:


必要参数:


%H 小时(以00-23来表示)。 
%I 小时(以01-12来表示)。 
%K 小时(以0-23来表示)。 
%l 小时(以0-12来表示)。 
%M 分钟(以00-59来表示)。 
%P AM或PM。 
%r 时间(含时分秒,小时以12小时AM/PM来表示)。 
%s 总秒数。起算时间为1970-01-01 00:00:00 UTC。 
%S 秒(以本地的惯用法来表示)。 
%T 时间(含时分秒,小时以24小时制来表示)。 
%X 时间(以本地的惯用法来表示)。 
%Z 市区。 
%a 星期的缩写。 
%A 星期的完整名称。 
%b 月份英文名的缩写。 
%B 月份的完整英文名称。 
%c 日期与时间。只输入date指令也会显示同样的结果。 
%d 日期(以01-31来表示)。 
%D 日期(含年月日)。 
%j 该年中的第几天。 
%m 月份(以01-12来表示)。 
%U 该年中的周数。 
%w 该周的天数,0代表周日,1代表周一,异词类推。 
%x 日期(以本地的惯用法来表示)。 
%y 年份(以00-99来表示)。 
%Y 年份(以四位数来表示)。 
%n 在显示时,插入新的一行。 
%t 在显示时,插入tab。 
MM 月份(必要) 
DD 日期(必要) 
hh 小时(必要) 
mm 分钟(必要)
ss 秒(选择性) 


选择参数:


-d<字符串>  显示字符串所指的日期与时间。字符串前后必须加上双引号。 
-s<字符串>  根据字符串来设置日期与时间。字符串前后必须加上双引号。 
-u  显示GMT。 
--help  在线帮助。 
--version  显示版本信息 


4.使用说明:


1.在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中可用的标记列表如下: % :  打印出 %:


%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区 %a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)


2.在设定时间方面:


date -s //设置当前时间,只有root权限才能设置,其他只能查看。
date -s 20080523 //设置成20080523,这样会把具体时间设置成空00:00:00
date -s 01:01:01 //设置具体时间,不会对日期做更改
date -s “01:01:01 2008-05-23″ //这样可以设置全部时间
date -s “01:01:01 20080523″ //这样可以设置全部时间
date -s “2008-05-23 01:01:01″ //这样可以设置全部时间
date -s “20080523 01:01:01″ //这样可以设置全部时间


3.加减:


date +%Y%m%d         //显示前天年月日
date +%Y%m%d --date="+1 day"  //显示前一天的日期
date +%Y%m%d --date="-1 day"  //显示后一天的日期
date +%Y%m%d --date="-1 month"  //显示上一月的日期
date +%Y%m%d --date="+1 month"  //显示下一月的日期
date +%Y%m%d --date="-1 year"  //显示前一年的日期
date +%Y%m%d --date="+1 year"  //显示下一年的日期


5.使用实例:


实例1:显示当前时间


命令:
date
date '+%c'
date '+%D'
date '+%x'
date '+%T'
date '+%X'


实例2:显示日期和设定时间


命令:date --date 08:42:00


date 命令的另一个扩展是 -d 选项,该选项非常有用。使用这个功能强大的选项,通过将日期作为引号括起来的参数提供,您可以快速地查明一个特定的日期。-d 选项还可以告诉您,相对于当前日期若干天的究竟是哪一天,从现在开始的若干天或若干星期以后,或者以前(过去)。通过将这个相对偏移使用引号括起来,作为 -d 选项的参数,就可以完成这项任务。


具体说明如下:


date -d "nov 22"  今年的 11 月 22 日是星期三
date -d '2 weeks' 2周后的日期
date -d 'next monday' (下周一的日期)
date -d next-day +%Y%m%d(明天的日期)或者:date -d tomorrow +%Y%m%d
date -d last-day +%Y%m%d(昨天的日期) 或者:date -d yesterday +%Y%m%d
date -d last-month +%Y%m(上个月是几月)
date -d next-month +%Y%m(下个月是几月)
使用 ago 指令,您可以得到过去的日期:
date -d '30 days ago' (30天前的日期)
使用负数以得到相反的日期:
date -d 'dec 14 -2 weeks' (相对:dec 14这个日期的两周前的日期)
date -d '-100 days' (100天以前的日期)
date -d '50 days'(50天后的日期)


实例4:显示月份和日数


命令:date  '+%B %d'


实例5:显示时间后跳行,再显示目前日期 


命令:date '+%T%n%D'




===================cal=====================
cal命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。“阳历”又名“太阳历”,系以地球绕行太阳一周为一年,为西方各国所通用,故又名“西历”。


1.命令格式:


cal [参数][月份][年份]


2.命令功能:


用于查看日历等时间信息,如只有一个参数,则表示年份(1-9999),如有两个参数,则表示月份和年份


3.命令参数:


-1 显示一个月的月历
-3 显示系统前一个月,当前月,下一个月的月历
-s  显示星期天为一个星期的第一天,默认的格式
-m 显示星期一为一个星期的第一天
-j  显示在当年中的第几天(一年日期按天算,从1月1号算起,默认显示当前月在一年中的天数)
-y  显示当前年份的日历


4.使用实例:


实例1:显示当前月份日历


命令:
cal


实例2:显示指定月份的日历


命令:cal 9 2012


实例3:显示2013年日历


命令:cal -y 2013 cal 2013


实例4:显示自1月1日的天数


命令:cal -j


实例5:星期一显示在第一列


命令:cal -m




===============grep==================
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。


grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。


grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。


1.命令格式:


grep [option] pattern file


2.命令功能:


用于过滤/搜索的特定字符。可使用正则表达式能多种命令配合使用,使用上十分灵活。


3.命令参数:


-a   --text   #不要忽略二进制的数据。   
-A<显示行数>   --after-context=<显示行数>   #除了显示符合范本样式的那一列之外,并显示该行之后的内容。   
-b   --byte-offset   #在显示符合样式的那一行之前,标示出该行第一个字符的编号。   
-B<显示行数>   --before-context=<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前的内容。   
-c    --count   #计算符合样式的列数。   
-C<显示行数>    --context=<显示行数>或-<显示行数>   #除了显示符合样式的那一行之外,并显示该行之前后的内容。   
-d <动作>      --directories=<动作>   #当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。   
-e<范本样式>  --regexp=<范本样式>   #指定字符串做为查找文件内容的样式。   
-E      --extended-regexp   #将样式为延伸的普通表示法来使用。   
-f<规则文件>  --file=<规则文件>   #指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。   
-F   --fixed-regexp   #将样式视为固定字符串的列表。   
-G   --basic-regexp   #将样式视为普通的表示法来使用。   
-h   --no-filename   #在显示符合样式的那一行之前,不标示该行所属的文件名称。   
-H   --with-filename   #在显示符合样式的那一行之前,表示该行所属的文件名称。   
-i    --ignore-case   #忽略字符大小写的差别。   
-l    --file-with-matches   #列出文件内容符合指定的样式的文件名称。   
-L   --files-without-match   #列出文件内容不符合指定的样式的文件名称。   
-n   --line-number   #在显示符合样式的那一行之前,标示出该行的列数编号。   
-q   --quiet或--silent   #不显示任何信息。   
-r   --recursive   #此参数的效果和指定“-d recurse”参数相同。   
-s   --no-messages   #不显示错误信息。   
-v   --revert-match   #显示不包含匹配文本的所有行。   
-V   --version   #显示版本信息。   
-w   --word-regexp   #只显示全字符合的列。   
-x    --line-regexp   #只显示全列符合的列。   
-y   #此参数的效果和指定“-i”参数相同。
  
4.规则表达式:


grep的规则表达式:


^  #锚定行的开始 如:'^grep'匹配所有以grep开头的行。    
$  #锚定行的结束 如:'grep$'匹配所有以grep结尾的行。    
.  #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。    
*  #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。    
.*   #一起用代表任意字符。   
[]   #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。    
[^]  #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。    
\(..\)  #标记匹配字符,如'\(love\)',love被标记为1。    
\<      #锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。    
\>      #锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  #重复字符x,m次,如:'0\{5\}'匹配包含5个o的行。    
x\{m,\}  #重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。    
x\{m,n\}  #重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。   
\w    #匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。   
\W    #\w的反置形式,匹配一个或多个非单词字符,如点号句号等。   
\b    #单词锁定符,如: '\bgrep\b'只匹配grep。  


POSIX字符:


为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。


[:alnum:]    #文字数字字符   
[:alpha:]    #文字字符   
[:digit:]    #数字字符   
[:graph:]    #非空字符(非空格、控制字符)   
[:lower:]    #小写字符   
[:cntrl:]    #控制字符   
[:print:]    #非空字符(包括空格)   
[:punct:]    #标点符号   
[:space:]    #所有空白字符(新行,空格,制表符)   
[:upper:]    #大写字符   
[:xdigit:]   #十六进制数字(0-9,a-f,A-F)  


5.使用实例:


实例1:查找指定进程


命令:ps -ef|grep svn


第一条记录是查找出的进程;第二条结果是grep进程本身,并非真正要找的进程。


实例2:查找指定进程个数


命令:ps -ef|grep svn -c ps -ef|grep -c svn


实例3:从文件中读取关键词进行搜索


命令:cat test.txt | grep -f test2.txt
输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行


实例3:从文件中读取关键词进行搜索 且显示行号


命令:cat test.txt | grep -nf test2.txt
输出test.txt文件中含有从test2.txt文件中读取出的关键词的内容行,并显示每一行的行号


实例5:从文件中查找关键词


命令:grep 'linux' test.txt


实例6:从多个文件中查找关键词


命令:grep 'linux' test.txt test2.txt
多文件时,输出查询到的信息内容行时,会把文件的命名在行最前面输出并且加上":"作为标示符


实例7:grep不显示本身进程


命令:
ps aux|grep \[s]sh
ps aux | grep ssh | grep -v "grep"


实例8:找出已u开头的行内容


命令:cat test.txt |grep ^u


实例9:输出非u开头的行内容


命令:cat test.txt |grep ^[^u]


实例10:输出以hat结尾的行内容


命令:cat test.txt |grep hat$


实例12:显示包含ed或者at字符的内容行


命令:cat test.txt |grep -E "ed|at"


实例13:显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行


命令:grep '[a-z]\{7\}' *.txt






===================wc=================
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。


1.命令格式:


wc [选项]文件...


2.命令功能:


统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。


3.命令参数:


-c 统计字节数。
-l 统计行数。
-m 统计字符数。这个标志不能与 -c 标志一起使用。
-w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
-L 打印最长行的长度。
-help 显示帮助信息
--version 显示版本信息


4.使用实例:


实例1:查看文件的字节数、字数、行数


命令:wc test.txt


7     8     70     test.txt
行数 单词数 字节数 文件名


实例2:用wc命令怎么做到只打印统计数字不打印文件名
wc -l test.txt
cat test.txt |wc -l


使用管道线,这在编写shell脚本时特别有用。


实例3:用来统计当前目录下的文件数


命令:ls -l | wc -l




==============ps命令==============
Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。


要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。


ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。


kill 命令用于杀死进程。


linux上进程有5种状态: 


1. 运行(正在运行或在运行队列中等待) 
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生) 
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放) 
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行) 


ps工具标识进程的5种状态码: 


D 不可中断 uninterruptible sleep (usually IO) 
R 运行 runnable (on run queue) 
S 中断 sleeping 
T 停止 traced or stopped 
Z 僵死 a defunct (”zombie”) process 


1.命令格式:


ps[参数]


2.命令功能:


用来显示当前进程的状态


3.命令参数:


a  显示所有进程
-a 显示同一终端下的所有程序
-A 显示所有进程
c  显示进程的真实名称
-N 反向选择
-e 等于“-A”
e  显示环境变量
f  显示程序间的关系
-H 显示树状结构
r  显示当前终端的进程
T  显示当前终端的所有程序
u  指定用户的所有进程
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程 
-C<命令> 列出指定命令的状况
--lines<行数> 每页显示的行数
--width<字符数> 每页显示的字符数
--help 显示帮助信息
--version 显示版本显示


4.使用实例:


实例1:显示所有进程信息


命令:ps -A


实例2:显示指定用户信息


命令:ps -u root


实例3:显示所有进程信息,连同命令行


命令:ps -ef


实例4: ps 与grep 常用组合用法,查找特定进程


命令:ps -ef|grep ssh


实例5:将目前属于您自己这次登入的 PID 与相关信息列示出来


命令:ps -l


各相关信息的意义:


F 代表这个程序的旗标 (flag), 4 代表使用者为 super user
S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍
UID 程序被该 UID 所拥有
PID 就是这个程序的 ID !
PPID 则是其上级父程序的ID
C CPU 使用的资源百分比
PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍
NI 这个是 Nice 值,在下一小节我们会持续介绍
ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 "-"
SZ 使用掉的内存大小
WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作
TTY 登入者的终端机位置
TIME 使用掉的 CPU 时间。
CMD 所下达的指令为何


在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。


实例6:列出目前所有的正在内存当中的程序


命令:ps aux


USER:该 process 属于那个使用者账号的
PID :该 process 的号码
%CPU:该 process 使用掉的 CPU 资源百分比
%MEM:该 process 所占用的物理内存百分比
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :该 process 占用的固定的内存量 (Kbytes)
TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT:该程序目前的状态,主要的状态有
R :该程序目前正在运作,或者是可被运作
S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。
T :该程序目前正在侦测或者是停止了
Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
START:该 process 被触发启动的时间
TIME :该 process 实际使用 CPU 运作的时间
COMMAND:该程序的实际指令


实例7:列出类似程序树的程序显示


命令:ps -axjf


实例8:找出与 cron 与 syslog 这两个服务有关的 PID 号码


命令:ps aux | egrep '(cron|syslog)'


1. 可以用 | 管道和 more 连接起来分页查看


命令:ps -aux |more


2. 把所有进程显示出来,并输出到ps001.txt文件


命令:ps -aux > ps001.txt


3. 输出指定的字段


命令:ps -o pid,ppid,pgrp,session,tpgid,comm




=================kill==================
Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令。通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用ps/pidof/pstree/top等工具获取进程PID,然后使用kill命令来杀掉该进程。kill命令是通过向进程发送指定的信号来结束相应进程的。在默认情况下,采用编号为15的TERM信号。TERM信号将终止所有不能捕获该信号的进程。对于那些可以捕获该信号的进程就要用编号为9的kill信号,强行“杀掉”该进程。 


1.命令格式:


kill[参数][进程号]


2.命令功能:


发送指定的信号到相应进程。不指定型号将发送SIGTERM(15)终止指定进
程。如果任无法终止该程序可用“-KILL” 参数,其发送的信号为SIGKILL(9) ,将强制结束进程,使用ps命令或者jobs 命令可以查看进程号。root用户将影响用户的进程,非root用户只能影响自己的进程。


3.命令参数:


-l  信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称
-a  当处理当前进程时,不限制命令名和进程号的对应关系
-p  指定kill 命令只打印相关进程的进程号,而不发送任何信号
-s  指定发送信号
-u  指定用户 


注意:


1、kill命令可以带信号号码选项,也可以不带。如果没有信号号码,kill命令就会发出终止信号(15),这个信号可以被进程捕获,使得进程在退出之前可以清理并释放资源。也可以用kill向进程发送特定的信号。例如:


kill -2 123


它的效果等同于在前台运行PID为123的进程时按下Ctrl+C键。但是,普通用户只能使用不带signal参数的kill命令或最多使用-9信号。


2、kill可以带有进程ID号作为参数。当用kill向这些进程发送信号时,必须是这些进程的主人。如果试图撤销一个没有权限撤销的进程或撤销一个不存在的进程,就会得到一个错误信息。


3、可以向多个进程发信号或终止它们。


4、当kill成功地发送了信号后,shell会在屏幕上显示出进程的终止信息。有时这个信息不会马上显示,只有当按下Enter键使shell的命令提示符再次出现时,才会显示出来。


5、应注意,信号使进程强行终止,这常会带来一些副作用,如数据丢失或者终端无法恢复到正常状态。发送信号时必须小心,只有在万不得已时,才用kill信号(9),因为进程不能首先捕获它。要撤销所有的后台作业,可以输入kill 0。因为有些在后台运行的命令会启动多个进程,跟踪并找到所有要杀掉的进程的PID是件很麻烦的事。这时,使用kill 0来终止所有由当前shell启动的进程,是个有效的方法。


4.使用实例:


实例1:列出所有信号名称


命令:kill -l


只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:


HUP    1    终端断线
INT     2    中断(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
TERM   15    终止
KILL    9    强制终止
CONT   18    继续(与STOP相反, fg/bg命令)
STOP    19    暂停(同 Ctrl + Z)


实例2:得到指定信号的数值




实例3:先用ps查找进程,然后用kill杀掉


命令:kill 3268


实例4:彻底杀死进程


命令:kill –9 3268 


实例5:杀死指定用户所有进程


命令:
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux


方法一,过滤出hnlinux用户进程并杀死


实例6:init进程是不可杀的


命令:kill -9 1


init是Linux系统操作中不可缺少的程序之一。所谓的init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。 其它所有进程都是init进程的子孙。init进程是不可杀的!




================killall====================
Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name)。我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。


1.命令格式:


killall[参数][进程名]


2.命令功能:


用来结束同名的的所有进程


3.命令参数:


-Z 只杀死拥有scontext 的进程
-e 要求匹配进程名称
-I 忽略小写
-g 杀死进程组而不是进程
-i 交互模式,杀死进程前先询问用户
-l 列出所有的已知信号名称
-q 不输出警告信息
-s 发送指定的信号
-v 报告信号是否成功发送
-w 等待进程死亡
--help 显示帮助信息
--version 显示版本显示


4.使用实例:


实例1:杀死所有同名进程


命令:killall vi


实例2:向进程发送指定信号


命令:
后台运行程序:vi &
杀死 vi进程:killall -TERM vi  或者  killall -KILL vi


实例3:把所有的登录后的shell给杀掉


命令:killall -9 bash
运行命令:killall -9 bash 后,所有bash都会被卡掉了,所以当前所有连接丢失了。需要重新连接并登录。




================top====================
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。


下面详细介绍它的使用方法。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.


1.命令格式:


top [参数]


2.命令功能:


显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等


3.命令参数:


-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数


4.使用实例:


实例2:显示 完整命令


命令:top -c


实例3:以批处理模式显示程序信息


命令:top -b


实例4:以累积模式显示程序信息


命令:top -S


实例5:设置信息更新次数


命令: top -n 2
表示更新两次后终止更新显示


实例6:设置信息更新时间


命令:top -d 3
表示更新周期为3秒




实例7:显示指定的进程信息


命令:top -p 574


5.top交互命令


在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。


h 显示帮助画面,给出一些简短的命令总结说明
k 终止一个进程。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序
r 重新安排一个进程的优先级别
S 切换到累计模式
s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成m s。输入0值则系统将不断刷新,默认值是5 s
f或者F 从当前显示中添加或者删除项目
o或者O 改变显示项目的顺序
l 切换显示平均负载和启动时间信息
m 切换显示内存信息
t 切换显示进程和CPU状态信息
c 切换显示命令名称和完整命令行
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
W 将当前设置写入~/.toprc文件中 








=================free=====================
free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。在Linux系统监控的工具中,free命令是最经常使用的命令之一。


1.命令格式:


free [参数]


2.命令功能:


free 命令显示系统使用和空闲的内存情况,包括物理内存、交互区内存(swap)和内核缓冲区内存。共享内存将被忽略


3.命令参数:


-b  以Byte为单位显示内存使用情况。 
-k  以KB为单位显示内存使用情况。 
-m  以MB为单位显示内存使用情况。
-g   以GB为单位显示内存使用情况。 
-o  不显示缓冲区调节列。 
-s<间隔秒数>  持续观察内存使用状况。 
-t  显示内存总和列。 
-V  显示版本信息。 


4.使用实例:


实例1:显示内存使用情况


命令:
free
free -g
free -m


下面是对这些数值的解释:


total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。


第三行(-/+ buffers/cached):


used:已使用多大。
free:可用有多少。


第四行是交换分区SWAP的,也就是我们通常所说的虚拟内存。


区别:第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。 这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是2098428KB,已用内存是30841684KB,其中包括,内核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.


第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。


所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached。
如本机情况的可用内存为:


18007156=2098428KB+4545340KB+11363424KB


接下来解释什么时候内存会被交换,以及按什么方交换。 


当可用内存少于额定值的时候,就会开会进行交换.如何看额定值: 


命令:cat /proc/meminfo 


交换将通过三个途径来减少系统中使用的物理页面的个数: 
 
1.减少缓冲与页面cache的大小, 
2.将系统V类型的内存页面交换出去,  
3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。 


事实上,少量地使用swap是不是影响到系统性能的。


那buffers和cached都是缓存,两者有什么区别呢?


为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:


Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。


Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。


Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。


简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。


所以我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.


如果是应用服务器的话,一般只看第二行,+buffers/cache,即对应用程序来说free的内存太少了,也是该考虑优化程序或加内存了。


实例2:以总和的形式显示内存的使用信息


命令:free -t 


实例3:周期性的查询内存使用信息


命令:free -s 10
每10s 执行一次命令






==============vmstat=====================
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。vmstat 工具提供了一种低开销的系统性能观察方式。因为 vmstat 本身就是低开销工具,在非常高负荷的服务器上,你需要查看并监控系统的健康情况,在控制窗口还是能够使用vmstat 输出结果。在学习vmstat命令前,我们先了解一下Linux系统中关于物理内存和虚拟内存相关信息。


物理内存和虚拟内存区别:


我们知道,直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存是有限的,这样就引出了物理内存与虚拟内存的概念。


物理内存就是系统硬件提供的内存大小,是真正的内存,相对于物理内存,在linux下还有一个虚拟内存的概念,虚拟内存就是为了满足物理内存的不足而提出的策略,它是利用磁盘空间虚拟出的一块逻辑内存,用作虚拟内存的磁盘空间被称为交换空间(Swap Space)。


作为物理内存的扩展,linux会在物理内存不足时,使用交换分区的虚拟内存,更详细的说,就是内核会将暂时不用的内存块信息写到交换空间,这样以来,物理内存得到了释放,这块内存就可以用于其它目的,当需要用到原始的内容时,这些信息会被重新从交换空间读入物理内存。


linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。


要深入了解linux内存运行机制,需要知道下面提到的几个方面:


首先,Linux系统会不时的进行页面交换操作,以保持尽可能多的空闲物理内存,即使并没有什么事情需要内存,Linux也会交换出暂时不用的内存页面。这可以避免等待交换所需的时间。


其次,linux进行页面交换是有条件的,不是所有页面在不用时都交换到虚拟内存,linux内核根据”最近最经常使用“算法,仅仅将一些不经常使用的页面文件交换到虚拟内存,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。
最后,交换空间的页面在使用时会首先被交换到物理内存,如果此时没有足够的物理内存来容纳这些页面,它们又会被马上交换出去,如此以来,虚拟内存中可能没有足够空间来存储这些交换页面,最终会导致linux出现假死机、服务异常等问题,linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。


因此,合理规划和设计linux内存的使用,是非常重要的。


虚拟内存原理:


在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。


在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。


分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。


当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。
 
1.命令格式:


vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]


2.命令功能:


用来显示虚拟内存的信息


3.命令参数:


-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。


4.使用实例:


实例1:显示虚拟内存使用情况


命令:vmstat


字段说明:


Procs(进程):
r: 运行队列中进程数量
b: 等待IO的进程数量
Memory(内存):
swpd: 使用虚拟内存大小
free: 可用内存大小
buff: 用作缓冲的内存大小
cache: 用作缓存的内存大小
Swap:
si: 每秒从交换区写到内存的大小
so: 每秒写入交换区的内存大小
IO:(现在的Linux版本块的大小为1024bytes)
bi: 每秒读取的块数
bo: 每秒写入的块数


系统:


in: 每秒中断数,包括时钟中断。
cs: 每秒上下文切换数。
CPU(以百分比表示):
us: 用户进程执行时间(user time)
sy: 系统进程执行时间(system time)
id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
wa: 等待IO时间


备注: 如果 r经常大于 4 ,且id经常少于40,表示cpu的负荷很重。如果pi,po 长期不等于0,表示内存不足。如果disk 经常不等于0, 且在 b中的队列 大于3, 表示 io性能不好。Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。


命令:vmstat 5 5


表示在5秒时间内进行5次采样。将得到一个数据汇总他能够反映真正的系统情况。


实例2:显示活跃和非活跃内存


命令:vmstat -a 2 5


使用-a选项显示活跃和非活跃内存时,所显示的内容除增加inact和active外,其他显示内容与例子1相同。


字段说明:


Memory(内存):
inact: 非活跃内存大小(当使用-a选项时显示)
active: 活跃的内存大小(当使用-a选项时显示)


实例3:查看系统已经fork了多少次


命令:vmstat -f


这个数据是从/proc/stat中的processes字段里取得的


实例4:查看内存使用的详细信息


命令:vmstat -s


这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat。


实例5:查看磁盘的读/写


命令:vmstat -d


这些信息主要来自于/proc/diskstats.


merged:表示一次来自于合并的写/读请求,一般系统会把多个连接/邻近的读/写请求合并到一起来操作.


实例6:查看/dev/sda1磁盘的读/写


命令:df


这些信息主要来自于/proc/diskstats。
reads:来自于这个分区的读的次数。
read sectors:来自于这个分区的读扇区的次数。
writes:来自于这个分区的写的次数。
requested writes:来自于这个分区的写请求次数。


实例7:查看系统的slab信息


命令:vmstat -m


这组信息来自于/proc/slabinfo。


slab:由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,这些对象如果每次构建的时候就向内存要一个页(4kb),而其实只有几个字节,这样就会非常浪费,为了解决这个问题,就引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间,内核对一些小对象创建析构很频繁,slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数。




=================iostat命令=======================
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat属于sysstat软件包。可以用yum install sysstat 直接安装。


1.命令格式:


iostat[参数][时间][次数]


2.命令功能:


  通过iostat方便查看CPU、网卡、tty设备、磁盘、CD-ROM 等等设备的活动情况,负载信息。


3.命令参数:


-C 显示CPU使用情况
-d 显示磁盘使用情况
-k 以 KB 为单位显示
-m 以 M 为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS 使用情况
-p[磁盘] 显示磁盘和分区的情况
-t 显示终端和CPU的信息
-x 显示详细信息
-V 显示版本信息


4.使用实例:


实例1:显示所有设备负载情况


命令:iostat




cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。


备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。


disk属性值说明:


rrqm/s:  每秒进行 merge 的读操作数目。即 rmerge/s
wrqm/s:  每秒进行 merge 的写操作数目。即 wmerge/s
r/s:  每秒完成的读 I/O 设备次数。即 rio/s
w/s:  每秒完成的写 I/O 设备次数。即 wio/s
rsec/s:  每秒读扇区数。即 rsect/s
wsec/s:  每秒写扇区数。即 wsect/s
rkB/s:  每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
wkB/s:  每秒写K字节数。是 wsect/s 的一半。
avgrq-sz:  平均每次设备I/O操作的数据大小 (扇区)。
avgqu-sz:  平均I/O队列长度。
await:  平均每次设备I/O操作的等待时间 (毫秒)。
svctm: 平均每次设备I/O操作的服务时间 (毫秒)。
%util:  一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比


备注:如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明I/O 队列太长,io响应太慢,则需要进行必要优化。如果avgqu-sz比较大,也表示有当量io在等待。


实例2:定时显示所有信息


命令:iostat 2 3


每隔 2秒刷新显示,且显示3次


实例3:显示指定磁盘信息


命令:iostat -d sda1


实例4:显示tty和Cpu信息


命令:iostat -t


实例5:以M为单位显示所有信息


命令:iostat -m


实例6:查看TPS和吞吐量信息


命令:iostat -d -k 1 1


tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;kB_wrtn:写入的总数量数据量;


这些单位都为Kilobytes。


上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时统计的磁盘总TPS是22.73,下面是各个分区的TPS。(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)


实例7:查看设备使用率(%util)、响应时间(await)


命令:iostat -d -x -k 1 1


rrqm/s:  每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s:  每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s:  每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s:  每秒读扇区数.即 delta(rsect)/s
wsec/s: 每秒写扇区数.即 delta(wsect)/s
rkB/s:  每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s:  每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz:平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz:平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).
await:  平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的,即 delta(use)/s/1000 (因为use的单位为毫秒)


如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。


idle小于70% IO压力就较大了,一般读取速度有较多的wait。


同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。


另外 await 的参数也要多和 svctm 来参考。差的过高就一定有 IO 的问题。
avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小。如果数据拿的大,才IO 的数据会高。也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s。也就是讲,读定速度是这个来决定的。


svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加。await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式。如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU。
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水。


形象的比喻:


r/s+w/s 类似于交款人的总数
      
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
      
平均服务时间(svctm)类似于收银员的收款速度
      
平均等待时间(await)类似于平均每人的等待时间
      
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
      
 I/O 操作率 (%util)类似于收款台前有人排队的时间比例


设备IO操作:总IO(io)/s = r/s(读) +w/s(写) =1.46 + 25.28=26.74


平均每次设备I/O操作只需要0.36毫秒完成,现在却需要10.57毫秒完成,因为发出的 请求太多(每秒26.74个),假如请求时同时发出的,可以这样计算平均等待时间:
      
平均等待时间=单个I/O服务器时间*(1+2+...+请求总数-1)/请求总数 
       
每秒发出的I/0请求很多,但是平均队列就4,表示这些请求比较均匀,大部分处理还是比较及时。


实例8:查看cpu状态
   
命令:iostat -c 1 3




=====================watch命令=========================
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。在Linux下,watch是周期性的执行下个程序,并全屏显示执行结果。你可以拿他来监测你想要的一切命令的结果变化,比如 tail 一个 log 文件,ls 监测某个文件的大小变化,看你的想象力了!


1.命令格式:


watch[参数][命令]


2.命令功能:


可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令


3.命令参数:


-n或--interval  watch缺省每2秒运行一下程序,可以用-n或-interval来指定间隔的时间。
-d或--differences  用-d或--differences 选项watch 会高亮显示变化的区域。 而-d=cumulative选项会把变动过的地方(不管最近的那次有没有变动)都高亮显示出来。
-t 或-no-title  会关闭watch命令在顶部的时间间隔,命令,当前时间的输出。
  -h, --help 查看帮助文档


4.使用实例:


实例1:


命令:每隔一秒高亮显示网络链接数的变化情况


watch -n 1 -d netstat -ant


说明:


其它操作:
切换终端: Ctrl+x
退出watch:Ctrl+g


实例2:每隔一秒高亮显示http链接数的变化情况


命令:
watch -n 1 -d 'pstree|grep http'


说明:


每隔一秒高亮显示http链接数的变化情况。 后面接的命令若带有管道符,需要加''将命令区域归整。


实例3:实时查看模拟攻击客户机建立起来的连接数


命令:


watch 'netstat -an | grep:21 | \ grep<模拟攻击客户机的IP>| wc -l' 


实例4:监测当前目录中 scf' 的文件的变化


命令:
watch -d 'ls -l|grep scf' 


实例5:10秒一次输出系统的平均负载


命令:
watch -n 10 'cat /proc/loadavg'




==============at======================
在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务。 通过'添加任务计划'的一步步引导,则可建立一个定时执行的任务。


在linux系统中你可能已经发现了为什么系统常常会自动的进行一些任务?这些任务到底是谁在支配他们工作的?在linux系统如果你想要让自己设计的备份程序可以自动在某个时间点开始在系统底下运行,而不需要手动来启动它,又该如何处置呢? 这些例行的工作可能又分为一次性定时工作与循环定时工作,在系统内又是哪些服务在负责? 还有,如果你想要每年在老婆的生日前一天就发出一封信件提醒自己不要忘记,linux系统下该怎么做呢? 


今天我们主要学习一下一次性定时计划任务的at命令的用法!


1.命令格式:


at[参数][时间]


2.命令功能:


在一个指定的时间执行一个指定任务,只能执行一次,且需要开启atd进程(
ps -ef | grep atd查看, 开启用/etc/init.d/atd start or restart; 开机即启动则需要运行 chkconfig --level 2345 atd on)。


3.命令参数:


-m 当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I atq的别名
-d atrm的别名
-v 显示任务将被执行的时间
-c 打印任务的内容到标准输出
-V 显示版本信息
-q<列队> 使用指定的列队
-f<文件> 从指定文件读入任务而不是从标准输入读入
-t<时间参数> 以时间参数的形式提交要运行的任务 


at允许使用一套相当复杂的指定时间的方法。他能够接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点)等比较模糊的 词语来指定时间。用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。 也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。 上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为:now + count time-units ,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时,等等。 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。


TIME:时间格式,这里可以定义出什么时候要进行 at 这项任务的时间,格式有:


HH:MM
ex> 04:00


在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此任务。


HH:MM YYYY-MM-DD
ex> 04:00 2009-03-17


强制规定在某年某月的某一天的特殊时刻进行该项任务


HH:MM[am|pm] [Month] [Date]
ex> 04pm March 17


也是一样,强制在某年某月某日的某时刻进行该项任务


HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes
ex> 04pm + 3 days


就是说,在某个时间点再加几个时间后才进行该项任务。


4.使用实例:


实例1:三天后的下午 5 点锺执行 /bin/ls


命令:
at 5pm+3 days




实例2:明天17点钟,输出时间到指定文件内


命令:
at 17:20 tomorrow


实例3:计划任务设定后,在没有执行之前我们可以用atq命令来查看系统没有执行工作任务


命令:
atq


实例4:删除已经设置的任务


命令:
atrm 7


实例5:显示已经设置的任务内容


命令:
at -c 8


5.atd 的启动与 at 运行的方式:


5.1 atd 的启动


要使用一次性计划任务时,我们的 Linux 系统上面必须要有负责这个计划任务的服务,那就是 atd 服务。 不过并非所有的 Linux distributions 都默认会把他打开的,所以,某些时刻我们需要手动将atd 服务激活才行。 激活的方法很简单,就是这样:


命令:


/etc/init.d/atd start 
/etc/init.d/atd restart 


说明:


/etc/init.d/atd start 没有启动的时候,直接启动atd服务
/etc/init.d/atd restart 服务已经启动后,重启 atd 服务


备注:配置一下启动时就启动这个服务,免得每次重新启动都得再来一次


命令:
chkconfig atd on


5.2 at 的运行方式


既然是计划任务,那么应该会有任务执行的方式,并且将这些任务排进行程表中。那么产生计划任务的方式是怎么进行的? 事实上,我们使用 at 这个命令来产生所要运行的计划任务,并将这个计划任务以文字档的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了。就这么简单。


不过,并不是所有的人都可以进行 at 计划任务。为什么? 因为系统安全的原因。很多主机被所谓的攻击破解后,最常发现的就是他们的系统当中多了很多的黑客程序, 这些程序非常可能运用一些计划任务来运行或搜集你的系统运行信息,并定时的发送给黑客。 所以,除非是你认可的帐号,否则先不要让他们使用 at 命令。那怎么达到使用 at 的可控呢?


我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。加上这两个文件后, at 的工作情况是这样的:


先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 命令了。


如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。


透过这个说明,我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为帐号没有在该文件中,就能够运行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的, 因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可! 一个帐号写一行。




====================crontab命令=======================


二、crond服务


安装crontab:


yum install crontabs


服务操作说明:


/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置


查看crontab服务状态:


service crond status


手动启动crontab服务:


service crond start


查看crontab服务是否已设置为开机启动,执行命令:


ntsysv


加入开机自动启动:


chkconfig –level 35 crond on


三、crontab命令详解


1.命令格式:


crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]


2.命令功能:


通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。


3.命令参数:


-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crontab文件时给确认提示。


4.常用方法:


1). 创建一个新的crontab文件


在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。cron进程根据它来确定使用哪个编辑器编辑crontab文件。9 9 %的UNIX和LINUX用户都使用vi,如果你也是这样,那么你就编辑$ HOME目录下的. profile文件,在其中加入这样一行:


EDITOR=vi; export EDITOR


然后保存并退出。不妨创建一个名为<user> cron的文件,其中<user>是用户名,例如, davecron。在该文件中加入如下的内容。


      # (put your own initials here)echo the date to the console every
      # 15minutes between 6pm and 6am
      0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console
    
保存并退出。确信前面5个域用空格分隔。


在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数:


    $ crontab davecron


现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。


同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。


2). 列出crontab文件


为了列出crontab文件,可以用:


    $ crontab -l
    0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1


你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对crontab文件做一备份:
    
 $ crontab -l > $HOME/mycron
    
这样,一旦不小心误删了crontab文件,可以用上一节所讲述的方法迅速恢复。


3). 编辑crontab文件
  
 如果希望添加、删除或编辑crontab文件中的条目,而E D I TO R环境变量又设置为v i,那么就可以用v i来编辑crontab文件,相应的命令为:
    
$ crontab -e


可以像使用v i编辑其他任何文件那样修改crontab文件并退出。如果修改了某些条目或添加了新的条目,那么在保存该文件时, c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值,它会提示你。


我们在编辑crontab文件时,没准会加入新的条目。例如,加入下面的一条:
   
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;


现在保存并退出。最好在crontab文件的每一个条目之上加入一条注释,这样就可以知道它的功能、运行时间,更为重要的是,知道这是哪位用户的作业。


现在让我们使用前面讲过的crontab -l命令列出它的全部信息:


    $ crontab -l 
    # (crondave installed on Tue May 4 13:07:43 1999)
    # DT:ech the date to the console every 30 minites
  0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
    # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
    30 3 1,7,14,21,26 * * /bin/find -name "core' -exec rm {} \;


4). 删除crontab文件


要删除crontab文件,可以用:


$ crontab -r


5). 恢复丢失的crontab文件


如果不小心误删了crontab文件,假设你在自己的$ H O M E目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。如果由于权限问题无法完成拷贝,可以用:
    
$ crontab <filename>
    
其中,<filename>是你在$ H O M E目录中副本的文件名。


我建议你在自己的$ H O M E目录中保存一个该文件的副本。我就有过类似的经历,有数次误删了crontab文件(因为r键紧挨在e键的右边)。这就是为什么有些系统文档建议不要直接编辑crontab文件,而是编辑该文件的一个副本,然后重新提交新的文件。


有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。


5.使用实例


实例1:每1分钟执行一次command


命令:
* * * * * command
 
实例2:每小时的第3和第15分钟执行


命令:
3,15 * * * * command
 
实例3:在上午8点到11点的第3和第15分钟执行


命令:
3,15 8-11 * * * command
 
实例4:每隔两天的上午8点到11点的第3和第15分钟执行


命令:
3,15 8-11 */2 * * command
 
实例5:每个星期一的上午8点到11点的第3和第15分钟执行


命令:
3,15 8-11 * * 1 command
 
实例6:每晚的21:30重启smb 


命令:
30 21 * * * /etc/init.d/smb restart
 
实例7:每月1、10、22日的4 : 45重启smb 


命令:
45 4 1,10,22 * * /etc/init.d/smb restart
 
实例8:每周六、周日的1 : 10重启smb


命令:
10 1 * * 6,0 /etc/init.d/smb restart
 
实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb 


命令:
0,30 18-23 * * * /etc/init.d/smb restart
 
实例10:每星期六的晚上11 : 00 pm重启smb 


命令:
0 23 * * 6 /etc/init.d/smb restart
 
实例11:每一小时重启smb 


命令:
* */1 * * * /etc/init.d/smb restart
 
实例12:晚上11点到早上7点之间,每隔一小时重启smb 


命令:
* 23-7/1 * * * /etc/init.d/smb restart
 
实例13:每月的4号与每周一到周三的11点重启smb 


命令:
0 11 4 * mon-wed /etc/init.d/smb restart
 
实例14:一月一号的4点重启smb 


命令:
0 4 1 jan * /etc/init.d/smb restart


实例15:每小时执行/etc/cron.hourly目录内的脚本


命令:
01   *   *   *   *     root run-parts /etc/cron.hourly


说明:


run-parts这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是目录名了


四、使用注意事项


1. 注意环境变量问题


有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。


在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。


不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:


1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:


cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &


3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh


2. 注意清理系统用户的邮件日志


每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。


例如,可以在crontab文件中设置如下形式,忽略日志输出:


0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1


“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。


3. 系统级任务调度与用户级任务调度


系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。


4. 其他注意事项


新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。


当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。


千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。


在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。




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


1.命令格式:


lsof [参数][文件]


2.命令功能:


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


lsof打开的文件可以是:


1.普通文件
2.目录
3.网络文件系统的文件
4.字符或设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.网络文件(例如:NFS file、网络socket,unix域名socket)
9.还有其它类型的文件,等等


3.命令参数:


-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g  列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录>  列出目录下被打开的文件
+D<目录>  递归列出目录下被打开的文件
-n<目录>  列出使用NFS的文件
-i<条件>  列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u  列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息


4.使用实例:


实例1:无任何参数


命令:
lsof


lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等


(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改


(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序


(3)lnn:library references (AIX);
(4)er:FD information error (see NAME column);
(5)jld:jail directory (FreeBSD);
(6)ltx:shared library text (code and data);
(7)mxx :hex memory-mapped type number xx.
(8)m86:DOS Merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (OpenBSD);
(14)v86  VP/ix mapped file;
(15)0:表示标准输出
(16)1:表示标准输入
(17)2:表示标准错误


一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等


(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定


同时在文件状态模式后面,还跟着相关的锁


(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)W:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part      of the file;
(9)X:for an SCO OpenServer Xenix lock on the      entire file;
(10)space:if there is no lock.


TYPE:文件类型,如DIR、REG等,常见的文件类型


(1)DIR:表示目录
(2)CHR:表示字符类型
(3)BLK:块设备类型
(4)UNIX: UNIX 域套接字
(5)FIFO:先进先出 (FIFO) 队列
(6)IPv4:网际协议 (IP) 套接字


DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称


实例2:查看谁正在使用某个文件,也就是说查找某个文件相关的进程


命令:
lsof /bin/bash


实例3:递归查看某个目录的文件信息


命令:
lsof test/test3


使用了+D,对应目录下的所有子目录和文件都会被列出


实例4:不使用+D选项,遍历查看某个目录的所有文件信息的方法


命令:
 lsof |grep 'test/test3'


实例5:列出某个用户打开的文件信息


命令:
lsof -u username


说明: 
-u 选项,u其实是user的缩写


实例6:列出某个程序进程所打开的文件信息


命令:
lsof -c mysql


说明:
 -c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了


实例7:列出多个进程多个打开的文件信息


命令:
lsof -c mysql -c apache


实例8:列出某个用户以及某个进程所打开的文件信息


命令:
lsof  -u test -c mysql 


说明:
用户与进程可相关,也可以不相关


实例9:列出除了某个用户外的被打开的文件信息


命令:
lsof -u ^root


说明:
^这个符号在用户名之前,将会把是root用户打开的进程不让显示


实例10:通过某个进程号显示该进行打开的文件


命令:
lsof -p 1


实例11:列出多个进程号对应的文件信息


命令:
lsof -p 1,2,3


实例12:列出除了某个进程号,其他进程号所打开的文件信息


命令:
lsof -p ^1


实例13:列出所有的网络连接


命令:
lsof -i


实例14:列出所有tcp 网络连接信息


命令:
lsof -i tcp


实例15:列出所有udp网络连接信息


命令:
lsof -i udp


实例16:列出谁在使用某个端口


命令:
lsof -i :3306


实例17:列出谁在使用某个特定的udp端口


命令:
lsof -i udp:55


或者:特定的tcp端口


命令:
lsof -i tcp:80


实例18:列出某个用户的所有活跃的网络端口


命令:
lsof -a -u test -i


实例19:列出所有网络文件系统


命令:
lsof -N


实例20:域名socket文件

命令:lsof -u

实例21:某个用户组所打开的文件信息

命令:lsof -g 5555

实例22:根据文件描述列出对应的文件信息

命令:
lsof -d description(like 2)
例如:lsof  -d  txt
例如:lsof  -d  1
例如:lsof  -d  2

说明:0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

实例23:根据文件描述范围列出文件信息

命令:lsof -d 2-3

实例24:列出COMMAND列中包含字符串" sshd",且文件描符的类型为txt的文件信息

命令:lsof -c sshd -a -d txt

实例25:列出被进程号为1234的进程所打开的所有IPV4 network files 


命令:lsof -i 4 -a -p 1234


实例26:列出目前连接主机peida.linux上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令


命令:lsof -i @peida.linux:20,21,22,25,53,80  -r  3

















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































原创粉丝点击