grep / egrep

笔者在前面的内容中多次提到并用到grep命令,可见它的重要性所以好好学习一下这个重要的命令吧你要知道的是grep连同下面讲的sed, awk都是针对文本的行才操作的
语法: grep [-cinvABC] ‘word’ filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行



以下,笔者举几个小例子帮助你好好掌握这个grep工具的用法
a. 过滤出带有某个关键词的行并输出行号



b. 过滤不带有某个关键词的行,并输出行号



c. 过滤出所有包含数字的行



在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符


这就表示筛选包含oo字符串,但是不包含r字符
d. 过滤出文档中以某个字符开头或者以某个字符结尾的行



在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果现在想一下,如何打印出不以英文字母开头的行呢?



e. 过滤任意一个字符与重复字符



“.”表示任意一个字符,上例中,就是把符合ro之间有两个任意字符的行过滤出来
“*”表示零个或多个前面的字符



‘ooo*’ 表示oo, ooo, oooo … 或者更多的’o’。现在你是否想到了’.*’ 这个组合表示什么意义?



‘.*’表示零个或多个任意字符,空行也包含在内
f. 指定要过滤字符出现的次数



这里用到了{ },其内部为数字,表示前面的字符要重复的次数上例中表示包含有两个o ’oo’的行注意,{ }左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘\{n1,n2\}’其中n1<n2,表示重复n1n2次前面的字符,n2还可以为空,则表示大于等于n1

上面部分讲的grep,另外笔者常常用到egrep这个工具,简单点讲,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够可以胜任你的日常工作了下面笔者介绍egrep不用于grep的几个用法为了试验方便,笔者把test.txt 编辑成如下内容:
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
a. 筛选一个或一个以上前面的字符



grep 不同的是,egrep这里是使用’+’
b. 筛选零个或一个前面的字符



c. 筛选字符串1或者字符串2



中间有一个’|’表示或者的意思,笔者用这个用的很多,所以这个你最好记一下
d. egrep’( )’的应用



’( )’表示一个整体,例如(oo)+就表示1’oo’或者多个’oo’



ln 建立连接档

前面提到过两次连接档的概念,现在终于该好好介绍下这部分内容了连接档分为两种,硬连接(hard link)和软连接(symbolic link

Hard Links

上面内容中说过,当系统要读取一个文件时,就会先去读inode table,然后再去根据inode中的信息到块区域去将数据取出来hard link 是直接再建立一个inode连接到文件放置的块区域也就是说,进行hard link的时候实际上该文件内容没有任何变化,只是增加了一个指到这个文件的inode,不过这样一来就会有个问题,因为增加的inode会连接到块区域,而目录本身仅仅消耗inode而已,那么hard link就不能连接目录了请你记住,hard link 有两个限制:1 不能跨文件系统,因为不通的文件系统有不同的inode table 2 不能连接目录

Symbolic Linkshard link不同,这个是建立一个独立的文件,而这个文件的作用是当读取这个连接文件时,它会把读取的行为转发到该文件所link的文件上这样讲,也许比较绕口,那么就来举一个例子现在有文件a,我们做了一个软连接文件b(只是一个连接文件,非常小),b指向了文件a。当读取b时,那么b就会把读取的动作转发到a上,这样就读取到了文件a。所以,当你删除文件a时,文件b并不会被删除,但是再读取b时,会提示无法打开文件而,当你删除b时,a是不会有任何影响的
看样子,似乎 hard link 比较安全,因为即使某一个 inode 被杀掉了,只要有任何一个 inode 存在,那么该文件就不会不见!不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做目录的 link ,所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方向较广!那么如何建立软连接和硬连接呢?这就用到了ln 命令

ln 语法: ln [-s] [来源文件] [目的文件]
ln 常用的选项就一个-s ,如果不加就是建立硬连接,加上就建立软连接



在建立硬连接前后,123目录所占空间大小并没有改变



当把源文件删除后,空间仍旧没有变化说明了删除一个文件其实只是删除了inode信息



不能创建目录的硬连接



建立软连接后,456目录增加了4k



删除源文件后会提示没有这个文件的错误



目录是可以软连接的



删除软连接对源文件没有任何影响

文本编辑工具vim

前面多次提到过vim这个东西,它是linux中必不可少的一个工具没有它很多工作都无法完成早期的Unix都是使用的vi作为系统默认的编辑器的你也许会有疑问,vivim有什么区别?可以这样简单理解,vimvi的升级版很多linux系统管理员都习惯用vi,那是因为他们接触linux的时候用的就是vivim后来才比较流行所以,无所谓用vivim,只要你能达到你想要的目的即可

在笔者看来vi vim最大的区别就是编辑一个文本时,vi不会显示颜色,而vim会显示颜色显示颜色更易于用户进行编辑其他功能没有什么区别所以在linux系统下,使用vi还是vim完全取决你的个人爱好而已笔者从一开始学linux就一直使用vim,所以也会一直以vim的角色来教授给你
vim的三种模式:一般模式编辑模式命令模式这需要你牢记的,因为以前笔者刚刚从事linux工作的时候去面试,很多单位的笔试题就有这个知识点
* 一般模式:
当你vim filename 编辑一个文件时,一进入该文件就是一般模式了在这个模式下,你可以做的操作有,上下移动光标;删除某个字符;删除某行;复制粘贴一行或者多行
* 编辑模式:一般模式下,是不可以修改某一个字符的,只能到编辑模式了从一般模式进入编辑模式,只需你按一个键即可(i,I,a,A,o,O,r,R当进入编辑模式时,会在屏幕的最下一行出现“INSERTREPLACE”的字样从编辑模式回到一般模式只需要按一下键盘左上方的ESC键即可
* 命令模式:在一般模式下,输入”:”或者”/”即可进入命令模式在该模式下,你可以搜索某个字符或者字符串,也可以保存替换退出显示行号等等

下面笔者教你如何在一个空白文档中写入一段文字,然后保存



输入vim test.txt直接回车进入一般模式然后按"i" 字母进入编辑模式



会看到窗口的左下方出现”INSERT”字样,说明已经进入了编辑模式,此时就可以写入内容了



等编辑完内容后,按ESC退出编辑模式,进入一般模式此时在左下方的”INSERT”字样消失,然后按”:”进入命令模式,最后输入wq保存并退出vim。



这时,看一下test.txt文档的内容吧



其实vim为全键盘操作的编辑器,所以在各个模式下都有很多功能键盘的下面笔者列举一下,其中笔者认为常用的会用红色标出,需要你多加练习,另外不常用的你也要知道的

一般模式下移动光标


sed 工具的使用

grep 工具的功能其实还不够强大,其实说白了,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉以前用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其他更丰富的功能。sedawk都是流式编辑器,是针对文档的行来操作的
a. 打印某行 sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行



b. 打印多行
打印整个文档用 -n ‘1,$’p



c. 打印包含某个字符串的行



上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用




d. -e 可以实现多个行为



e. 删除某行或者多行



‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行



f. 替换字符或字符串



上例中的’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个
除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者[email=’@’]’@’[/email]都没有问题



现在思考一下,如何删除文档中的所有数字或者字母?



有意思吧,[0-9]表示任意的数字这里你也可以写成[a-zA-Z]甚至[0-9a-zA-Z]



g. 调换两个字符串的位置



这个就需要解释一下了,上例中用’()’把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符’\’,替换时则写成’\1’, ‘\2’, ‘\3’ 的形式除了调换两个字符串的位置外,笔者还常常用到在某一行前或者后增加指定内容



h. 直接修改文件的内容
sed -i ‘s/:/#/g’ test.txt ,这样就可以直接更改test.txt文件中的内容了由于这个命令可以直接把文件修改,所以在修改前最好先复制一下文件以免改错
sed常用到的也就上面这些了,只要你多加练习就能熟悉它了为了能让你更加牢固的掌握sed的应用,笔者留几个练习题给你,希望你能认真完成
1. /etc/passwd 复制到/root/test.txt,用sed打印所有行;
2. 打印test.txt310行;
3. 打印test.txt 中包含’root’的行;
4. 删除test.txt 15行以及以后所有行;
5. 删除test.txt中包含’bash’的行;
6. 替换test.txt ’root’’toor’
7. 替换test.txt’/sbin/nologin’’/bin/login’
8. 删除test.txt510行中所有的数字;
9. 删除test.txt 中所有特殊字符(除了数字以及大小写字母);
10. test.txt中第一个单词和最后一个单词调换位置;
11. test.txt中出现的第一个数字和最后一个单词替换位置;
12. test.txt 中第一个数字移动到行末尾;
13. test.txt 20行到末行最前面加’aaa:’
现在给出以上练习题的答案,你如果实在想不出如何操作,那你看看答案吧,请尽量多想一下
1. /bin/cp /etc/passwd /root/test.txt ; sed -n '1,$'p test.txt
2. sed -n '3,10'p test.txt
3. sed -n '/root/'p test.txt
4. sed '15,$'d test.txt
5. sed '/bash/'d test.txt
6. sed 's/root/toor/g' test.txt
7. sed 's#sbin/nologin#bin/login#g' test.txt
8. sed '5,10s/[0-9]//g' test.txt
9. sed 's/[^0-9a-zA-Z]//g' test.txt
10. sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' test.txt
11. sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' test.txt
12. sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' test.txt
13. sed '20,$s/^.*$/aaa:&/' test.txt

认识/etc/passwd和/etc/shadow

这两个文件可以说是linux系统中最重要的文件之一如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的





/etc/passwd’:’分割成7个字段,每个字段的具体含义是:
1)用户名(如第一行中的root就是用户名),代表用户账号的字符串用户名字符可以是大小写字母数字减号(不能出现在首位)点以及下划线,其他字符不合法虽然用户名中可以出现点,但不建议使用,尤其是首位为点时,另外减号也不建议使用,因为容易造成混淆
2)存放的就是该账号的口令,为什么是’x’呢?早期的unix系统口令确实是存放在这里,但基于安全因素,后来就将其存放到/etc/shadow中了,在这里只用一个’x’代替
3)这个数字代表用户标识号,也叫做uid。系统识别用户身份就是通过这个数字来的,0就是root,也就是说你可以修改test用户的uid0,那么系统会认为roottest为同一个账户通常uid的取值范围是0~655350是超级用户(root)的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始,如果我们自定义建立一个普通用户,你会看到该账户的标识号是大于或等于500
4)表示组标识号,也叫做gid。这个字段对应着/etc/group 中的一条记录,其实/etc/group/etc/passwd基本上类似
5)注释说明,该字段没有实际意义,通常记录该用户的一些属性,例如姓名电话地址等等不过,当你使用finger的功能时就会显示这些信息的(稍后做介绍)
6)用户的家目录,当用户登录时就处在这个目录下。root的家目录是/root,普通用户的家目录则为/home/username,这个字段是可以自定义的,比如你建立一个普通用户test1,要想让test1的家目录在/data目录下,只要修改/etc/passwd文件中test1那行中的该字段为/data即可
7shell,用户登录后要启动一个进程,用来将用户下达的指令传给内核,这就是shell。Linuxshell有很多种sh, csh, ksh, tcsh, bash等,而Redhat/CentOSshell就是bash。查看/etc/passwd文件,该字段中除了/bin/bash外还有/sbin/nologin比较多,它表示不允许该账号登录如果你想建立一个账号不让他登录,那么就可以把该字段改成/sbin/nologin,默认是/bin/bash。





再来看看/etc/shadow这个文件,和/etc/passwd类似,用”:”分割成9个字段
1)用户名,跟/etc/passwd对应
2)用户密码,这个才是该账号的真正的密码,不过这个密码已经加密过了,但是有些黑客还是能够解密的所以为了安全,该文件属性设置为600,只允许root读写
3)上次更改密码的日期,这个数字是这样计算得来的,距离197011日到上次更改密码的日期,例如上次更改密码的日期为201211日,则这个值就是365*2012-1970+1=15331。
4)要过多少天才可以更改密码,默认是0,即不限制
5)密码多少天后到期即在多少天内必须更改密码,例如这里设置成30,则30天内必须更改一次密码,否则将不能登录系统,默认是99999,可以理解为永远不需要改
6)密码到期前的警告期限,若这个值设置成7,则表示当7天后密码过期时,系统就发出警告告诉用户,提醒用户他的密码将在7天后到期
7)账号失效期限你可以这样理解,如果设置这个值为3,则表示:密码已经到期,然而用户并没有在到期前修改密码,那么再过3天,则这个账号就失效了,即锁定了
8)账号的生命周期,跟第三段一样,是按距离197011日多少天算的它表示的含义是,账号在这个日期前可以使用,到期后账号作废
9)作为保留用的,没有什么意义

文档的压缩与打包-gzip,bzip2,tar

在windows下我们接触最多的压缩文件就是.rar格式的了。但在linux下这样的格式是不能识别的,它有自己所特有的压缩工具。但有一种文件在windows和linux下都能使用那就是.zip格式的文件了。压缩的好处不用笔者介绍相信你也晓得吧,它不仅能节省磁盘空间而且在传输的时候还能节省网络带宽呢。

在linux下最常见的压缩文件通常都是以.tar.gz 为结尾的,除此之外还有.tar, .gz, .bz2, .zip等等。以前也介绍过linux系统中的后缀名其实要不要无所谓,但是对于压缩文件来讲必须要带上。这是为了判断压缩文件是由哪种压缩工具所压缩,而后才能去正确的解压缩这个文件。以下介绍常见的后缀名所对应的压缩工具。

.gz gzip 压缩工具压缩的文件

.bz2 bzip2 压缩工具压缩的文件

.tar tar 打包程序打包的文件(tar并没有压缩功能,只是把一个目录合并成一个文件)

.tar.gz 可以理解为先用tar打包,然后再gzip压缩

.tar.bz2 同上,先用tar打包,然后再bzip2压缩

awk工具的使用

上面也提到了awksed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行。awksed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的。awk工具其实是很复杂的,有专门的书籍来介绍它的应用,但是笔者认为学那么复杂没有必要,只要能处理日常管理工作中的问题即可何必让自己的脑袋装那么东西来为难自己?毕竟用的也不多,即使现在教会了你很多,你也学会了,如果很久不用肯定就忘记了鉴于此,笔者仅介绍比较常见的awk应用,如果你感兴趣的话,再去深入研究吧
a. 截取文档中的某个段



解释一下,-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符



Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行



注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用’{ }’括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来



b. 匹配字符或字符串



sed很类似吧,不过还有比sed更强大的匹配



可以让某个段去匹配,这里的’~’就是匹配的意思,继续往下看


awk还可以多次匹配,如上例中匹配完root,再匹配test,它还可以只打印所匹配的段



不过这样没有啥意义,笔者只是为了说明awk确实比sed强大
d. 条件操作符



awk中是可以用逻辑符号判断的,比如’==’就是等于,也可以理解为精确匹配”。另外也有’>’, ‘>=’, ‘<’, ‘<=’, ‘!=’ 等等,值得注意的是,即使$3为数字,awk也不会把它当数字看待,它会认为是一个字符所以不要妄图去拿$3当数字去和数字做比较



这样是得不到我们想要的效果的这里只是字符与字符之间的比较,’6’>’500’



上例中用的是’!=’ 即不匹配



另外还可以使用”&&” “||”表示并且或者的意思



也可以是或者的关系



d. awk的内置变量
常用的变量有:
NF :用分隔符分隔后一共有多少段;
NR :行数



上例中,打印总共的段数以及最后一段的值



可以使用NR作为条件,来打印出指定的行


e. awk中的数学运算



awk比较强的地方,还在于能把某个段改成指定的字符串,下面还有更强的呢!



当然还可以计算某个段的总和


这里的END要注意一下,表示所有的行都已经执行,这是awk特有的语法,其实awk连同sed都可以写成一个脚本文件,而且有他们特有的语法,在awk中使用if判断、for循环都是可以的,只是笔者认为日常管理工作中没有必要使用那么复杂的语句而已



注意这里’( )’的使用

基本上,正则表达的内容就这些了但是笔者要提醒你一下,笔者介绍的这些仅仅是最基本的东西,并没有提啊深入的去讲sedawk,但是完全可以满足日常工作的需要,有时候也许你会碰到比较复杂的需求,如果真遇到了就去请教一下google下面出几道关于awk的练习题,希望你要认真完成
1. awk 打印整个test.txt (以下操作都是用awk工具实现,针对test.txt);
2. 查找所有包含’bash’的行;
3. ’:’作为分隔符,查找第三段等于0的行;
4. ’:’作为分隔符,查找第一段为’root’的行,并把该段的’root’换成’toor’(可以连同sed一起使用)
5. ’:’作为分隔符,打印最后一段;
6. 打印行数大于20的所有行;
7. ’:’作为分隔符,打印所有第三段小于第四段的行;
8. ’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接
(例如,第一行应该是这样的形式 “root@/bin/bash”
9. ’:’作为分隔符,把整个文档的第四段相加,求和;
下面给出答案:
1. awk '{print $0}' test.txt
2. awk '/bash/' test.txt
3. awk -F':' '$3=="0"' test.txt
4. awk -F':' '$1=="root"' test.txt |sed 's/root/toor/'
5. awk -F':' '{print $NF}' test.txt
6. awk -F':' 'NR>20' test.txt
7. awk -F':' '$3<$4' test.txt
8. awk -F':' '{print $1"@"$NF}' test.txt
9. awk -F':' '{(sum+=$4)}; END {print sum}' test.txt

RPM工具

RPM”Redhat Package Manager”的缩写,根据名字也能猜到这是Redhat公司开发出来的。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的Linux 主机的一套管理程序也就是说,你的linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间依赖相关性。RPM包是预先在linux机器上编译好并打包好的文件,安装起来非常快捷但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当;包与包之间存在着相互依赖的情况;卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃

如果你的光驱中还有系统安装盘的话,你可以通过”mount /dev/cdrom /mnt”命令把光驱挂载到/mnt目录下,那么你会在/mnt/CentOS目录下看到很多.rpm的文件,这就是RPM包了



每一个rpm包的名称都由”-“”.”分成了若干部分就拿 a2ps-4.13b-57.2.el5.i386.rpm 这个包来解释一下,a2ps 为包名;4.13b则为版本信息;57.2.el5为发布版本号;i386为运行平台其中运行平台常见的有i386, i586, i686, x86_64 ,需要你注意的是cpu目前是分32位和64位的,i386,i586i686都为32位平台,x86_64则代表为64位的平台另外有些rpm包并没有写具体的平台而是noarch,这代表这个rpm包没有硬件平台限制例如 alacarte-0.10.0-1.fc6.noarch.rpm 。下面介绍一下rpm常用的命令
1)安装一个rpm



-i :安装的意思
-v :可视化
-h :显示安装进度
另外在安装一个rpm包时常用的附带参数有:
--force 强制安装,即使覆盖属于其他包的文件也要安装
--nodeps 当要安装的rpm包依赖其他包时,即使其他包没有安装,也要安装这个包
2)升级一个rpm
rpm -Uvh filename -U :即升级的意思
3)卸载一个rpm
rpm -e filename 这里的filename是通过rpm的查询功能所查询到的,稍后会作介绍



卸载时后边跟的filename和安装时的是有区别的上面命令提到的 “|”linux系统中用的非常多也非常有用,它是一个管道符,用来把前面运行的结果传递给后面的命令以后会做详细介绍,而后出现的grep命令则是用来过滤某个关键词的工具,在后续章节中会做详细介绍
4)查询一个包是否安装
rpm -q rpm包名(这里的包名,是不带有平台信息以及后缀名的)



如果加上了平台信息以及后缀名反而不能查出来你还可以查询当前系统中所安装的所有rpm



因为太多,所以笔者列出前十个
5)得到一个rpm包的相关信息
rpm -qi 包名
(同样不需要加平台信息与后缀名)



6)列出一个rpm包安装的文件
rpm -ql 包名



通过上面的命令可以看出vim是通过安装vim-enhanced-7.0.109-6.el5这个rpm包得来的那么反过来如何通过一个文件去查找是由安装哪个rpm包得来的?
7)列出某一个文件属于哪个rpm
rpm -qf 文件的绝对路径



前面讲过如何查找一个文件(可执行命令)的绝对路径



所以你也可以把这两条命令连起来写



看到了吗,which vim 这条命令是由两个反引号引起来的,这代表引用反引号里面的命令所产生的结果关于rpm工具的使用还有很多内容,笔者就不一一列举了,只要你掌握上面这些内容,完全够你平时工作用的了

新增/删除用户和用户组

a. 新增一个组 groupadd [-g GID] groupname





不加-g 则按照系统默认的gid创建组,跟用户一样,gid也是从500开始的





-g选项可以自定义gid
b. 删除组 gropudel groupname





没有特殊选项
c. 增加用户 useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]
-u 自定义UID
-g 使其属于已经存在的某个GID
-d 自定义用户的家目录
-M 不建立家目录
-s 自定义shell





你会发现,创建test11时,加上了-M选项后,在/etc/passwd文件中test11那行的第六字段依然有/home/test11,可是ls查看该目录时,会提示该目录不存在





-M选项的作用就是不创建用户的家目录
-d. 删除用户 userdel [-r] username





-r 选项的作用是删除用户时,连同用户的家目录一起删除

SHELL 脚本

终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。

到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信随着学习的深入你就会越来越了解到底什么是shell脚本。首先它是一个脚本,并不能作为正式的编程语言。因为是跑在linux的shell中,所以叫shell脚本。说白了,shell脚本就是一些命令的集合。举个例子,我想实现这样的操作:1)进入到/tmp/目录;2)列出当前目录中所有的文件名;3)把所有当前的文件拷贝到/root/目录下;4)删除当前目录下所有的文件。简单的4步在shell窗口中需要你敲4次命令,按4次回车。这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次敲键盘会很麻烦。所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成。其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊的格式。

Shell脚本能帮助我们很方便的去管理服务器,因为我们可以指定一个任务计划定时去执行某一个shell脚本实现我们想要需求。这对于linux系统管理员来说是一件非常值得自豪的事情。现在的139邮箱很好用,发邮件的同时还可以发一条邮件通知的短信给用户,利用这点,我们就可以在我们的linux服务器上部署监控的shell脚本,比如网卡流量有异常了或者服务器web服务器停止了就可以发一封邮件给管理员,同时发送给管理员一个报警短信这样可以让我们及时的知道服务器出问题了。

有一个问题需要约定一下,凡是自定义的脚本建议放到/usr/local/sbin/目录下,这样做的目的是,一来可以更好的管理文档;二来以后接管你的管理员都知道自定义脚本放在哪里,方便维护。


chfn 更改用户的finger

前面内容中提到了findger,即在/etc/passwd文件中的第5个字段中所显示的信息,那么如何去设定这个信息呢?





就是chfn这个命令了修改完后,就会在/etc/passwd文件中的test的那一行第五个字段中看到相关信息了,默认是空的

yum工具

介绍完rpm工具后,还需要你掌握最常用的yum工具,这个工具比rpm工具好用多了,当然前提是你使用的linux系统是支持yum。yum最大的优势在于可以联网去下载所需要的rpm包,然后自动安装,在这个工程中如果要安装的rpm包有依赖关系,yum会帮你解决掉这些依赖关系依次安装所有rpm下面笔者介绍常用的yum 命令
1
列出所有可用的rpm “yum list “



限于篇幅,笔者只列举出来前7个包信息从上例中可以看到有”mirrors.163.com”信息出现,这是在告诉用户,它是从mirrors.163.com这里下载到的rpm包资源如果你使用的是CentOS则你可以从/etc/yum.repos.d/CentOS-Base.repo这个文件下看到相关的配置信息从上面的例子中你还可以看到最左侧是rpm包名字,中间是版本信息,最右侧是安装信息,如果安装了就显示installed,未安装则显示base或者extras,如果是该rpm包已安装但需要升级则显示updates。
2)搜索一个rpm “yum search [相关关键词]”



除了这样搜索外,笔者常用的是利用grep来过滤



相信你也会喜欢用后者吧,这样看起来简明的多
3)安装一个rpm “yum install [-y] [rpm包名]”
如果不加-y选项,则会以与用户交互的方式安装,首先是列出需要安装的rpm包信息,然后会问用户是否需要安装,输入y则安装,输入n则不安装而笔者嫌这样太麻烦,所以直接加上-y选项,这样就省略掉了问用户是否安装的那一步



4)卸载一个rpm “yum remove [-y] [rpm包名]”



卸载和安装一样,你也可以直接加上-y选项来省略掉和用户交互的步骤在这里笔者要提醒你一下,卸载某个rpm包一定要看清楚了,不要连其他重要的rpm包一起卸载了,以免影响正常的业务
4)升级一个rpm “yum update [-y] [rpm]”



以上介绍了如何使用yum搜索安装卸载以及升级一个rpm包,如果你掌握了这些那么你就已经可以解决日常工作中遇到的与rpm包相关问题了当然yum工具还有好多其他好用的命令,笔者不在列举出来,如果你感兴趣就去man一下吧

shell脚本的基本结构以及如何执行



Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已所以,以后你发现了.sh为后缀的文件那么它一定会是一个shell脚本了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,该文件使用的是bash语法如果不设置该行,那么你的shell脚本就不能被执行。’#’表示注释,在前面讲过的后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等等当然这些注释并非必须的,如果你懒的很,可以省略掉,但是笔者不建议省略因为随着你工作时间的增加,你写的shell脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本是用来干什么的以及什么时候写的所以写上注释是有必要的另外系统管理员并非你一个,如果是其他管理员查看你的脚本,他看不懂岂不是很郁闷该脚本再往下面则为要运行的命令了



Shell脚本的执行很简单,直接”sh filename “ 即可,另外你还可以这样执行



默认我们用vim编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直接使用’./filename’ 执行这个脚本了另外使用sh命令去执行一个shell脚本的时候是可以加-x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题



shell脚本中用到了’date’这个命令,它的作用就是用来打印当前系统的时间其实在shell脚本中date使用率非常高有几个选项笔者常常在shell脚本中用到:



%Y表示年,%m表示月,%d表示日期,%H表示小时,%M表示分钟,%S表示秒



注意%y%Y的区别



-d 选项也是经常要用到的,它可以打印n天前或者n天后的日期,当然也可以打印n个月/年前或者后的日期

另外星期几也是常用的



shell脚本中的变量

shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次突然你觉得路径不对想换一下,那岂不是要更改几百次?你固然可以使用批量替换的命令,但是也是很麻烦,并且脚本显得臃肿了很多变量的作用就是用来解决这个问题的



test2.sh中使用到了反引号,你是否还记得它的作用?’d’’d1’在脚本中作为变量出现,定义变量的格式为变量名=变量的值”。当在脚本中引用变量时需要加上’$’符号,这跟前面讲的在shell中自定义变量是一致的下面看看脚本执行结果吧



下面我们用shell计算两个数的和



数学计算要用’[ ]’括起来并且外头要带一个’$’。脚本结果为:



Shell脚本还可以和用户交互



这就用到了read命令了,它可以从标准输入获得变量的值,后跟变量名。”read x”表示x变量的值需要用户通过键盘输入得到脚本执行过程如下:



我们不妨加上-x选项再来看看这个执行过程:



test4.sh中还有更加简洁的方式


read -p
选项类似echo的作用执行如下:




你有没有用过这样的命令”/etc/init.d/iptables restart “ 前面的/etc/init.d/iptables 文件其实就是一个shell脚本,为什么后面可以跟一个”restart”? 这里就涉及到了shell脚本的预设变量实际上,shell脚本在执行的时候后边是可以跟变量的,而且还可以跟多个不妨笔者写一个脚本,你就会明白了


执行过程如下:



在脚本中,你会不会奇怪,哪里来的$1$2,这其实就是shell脚本的预设变量,其中$1的值就是在执行的时候输入的1,而$2的值就是执行的时候输入的$2,当然一个shell脚本的预设变量是没有限制的,这回你明白了吧另外还有一个$0,不过它代表的是脚本本身的名字不妨把脚本修改一下


执行结果想必你也猜到了吧



linux系统的任务计划

这部分内容太重要了,其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助linuxcron功能了



关于cron任务计划功能的操作都是通过crontab这个命令来完成的其中常用的选项有:
-u :指定某个用户,不加-u选项则为当前用户;
-e :制定计划任务;
-l :列出计划任务;
-r :删除计划任务



使用crontab -e 来制定计划任务,上面的例子表示在0526日(这天必须是周四)的1001分执行’ echo "ok" >/root/cron.log’这样的任务
Cron的格式是这样的,每一行代表一个任务计划,总共分成两部分,前面部分为时间,后面部分要执行的命令后面的命令不用多讲,至于前面的时间是有讲究的,这个时间共分为5段,用空格隔开(可以是多个空格),第一段表示分钟(0-59),第二段表示小时(0-23),第三段表示日(1-31),第四段表示月(1-12),第五段表示周(0-7,0或者7都可以表示为周日)。从左至右依次是:分,时,日,月,周(一定要牢记)!
crontab -e 实际上是打开了/var/spool/cron/username (如果是root则打开的是/var/spool/cron/root)这个文件使用的是vim编辑器,所以要保存的话则在命令模式下输入:wq即可但是,你千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用crontab -e来编辑查看已经设定的任务计划使用crontab -l



删除计划任务要用crontab -r



下面笔者给你出一些练习题,帮助你熟悉这个cron的应用
1. 每天凌晨120分清除/var/log/slow.log这个文件;
2. 每周日3点执行’/bin/sh /usr/local/sbin/backup.sh’
3. 每月14410分执行’/bin/sh /usr/local/sbin/backup_month.sh’
4. 每隔8小时执行’ntpdate time.windows.com’
5. 每天的1点,12点,18点执行’/bin/sh /usr/local/sbin/test.sh’
6. 每天的9点到18点执行’/bin/sh /usr/local/sbin/test2.sh’
答案:
1. 20 1 * * * echo “”>/var/log/slow.log
2. 0 30 * * 0 /bin/sh /usr/local/sbin/backup.sh
3. 10 04 14 * * /bin/sh /usr/local/sbin/backup_month.sh
4. 0 */8 * * * ntpdate time.windows.com
5. 0 1,12,18 * * /bin/sh /usr/local/sbin/test.sh
6. 0 9-18 * * * /bin/sh /usr/local/sbin/test2.sh
Cron的这部分内容并不难,你只要会了这6道练习题,你就算掌握它了这里要简单说一下,每隔8小时,就是用全部小时(0-23)去除以8,你仔细想一下结果,其实算出来应该是0,8,16三个数当遇到多个数(分钟小时周)例如第5题,则需要用逗号隔开而时间段是可以用’-‘的方式表示的等设置好了所有的计划任务后需要查看一下crond服务是否启动,如果没有启动,需要启动它



如何启动稍后会做介绍除了用户自定义的计划任务外,其实系统本身也有计划任务的



系统会安装这个配置文件中的计划去执行内定的任务