用户命令、权限、IO重定向、grep

/etc/passwd:
用户名:密码:UID:GID:注释:家目录:默认SHELL
/etc/group:
组名:密码:GID:以此组为其附加组的用户列表
/etc/shadow:
用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:
用户管理:
useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage
创建用户:
useradd [options] USERNAME
-u UID:手动给用户指定UID,默认用户ID是不可重复的,所以这里指定的UID一定是其他用户尚未使用的ID号,而且要大于等于500
-g GID(基本组):无论是添加基本组还是附加组这个组必须得事先存在,才能指定和使用的,指定用户基本组可以是组名或者GID都可以
-G GID,... (附加组):无论是添加基本组还是附加组这个组必须得事先存在,才能指定和使用的,指定用户附加组可以是组名或者GID都可以,附加组可以是多个,指定多个附加组可以使用逗号隔开
-c "COMMENT":指定注释信息,如果中间有空格可以用引号引起来
-d /path/to/directory:为用户指定家目录,如果不指定默认在/home目录下创建一个与用户名相同的目录作为用户的家目录
-s SHELL(/bin/bash):指定用户使用shell,指定shell的路径,这个shell的路径最好是出现在/etc/shells文件中的shell,这个文件指定了当前系统可用的安全shell
-m -k:如果用户家目录不存在就创建,强行给用户创建家目录,-k一般要跟-m一起使用,不使用-k也行,-k是把SKEL DIR(/etc/skel)中的所有文件,在创建家目录以后,把这些文件复制到用户的家目录中,SKEL DIR是环境设置文件,是一些bash配置文件,也有可能是其他shell配置文件,如果没有这些配置文件,在创建用户以后在登录用户的时候,这些用户的环境是不健全的不完整的,bash_logout .bash_profile .bashrc这三个文件都是bash用于用户个人的环境配置文件,所以每创建一个用户的时候,就算-m -k没指定,它也会自动将这些文件复制过去的,只不过有时候可以强行指定必须得创建家目录,而且给它复制skel文件
-M:不给用户创建家目录,就算/etc/login.defs设定用户应该有家目录,也不给他创建。
-r: 添加系统用户,系统用户是不会有家目录,最好也不让登录,可以和选项-s一块用指定shell为/sbin/nologin
环境变量:
PATH:命令路径
HISTSIZE:历史命令缓存保存多少条
SHELL:用于保存用户的默认shell
/etc/login.defs:
/etc/shells:指定了当前系统可用的安全shell
在创建用户的时候如果没有为其指定组,将会创建一个跟用户同名的基本组,而且一般UID和GID是保持一致的,如果出现特殊情况不保持一致,因为刚好跟这个用户ID号刚好相同的GID已经被其他用户占用了,可能就不会保持一致,但一般情况下对系统来说,为了系统安全通常要求用户和他的私有组ID号一般要跟用户相同,不同的话被视为特殊用户了,这种用户它的用户名和组名或UID和GID不一致会在权限的设定上会有所不同

[root@Smoke ~]# useradd -u 1000 user1(创建用户user1并指定UID为1000)
[root@Smoke ~]# tail -n 1 /etc/passwd(显示/etc/passwd文件最后一行,查看指定的user1用户UID,-n指定只显示文件最后一行,默认显示10行)
user1:x:1000:1000::/home/user1:/bin/bash
[root@Smoke ~]# useradd -g hellosa user2(添加用户user2并指定用户基本组为hellosa,由于hellosa组不存在,无法添加)
useradd: group 'hellosa' does not exist
[root@Smoke ~]# useradd -g mygroup user2(添加用户user2并指定基本组为mygroup,-g指定基本组)
[root@Smoke ~]# tail -n 1 /etc/passwd(显示/etc/passwd文件最后一行,-n指定显示1行,默认显示10行)
user2:x:1001:515::/home/user2:/bin/bash
[root@Smoke ~]# useradd -G mygroup user3(创建用户user3并添加附加组为mygroup)
[root@Smoke ~]# tail -1 /etc/passwd(显示passwd文件最后一行,-1显示文件最后一行,默认显示10行)
user3:x:1002:1002::/home/user3:/bin/bash
[root@Smoke ~]# tail /etc/group(显示/group文件最后10行)
hadoop:x:502:
nfstest:x:510:
nagios:x:511:
puppet:x:493:
student:x:512:
vistor:x:513:
tom:x:514:
mygroup:x:515:user3(以此组为附加组的用户)
user1:x:1000:
user3:x:1002:
[root@Smoke ~]# useradd -c "Tony Blare" -d /home/blare user4(创建用户user4,-c指定用户的全名为Tony Blare,-d指定用户的家目录为/home/blare)
[root@Smoke ~]# tail -1 /etc/passwd(显示passwd文件最后一行,-1显示最后一行,默认显示10行)
user4:x:1003:1003:Tony Blare(指定的注释):/home/blare(指定的家目录):/bin/bash
[root@Smoke ~]# useradd -s /sbin/nologin user5(添加用户user5,并指定使用shell为/sbnin/nologin,不让登录的shell)
[root@Smoke ~]# su - user5(切换到user5用户无法登录)
This account is currently not available.(当前用户不可用)
[root@Smoke ~]# cat /etc/shells(查看系统可用的安全shell文件)
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
[root@Smoke ~]# useradd -s /bin/tcsh user6(添加用户user6并添加用户使用shell为tcsh)
[root@Smoke ~]# su - user6(切换user6用户)
[user6@Smoke ~]$ echo $SHELL(显示当前shell为tcsh)
/bin/tcsh
[root@Smoke ~]# tail -1 /etc/passwd(线程passwd文件最后一行,-1显示最后一行,默认显示10行)
user6:x:1005:1005::/home/user6:/bin/tcsh(user6用户的默认shell是tcsh)
[root@Smoke ~]# ls -a /etc/skel/(查看/etc/skel目录文件及子目录,.bash_logout  .bash_profile  .bashrc这三个文件都是bash用于用户个人的环境配置文件,所以每创建一个用户的时候,会自动将这些文件复制过去的)
.  ..  .bash_logout  .bash_profile  .bashrc  .gnome2  .mozilla
[root@Smoke ~]# cat /etc/login.defs(查看login.defs文件,里面定义了用户和组的一些默认配置参数)
PASS_MAX_DAYS        99999
PASS_MIN_DAYS        0(密码最短使用期限)
PASS_MIN_LEN        5(最短长度)
PASS_WARN_AGE        7(警告时长)
UID_MIN                          500(用户的ID号最小)
UID_MAX                        60000(用户的ID号最大)
GID_MIN                          500(组ID号最小)
GID_MAX                        60000(组ID号最大)
CREATE_HOME        yes(默认创建用户要不要给它创建家目录)
UMASK           077(用户家目录权限)
USERGROUPS_ENAB yes(删除用户是否删除它的私有组)
ENCRYPT_METHOD SHA512(用户密码使用什么方式加密)
[root@Smoke ~]# useradd -M user7(创建user7,-M不创建家目录)
[root@Smoke ~]# su - user7(切换到user7用户,提示用户没有家目录)
su: warning: cannot change directory to /home/user7: No such file or directory(给他指了家目录,但是这个家目录并不存在)
-bash-4.1$ pwd(没有家目录无法提供环境设定,所以命令提示符这样)
/root
[root@Smoke ~]# useradd -r sysuser(添加sysuer为系统用户,-r系统用户)
[root@Smoke ~]# tail -1 /etc/passwd(查看passwd文件最后一行,-1显示最后一行,默认显示10行)
sysuser:x:495:492::/home/sysuser:/bin/bash
[root@Smoke ~]# ls /home/(sysuser系统用户不会有家目录)
blare  hadoop  nagios  nfstest  Smoke  student  tom  user1  user3  user5  user6  vistor
[root@Smoke ~]# useradd -r sysuser2 -s /sbin/nologin(添加sysuser2并不允许登录,-r系统用户,-s指定shell为/sbin/nologin)
[root@Smoke ~]# tail -n 1 /etc/passwd(查看passwd文件最后一行)
sysuser2:x:494:491::/home/sysuser2:/sbin/nologin

删除用户:
userdel:
userdel [option] USERNAME:如果在删除用户时候没有指定任何选项,删除用户以后用户的家目录是不会被删除的。
-r: 同时删除用户的家目录
id:查看用户的帐号属性信息
id USER:显示指定用户的帐号属性信息,不指定显示当前用户的帐号属性信息。
-u:只看UID
-g:只看基本组GID
-G:显示所有组GID
-n:name,显示为名称,不显示ID号
finger: 查看用户帐号信息
finger USERNAME:检索用户信息的程序,还可以检索远程主机的用户帐号信息

[root@Smoke ~]# id(查看当前用户的帐号属性信息)
uid=0(root) gid=0(root) groups=0(root)
[root@Smoke ~]# id user1(显示user1帐号相关信息)
uid=1000(user1) gid=1000(user1) groups=1000(user1)
[root@Smoke ~]# id -g user1(查看有效阻GID)
1000
[root@Smoke ~]# id -G user1(查看所有组GID)
1000
[root@Smoke ~]# id -G(查看当前用户所有组GID,包括附加组和基本组)
0
[root@Smoke ~]# id -u -n user1(显示user1用户的UID为名称,-u显示UID,-n显示为名称)
user1
[root@Smoke ~]# id -g -n user1(显示用户user1基本组的组名,-g显示用户基本组GID,-n显示为名称)
user1
[root@Smoke ~]# finger user1(检索user1用户帐号信息)
Login: user1(登录名称)                                Name:(完整名称)
Directory: /home/user1(家目录)                      Shell: /bin/bash(默认shell)
Never logged in.(什么时候曾经登录过)
No mail.(邮箱)
No Plan.(自动任务计划)
[root@Smoke ~]# userdel user1(删除用户user1)
[root@Smoke ~]# ls /home/(显示/home目录文件及子目录,user1的家目录默认没有被删除)
blare  hadoop  nagios  nfstest  Smoke  student  tom  user1  user2  user3  user5  user6  vistor
[root@Smoke ~]# userdel -r user2(删除user2用户,-r删除用户家目录)
[root@Smoke ~]# ls /home/(user2的家目录被删除)
blare  hadoop  nagios  nfstest  Smoke  student  tom  user1  user3  user5  user6  vistor

修改用户帐号属性:
usermod
-u UID:修改用户的UID
-g GID:修改用户基本组,改的组应该是事先存在的组
-a -G GID:不使用-a选项,会覆盖此前的附加组;使用-a为用户追加附加组
-c:指定注释信息
-d -m:为用户指定新的家目录,如果此前创建的用户已经登录过,而且曾经在里面创建过很多文件,就意味着它的家目录有新文件,而给它指定新的家目录,它原来的家目录下的文件,这个用户就无法访问了,要想让用户仍然能访问它此前创建的文件,通过-d指定新的家目录一并使用-m选项,会把用户家目录的文件移动到新的家目录
-s:更改用户的shell
-l:更改用户的登录名
-e:定义用户的过期时间,什么时候禁用,格式YYYY-MM-DD(年月日)
-f:指定非活动时间,密码过期了,帐号还没有禁用那段时间
-L:锁定帐号
-U:解锁帐号

[root@Smoke ~]# id user3(查看user3帐号属性信息)
uid=1002(user3) gid=1002(user3) groups=1002(user3),515(mygroup)
[root@Smoke ~]# usermod -u 2002 user3(更改user3用户的UID为2002)
[root@Smoke ~]# id user3(查看user3帐号属性信息,uid已更改为2002)
uid=2002(user3) gid=1002(user3) groups=1002(user3),515(mygroup)

chsh: 修改用户的默认shell
chfn:修改finger注释信息

[root@Smoke ~]# finger user3(查看用户user3用户帐号信息,默认shell为bash)
Login: user3                                  Name:
Directory: /home/user3                      Shell: /bin/bash
Never logged in.
No mail.
No Plan.
[root@Smoke ~]# chsh user3(更改用户user3默认shell)
Changing shell for user3.
New shell [/bin/bash]: /bin/tcsh(更改为tcsh)
Shell changed.
[root@Smoke ~]# finger user3(查看用户user3用户帐号信息,默认shell被改为tcsh)
Login: user3                                  Name:
Directory: /home/user3                      Shell: /bin/tcsh
Never logged in.
No mail.
No Plan.
[root@Smoke ~]# chfn user3(更改user3的注释信息)
Changing finger information for user3.
Name []: User3(完整名字)      
Office []: Beijing(办公室地址)
Office Phone []: 110(办公室电话)
Home Phone []: 119(家电话)
Finger information changed.
[root@Smoke ~]# finger user3(查看user3的帐号信息)
Login: user3                                  Name: User3
Directory: /home/user3                      Shell: /bin/tcsh
Office: Beijing, 110                        Home Phone: 119
Never logged in.
No mail.
No Plan.
[root@Smoke ~]# tail -n 1 /etc/passwd(显示passwd文件最后一行,-n指定显示行数,默认10行,查看用户的注释信息)
user3:x:2002:1002:User3,Beijing,110,119:/home/user3:/bin/tcsh

密码管理:
passwd [USERNAME]:普通用户只能通过passwd来改自己的密码,管理员可以更改指定用户的密码
--stdin:从标准输入读取密码,标准输入键盘
-l:锁定用户
-u:解锁用户
-n:密码最短使用期限
-x:密码最长使用期限
-w:警告时间
-i:非活动时间
-d: 删除用户密码
pwck:检查用户帐号完整性

[root@Smoke ~]# passwd user3(修改user3用户密码)
Changing password for user user3.
New password:
BAD PASSWORD: it is based on a dictionary word
Retype new password:
passwd: all authentication tokens updated successfully.
[root@Smoke ~]# echo "smoke520" | passwd --stdin user3(把smoke520字符串当作密码传递过去,--stdin通过标准输入来接收字符串用于用户密码)
Changing password for user user3.
passwd: all authentication tokens updated successfully.
[root@Smoke ~]# tail /etc/shadow(显示shadow文件组后10行)
nagios:!!:16211:0:99999:7:::
puppet:!!:16218::::::
student:$6$IwqC8.BE$8y8zjWuOWbfYxjqAEVfNmaOwVikAvXo4ww6oOGiZ.chfG/nzD.j8nEoteMN5RKc3HMDR3H2RLkSRxzgd1F1FT0:16221:0:99999:7:::
vistor:$6$wBAiXxmQ$2GR2UAQPjCDJt.c8qAY9tttLm/Rs0saFVTZssIhKd8V2U0WTHf2d/CwUm4QgnTKg5auk6UYtKroDtoQ8f7f5A0:16221:0:99999:7:::
tom:$6$cakI4EDz$ff/s0OG.dv5EOrqkYr4Mzwo8nj0bKhf1yjXM7XQsj6uNxeS3I0NRiIH7sfZeH5ymZ.IgOAh5pV5nwfr.t2/ri0:16227:0:99999:7:::
user3:$6$0WBAWiJG$OD1eupZlj3YR6EFP..O7kWt6L7p1Y1/CO7S0pnYLEO.52wzvv9p45YzCQK2Kywfzzaqg4Tq7hQpzaitnlLHI./:16228:0:99999:7:::
user4:!!:16228:0:99999:7:::
user5:!!:16228:0:99999:7:::
user6:!!:16228:0:99999:7:::
user7:!!:16228:0:99999:7:::
[root@Smoke ~]# passwd -d user3(删除user3用户密码)
Removing password for user user3.
passwd: Success
[root@Smoke ~]# tail /etc/shadow(显示shadow文件最后10行,user3密码被清空)
nagios:!!:16211:0:99999:7:::
puppet:!!:16218::::::
student:$6$IwqC8.BE$8y8zjWuOWbfYxjqAEVfNmaOwVikAvXo4ww6oOGiZ.chfG/nzD.j8nEoteMN5RKc3HMDR3H2RLkSRxzgd1F1FT0:16221:0:99999:7:::
vistor:$6$wBAiXxmQ$2GR2UAQPjCDJt.c8qAY9tttLm/Rs0saFVTZssIhKd8V2U0WTHf2d/CwUm4QgnTKg5auk6UYtKroDtoQ8f7f5A0:16221:0:99999:7:::
tom:$6$cakI4EDz$ff/s0OG.dv5EOrqkYr4Mzwo8nj0bKhf1yjXM7XQsj6uNxeS3I0NRiIH7sfZeH5ymZ.IgOAh5pV5nwfr.t2/ri0:16227:0:99999:7:::
user3::16228:0:99999:7:::
user4:!!:16228:0:99999:7:::
user5:!!:16228:0:99999:7:::
user6:!!:16228:0:99999:7:::
user7:!!:16228:0:99999:7:::
[root@Smoke ~]# pwck(检测用户帐号完整性)
user 'adm': directory '/var/adm' does not exist
user 'uucp': directory '/var/spool/uucp' does not exist
user 'gopher': directory '/var/gopher' does not exist
user 'avahi-autoipd': directory '/var/lib/avahi-autoipd' does not exist
user 'saslauth': directory '/var/empty/saslauth' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'user7': directory '/home/user7' does not exist
pwck: no changes

组管理:
创建组:groupadd
groupadd:添加组
-g GID:指定GID,不指定大于500的ID,而且是自上一个组ID加1
-r:添加为系统组
groupmod:修改组属性
-g GID:修改GID
-n GRPNAME:修改组名
groupdel:删除组
gpasswd:为组设定密码
newgrp GRPNAME <--> exit:登录一个新组,临时切换用户基本组为另外一个组

[root@Smoke ~]# groupadd -r nginx(添加nginx为系统组,-r系统组)
[root@Smoke ~]# tail -1 /etc/group(查看group文件最后一行,-1显示最后一行,默认10行)
nginx:x:490:
[root@Smoke ~]# useradd hadoop(添加用户hadoop)
[root@Smoke ~]# su - hadoop(切换到hadoop用户)
[hadoop@Smoke ~]$ cd /tmp/(切换到/tmp目录)
[hadoop@Smoke tmp]$ touch a.hadoop(创建a.hadoop文件)
[hadoop@Smoke tmp]$ ll a.hadoop(查看a.hadoop文件相信信息,属主属组是hadoop)
-rw-rw-r-- 1 hadoop hadoop 0 Jun  7 22:13 a.hadoop
[hadoop@Smoke tmp]$ id(查看用户帐号属性信息)
uid=502(hadoop) gid=502(hadoop) groups=502(hadoop)
[root@Smoke ~]# gpasswd mygroup(给mygroup组添加密码)
Changing the password for group mygroup
New Password:
Re-enter new password:
[hadoop@Smoke tmp]$ newgrp mygroup(临时切换当前用户基本组为另外一个组)
Password:
[hadoop@Smoke tmp]$ id(查看用户帐号属性信息)
uid=502(hadoop) gid=515(mygroup) groups=502(hadoop),515(mygroup)
[hadoop@Smoke tmp]$ touch b.hadoop(创建b.hadoop文件)
[hadoop@Smoke tmp]$ ll b.hadoop(查看b.hadoop文件详细信息,属主为hadoop,属组为mygroup)
-rw-r--r-- 1 hadoop mygroup 0 Jun  7 22:21 b.hadoop
[hadoop@Smoke tmp]$ exit(退出)
exit
[hadoop@Smoke tmp]$ id(查看用户帐号属性信息)
uid=502(hadoop) gid=502(hadoop) groups=502(hadoop)

练习:
1、创建一个用户mandriva,其ID号为2002,基本组为distro(组ID为3003),附加组为linux;

# groupadd -g 3003 distro
# groupadd linux
# useradd -u 2002 -g distro -G linux mandriva

2、创建一个用户fedora,其全名为Fedora Community,默认shell为tcsh;
# useradd -c "Fedora Community" -s /bin/tcsh fedora
3、修改mandriva的ID号为4004,基本组为linux,附加组为distro和fedora;
# usermod -u 4004 -g linux -G distro,fedora mandriva
4、给fedora加密码,并设定其密码最短使用期限为2天,最长为50天;
# passwd -n 2 -x 50 fedora
5、将mandriva的默认shell改为/bin/bash;
usermod -s /bin/bash mandirva
6、添加系统用户hbase,且不允许其登录系统;
# useradd -r -s /sbin/nologin hbase
chage:改密用户密码过期信息
-d: 最近一次的修改时间,YYYY-MM-DD年月日
-E: 过期时间
-I:非活动时间
-m: 最短使用期限
-M: 最长使用期限
-W: 警告时间

权限管理:
r:可读,对于文件可以使用查看命令查看文件内容,对于目录可以使用ls命令,但是不能切换到此目录,也不能使用ls -l
w:可写,对文件而言可以编辑这个文件,对于目录指的是可以在此目录创建文件
x:可执行,对文件而言可以执行,可以把它提交给内核由内核判断其运行方式,并且将其运行起来,或者说为其启动新的进程,对于目录来说可以对其使用cd或ls -l命令,来查看里面每个文件相信属性信息
三类用户:
u: 属主
g: 属组
o: 其它用户
修改属主:
chown: 改变文件属主(只有管理员可以使用此命令)
# chown USERNAME file,...
-R: 修改目录及其内部文件的属主
--reference=/path/to/somefile file,...:reference引用参考,把指定文件的信息修改为跟reference路径的文件信息一样

[root@Smoke ~]# chown hadoop /tmp/abc(改变abc文件的属主为hadoop)
[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息,属主改变为hadoop)
-rw-r--r-- 1 hadoop root 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chown hadoop /tmp/hi(更改hi目录属主为hadoop)
[root@Smoke ~]# ls -ld /tmp/hi/(查看hi目录本身属主,-l详细信息,-d目录本身,属主为hadoop)
drwxr-xr-x 2 hadoop root 4096 Jun  4 10:35 /tmp/hi/
[root@Smoke ~]# ls -l /tmp/hi/(目录中的文件属主没有改变)
total 424
-rwxr-xr-x 1 root root  1288 Jun  4 10:35 abrt-ccpp
-rwxr-xr-x 1 root root  1628 Jun  4 10:35 abrtd
-rwxr-xr-x 1 root root  1642 Jun  4 10:35 abrt-oops
-rwxr-xr-x 1 root root  1725 Jun  4 10:35 acpid
-rwxr-xr-x 1 root root  2062 Jun  4 10:35 atd
-rwxr-xr-x 1 root root  3378 Jun  4 10:35 auditd
[root@Smoke ~]# chown -R hadoop /tmp/hi/(更改hadoop目录及其内部文件属主为hadoop,-R递归)
[root@Smoke ~]# ls -l /tmp/hi/(查看hi目录下的文件,属主都改为hadoop)
total 424
-rwxr-xr-x 1 hadoop root  1288 Jun  4 10:35 abrt-ccpp
-rwxr-xr-x 1 hadoop root  1628 Jun  4 10:35 abrtd
-rwxr-xr-x 1 hadoop root  1642 Jun  4 10:35 abrt-oops
-rwxr-xr-x 1 hadoop root  1725 Jun  4 10:35 acpid
-rwxr-xr-x 1 hadoop root  2062 Jun  4 10:35 atd
-rwxr-xr-x 1 hadoop root  3378 Jun  4 10:35 auditd
[root@Smoke ~]# ls -l /tmp/(查看/tmp目录下文件及子目录)
-rw-r--r--  1 hadoop  root      884 Jun  4 10:25 abc
-rw-r--r--  1 root    root        0 Jun  8 00:20 test
[root@Smoke ~]# chown --reference=/tmp/abc /tmp/test(更改test文件的信息和abc信息一样)
-rw-r--r--  1 hadoop  root      884 Jun  4 10:25 abc
-rw-r--r--  1 hadoop  root        0 Jun  8 00:20 test

修改属组:
# chgrp GRPNAME file,...改变文件属组(只有管理员可以使用此命令)
-R:修改目录及其内部文件的属组
--reference=/path/to/somefile file,...reference引用参考,把指定文件的信息修改为跟reference路径的文件信息一样

[root@Smoke ~]# chgrp mygroup /tmp/abc(更改abc的属组为mygroup)
[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息,属组改为mygroup)
-rw-r--r-- 1 hadoop mygroup 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chgrp -R mygroup /tmp/hi/(更改hi目录及其内部文件的属组为mygroup,-R递归)
[root@Smoke ~]# ls -ld /tmp/hi/(查看hi目录本身信息,-l详细信息,-d目录本身)
drwxr-xr-x 2 hadoop mygroup 4096 Jun  4 10:35 /tmp/hi/
[root@Smoke ~]# ls -l /tmp/hi/(查看hi目录下文件及子目录详细信息,属组已经改为mygroup,-l详细信息)
total 424
-rwxr-xr-x 1 hadoop mygroup  1288 Jun  4 10:35 abrt-ccpp
-rwxr-xr-x 1 hadoop mygroup  1628 Jun  4 10:35 abrtd
-rwxr-xr-x 1 hadoop mygroup  1642 Jun  4 10:35 abrt-oops
-rwxr-xr-x 1 hadoop mygroup  1725 Jun  4 10:35 acpid
-rwxr-xr-x 1 hadoop mygroup  2062 Jun  4 10:35 atd
-rwxr-xr-x 1 hadoop mygroup  3378 Jun  4 10:35 auditd
-rwxr-xr-x 1 hadoop mygroup  4043 Jun  4 10:35 autofs

同时更改属主属组:
chown USERNAME:GRPNAME file,...
chown USERNAME.GRPNAME file,...

扫描二维码关注公众号,回复: 6933930 查看本文章
[root@Smoke ~]# chown root:root /tmp/abc(更改abc文件的属主属组为abc)
[root@Smoke ~]# ll /tmp/abc
-rw-r--r-- 1 root root 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chown :hadoop /tmp/abc(更改abc文件属组为hadoop)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息,属组被改为hadoop)
-rw-r--r-- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# ll /tmp/test(查看test文件详细信息)
-rw-r--r-- 1 hadoop root 0 Jun  8 00:20 /tmp/test
[root@Smoke ~]# chown --reference=/tmp/abc /tmp/test(将test文件的信息更改为跟abc一样)
[root@Smoke ~]# ll /tmp/test(查看test文件详细信息,test文件属主属组都被更改)
-rw-r--r-- 1 root hadoop 0 Jun  8 00:20 /tmp/test

修改文件权限:
chmod: 修改文件的权限
修改三类用户的权限:
chmod MODE file,...
-R:修改目录及其内部文件的属组,递归修改
--reference=/path/to/somefile file,...:引用参考,把指定文件的信息修改为跟reference路径的文件信息一样
rwxr-x---:八进制表示权限为750,如果写成75表示075,如果写成5表示005。
修改某类用户或某些类用户权限:
u,g,o,a(所有)
chmod 用户类别=MODE file,...
修改某类用户的某位或某些位权限:
u,g,o,a
chmod 用户类别+|-MODE file,...

[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息)
-rw-r--r-- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod 750 /tmp/abc(更改abc权限为750)
[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息)
-rwxr-x--- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod 75 /tmp/abc(更改abc权限为075)
[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息)
----rwxr-x 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod 5 /tmp/abc(更改abc权限为005)
[root@Smoke ~]# ls -l /tmp/abc(查看abc文件详细信息)
-------r-x 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# ll /tmp/(查看/tmp目录下文件及子目录)
-------r-x  1 root    hadoop    884 Jun  4 10:25 abc
-rw-r--r--  1 root    hadoop      0 Jun  8 00:20 test
[root@Smoke ~]# chmod --reference=/tmp/test /tmp/abc(将abc文件的权限改为跟test一样)
[root@Smoke ~]# ll /tmp/(查看/tmp目录及子目录详细信息)
-rw-r--r--  1 root    hadoop      0 Jun  8 00:20 test
-rw-r--r--  1 root    hadoop    884 Jun  4 10:25 abc
[root@Smoke ~]# chmod u=rwx /tmp/abc(更改abc文件属主为读写执行)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxr--r-- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod g=rw- /tmp/abc(更改abc属组权限为读写,-可以不写)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxrw-r-- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod o=rx /tmp/abc(更改其他用户为读执行)
[root@Smoke ~]# chmod g=r,o=r /tmp/abc(更改属组为只读,其他为只读)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxr--r-- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod go=rw /tmp/abc(将属组和其他都改为读写)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxrw-rw- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod g=rx,o= /tmp/abc(更改属组为rx,其他没有任何权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxr-x--- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod u-x /tmp/abc(去掉属主的执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rw-r-x--- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod u+x,g-x /tmp/abc(属主添加执行权限,属组去掉执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxr----- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod u-x /tmp/abc(去掉属主的执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rw-r----- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod a+x /tmp/abc(所有都加上执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rwxr-x--x 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod -x /tmp/abc(所有都减掉执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-rw-r----- 1 root hadoop 884 Jun  4 10:25 /tmp/abc
[root@Smoke ~]# chmod u-wx /tmp/abc(属主去掉写和执行权限)
[root@Smoke ~]# ll /tmp/abc(查看abc文件详细信息)
-r--r----- 1 root hadoop 884 Jun  4 10:25 /tmp/abc

练习:
1、新建一个没有家目录的用户openstack;
# useradd -M openstack
2、复制/etc/skel为/home/openstack;
# cp -r /etc/skel /home/openstack
3、改变/home/openstack及其内部文件的属主属组均为openstack;
# chown -R openstack:openstack /home/openstack
4、/home/openstack及其内部的文件,属组和其它用户没有任何访问权限
# chmod -R go= /home/openstack

[root@Smoke ~]# useradd -M openstack(添加openstack,-M不指定用户家目录)
[root@Smoke ~]# finger openstack(查看openstack注释信息)
Login: openstack                              Name:
Directory: /home/openstack                  Shell: /bin/bash
Never logged in.
No mail.
No Plan.
[root@Smoke ~]# ls /home/(查看openstack是否有家目录)
blare  hadoop  nagios  nfstest  Smoke  student  tom  user1  user3  user5  user6  user8  vistor
[root@Smoke ~]# id openstack(查看openstack用户信息)
uid=2004(openstack) gid=2004(openstack) groups=2004(openstack)
[root@Smoke ~]# cp -r /etc/skel/ /home/openstack(拷贝skel目录及子目录文件到/home并重命名为openstack,-r递归)
[root@Smoke ~]# ls -ld /home/openstack/(查看openstack目录权限,-l详细信息,-d目录本身)
drwxr-xr-x 4 root root 4096 Jun  8 01:42 /home/openstack/
[root@Smoke ~]# ls -la /home/openstack/(查看openstack目录下文件及子目录向信息信息,-l详细信息,-a所有文件,包含隐藏文件)
total 28
drwxr-xr-x   4 root root 4096 Jun  8 01:42 .
drwxr-xr-x. 16 root root 4096 Jun  8 01:42 ..
-rw-r--r--   1 root root   18 Jun  8 01:42 .bash_logout
-rw-r--r--   1 root root  176 Jun  8 01:42 .bash_profile
-rw-r--r--   1 root root  124 Jun  8 01:42 .bashrc
drwxr-xr-x   2 root root 4096 Jun  8 01:42 .gnome2
drwxr-xr-x   4 root root 4096 Jun  8 01:42 .mozilla
[root@Smoke ~]# chown -R openstack.openstack /home/openstack/(更改openstack目录及子目录文件属主属组为openstack,-R递归)
[root@Smoke ~]# ls -ld /home/openstack/(查看openstack目录本身,-l详细信息,-d目录本身)
drwxr-xr-x 4 openstack openstack 4096 Jun  8 01:42 /home/openstack/
[root@Smoke ~]# ls -la /home/openstack/(查看openstack目录下文件及子目录详细信息,-l详细信息,-a所有文件)
total 28
drwxr-xr-x   4 openstack openstack 4096 Jun  8 01:42 .
drwxr-xr-x. 16 root      root      4096 Jun  8 01:42 ..
-rw-r--r--   1 openstack openstack   18 Jun  8 01:42 .bash_logout
-rw-r--r--   1 openstack openstack  176 Jun  8 01:42 .bash_profile
-rw-r--r--   1 openstack openstack  124 Jun  8 01:42 .bashrc
drwxr-xr-x   2 openstack openstack 4096 Jun  8 01:42 .gnome2
drwxr-xr-x   4 openstack openstack 4096 Jun  8 01:42 .mozilla
[root@Smoke ~]# chmod -R go= /home/openstack/(更改openstack目录及子目录文件,属组及其他权限为没有)
[root@Smoke ~]# ls -ld /home/openstack/(查看openstack目录信息,-l详细信息,-d目录本身)
drwx------ 4 openstack openstack 4096 Jun  8 01:42 /home/openstack/
[root@Smoke ~]# ls -la /home/openstack/(查看openstack目录及子目录文件详细信息,-l详细信息,-a所有文件)
total 28
drwx------   4 openstack openstack 4096 Jun  8 01:42 .
drwxr-xr-x. 16 root      root      4096 Jun  8 01:42 ..
-rw-------   1 openstack openstack   18 Jun  8 01:42 .bash_logout
-rw-------   1 openstack openstack  176 Jun  8 01:42 .bash_profile
-rw-------   1 openstack openstack  124 Jun  8 01:42 .bashrc
drwx------   2 openstack openstack 4096 Jun  8 01:42 .gnome2
drwx------   4 openstack openstack 4096 Jun  8 01:42 .mozilla
[root@Smoke ~]# su - openstack(切换到oepnstack,用户正常登录并有了家目录)
[openstack@Smoke ~]$
[root@Smoke ~]# ls -l /etc/shadow(shadown文件权限为000,redhat5.x为400)
---------- 1 root root 1907 Jun  8 01:40 /etc/shadow

注意:shadown文件权限为000,redhat5.x为400,密码信息比较敏感不允许其他任何人查看,但是使用passwd修改的时候更改的密码要保存到这个文件里面,不是没有写权限,其实无论怎么设定权限对管理员是无效的,就算改为不能读不能写,管理员也可以使用chmod改为读写,普通用户使用passwd也可以更改自己的密码,普通用户修改的密码依然会保存到这个文件里面,但是普通用户没有任何权限,普通用户来访问passwd命令,命令启动起来就是个进程,这个进程代表身份就是普通用户身份,而普通用户来访问这个文件时候即不是属主又不是属组,它还不是管理员,而只能是其他用户,而其他用户没有任何权限,如何将密码保存到此文件中?

[root@Smoke ~]# ls -l $(which passwd)(使用命令替换将which passwd执行结果输入给ls命令执行)
-rwsr-xr-x. 1 root root 30768 Feb 22  2012 /usr/bin/passwd
注意:passwd命令权限很独特,属主的权限是个s,就是这个s的存在才使得普通用户也照样也能够改密码。
[root@Smoke ~]# nano /etc/shadow(编辑shadow文件)
hello
[root@Smoke ~]# tail /etc/shadow(查看编辑的内容)
user3::16228:0:99999:7:::
user4:!!:16228:0:99999:7:::
user5:!!:16228:0:99999:7:::
user6:!!:16228:0:99999:7:::
user7:!!:16228:0:99999:7:::
sysuser:!!:16228::::::
sysuser2:!!:16228::::::
user8:!!:16228:0:99999:7:::
openstack:!!:16228:0:99999:7:::
hello

结果:所以管理员可以正常编辑shadow文件。
手动添加用户:
手动添加用户hive, 基本组为hive (5000),附加组为mygroup

[root@Smoke ~]# nano /etc/group(编辑组文件)
mygroup:x:515:user3,user6,hive
hive:x:5000:
[root@Smoke ~]# nano /etc/passwd(编辑passwd文件)
hive:x:5000:5000:Hive:/home/hive:/bin/bash
[root@Smoke ~]# date +%s
1402164923
[root@Smoke ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1402164923/86400
16228
quit
[root@Smoke ~]# nano /etc/shadow
hive:!!:16228:0:99999:7:::
[root@Smoke ~]# cp -r /etc/skel/ /home/hive
[root@Smoke ~]# chown -R hive.hive /home/hive/
[root@Smoke ~]# chmod -R go= /home/hive/
[root@Smoke ~]# ls -ld /home/hive/
drwx------ 4 hive hive 4096 Jun  8 02:22 /home/hive/
[root@Smoke ~]# ls -la /home/hive/
total 28
drwx------   4 hive hive 4096 Jun  8 02:22 .
drwxr-xr-x. 17 root root 4096 Jun  8 02:22 ..
-rw-------   1 hive hive   18 Jun  8 02:22 .bash_logout
-rw-------   1 hive hive  176 Jun  8 02:22 .bash_profile
-rw-------   1 hive hive  124 Jun  8 02:22 .bashrc
drwx------   2 hive hive 4096 Jun  8 02:22 .gnome2
drwx------   4 hive hive 4096 Jun  8 02:22 .mozilla
[root@Smoke ~]# su - hive(切换到hive用户)
[hive@Smoke ~]$ id(查看当前用户帐号信息)
uid=5000(hive) gid=5000(hive) groups=5000(hive),515(mygroup)
由于/etc/shadow文件中hive用户的帐号是锁定!!,没有设置密码,无法正常登录,所以需要生成密码
[hive@Smoke ~]$ openssl passwd(opensll生成密码,输入两次密码,生成字符串)
Password:
Verifying - Password:
ckc6yx6DwmL6.

但是这里没有往密码中加盐,因为/etc/shadow文件中的用户密码都加入调味盐,让其不同相同密码用户不会导致字符串一样。

[hive@Smoke ~]$ whatis passwd
passwd               (1)  - update user's authentication tokens
passwd               (5)  - password file
passwd [sslpasswd]   (1ssl)  - compute password hashes
[hive@Smoke ~]$ man sslpasswd
passwd - compute password hashes
-1:指定加密算法,1是md5。
-salt string:指定盐,杂质。
[hive@Smoke ~]$ openssl passwd -1 -salt '12345678'(openssl生成密码串,-1代表md5,-salt加入8位字符)
Password:
$1$12345678$1X.khkQVJbTq3.0kwYfM40
[root@Smoke ~]# nano /etc/shadow
hive:$1$12345678$1X.khkQVJbTq3.0kwYfM40:16228:0:99999:7:::

测试:通过在Xshell新建新的会话,通过帐号hive密码smoke520登录系统,能够正常登录,手动添加用户测试正常。
bc使用方法:

[root@Smoke ~]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
1*2
2
3/5
0(注意:没有小数位,没有保留精度,只是是圆整的,圆整就是把小数东西直接去了)
scale=2(指定保留两位精度)
3/5
.60
quit
默认权限:

管理员:
文件默认权限:644
目录默认权限:755
普通用户:
文件默认权限:664
目录默认权限:775
linux内在法则文件默认都没有执行权限,
umask:遮罩码,用户创建文件或目录用到的遮罩码

# umask(查看当前用户遮罩码)
# umask 022(设定遮罩码)

666-umask:创建文件使用666减去遮罩码
777-umask:创建目录使用777减去遮罩码
管理员遮罩码是022
创建文件权限为:644
创建目录权限为:755
普通用户遮罩码是002创建文件权限为:664
创建目录权限为:775
普通用户umask: 023
文件:666-023=643 X(文件有执行权限)
目录:777-023=754
注意:文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限加1;

[root@Smoke ~]# cd /tmp/(切换到/tmp目录)
[root@Smoke tmp]# touch hellosa(创建hellosa文件)
[root@Smoke tmp]# ls -l hellosa(查看hellosa文件详细信息)
-rw-r--r-- 1 root root 0 Jun  8 16:26 hellosa[root@Smoke tmp]# mkdir testdir(创建testdir目录)
[root@Smoke tmp]# ls -ld testdir/(查看testdir目录详细信息,-l详细信息,-d目录本身)
drwxr-xr-x 2 root root 4096 Jun  8 16:28 testdir/

普通用户:

[hive@Smoke ~]$ touch test
[hive@Smoke ~]$ mkdir testdir
[hive@Smoke ~]$ ls -l
total 4
-rw-rw-r-- 1 hive hive    0 Jun  8 16:30 test
drwxrwxr-x 2 hive hive 4096 Jun  8 16:30 testdir
[root@Smoke ~]# umask(管理员的遮罩码是022)
0022
[hive@Smoke ~]$ umask(普通用户的遮罩码是002)
0002
[hive@Smoke ~]$ umask 022(设置普通用户hive的遮罩码为022)
[hive@Smoke ~]$ umask(查看用户遮罩码)
0022
[hive@Smoke ~]$ touch hello(创建hello文件)
[hive@Smoke ~]$ mkdir hellosa(创建目录hellosa)
[hive@Smoke ~]$ ll(查看创建的hello文件全为644,hellosa目录为755)
total 8
-rw-r--r-- 1 hive hive    0 Jun  8 16:40 hello
drwxr-xr-x 2 hive hive 4096 Jun  8 16:40 hellosa
-rw-rw-r-- 1 hive hive    0 Jun  8 16:30 test
drwxrwxr-x 2 hive hive 4096 Jun  8 16:30 testdir
[hive@Smoke ~]$ rm -rf ./*(删除当前目录下所有文件,-r删除目录及目录下文件,-f强制删除)
[hive@Smoke ~]$ touch abc(创建文件abc)
[hive@Smoke ~]$ mkdir dir(创建dir目录)
[hive@Smoke ~]$ ll(查看当前目录文件详细信息,abc权限为644,目录权限为754,文件和算的权限不一样)
total 4
-rw-r--r-- 1 hive hive    0 Jun  8 16:46 abc
drwxr-xr-- 2 hive hive 4096 Jun  8 16:46 dir
[hive@Smoke ~]$ umask 027(设置遮罩码为027)
[hive@Smoke ~]$ umask(查看遮罩码)
0027
[hive@Smoke ~]$ touch hello(创建文件hello)
[hive@Smoke ~]$ mkdir hellodir(创建hellodir目录)
[hive@Smoke ~]$ ll(查看当前目录文件子目录详细信息, hello权限为640,hellodir权限为750)
total 8
-rw-r--r-- 1 hive hive    0 Jun  8 16:46 abc
drwxr-xr-- 2 hive hive 4096 Jun  8 16:46 dir
-rw-r----- 1 hive hive    0 Jun  8 16:52 hello
drwxr-x--- 2 hive hive 4096 Jun  8 16:53 hellodir
[hive@Smoke ~]$ logout

重新使用终端通过用户名加密码登录hive用户

[hive@Smoke ~]$ umask(查看遮罩码又变为002)
0002

站在用户登录的角度来说,SHELL的类型:
登录式shell:
正常通常某终端登录
su - USERNAME
su -l USERNAME
非登录式shell:
su USERNAME
图形终端下打开命令窗口
自动执行的shell脚本
bash的配置文件:
全局配置
/etc/profile, /etc/profile.d/.sh, /etc/bashrc
个人配置
~/.bash_profile, ~/.bashrc
profile类的文件:
设定环境变量
运行命令或脚本
bashrc类的文件:
设定本地变量
定义命令别名
设置环境变量想对所有用户生效放到/etc/profile或在/etc/profile.d/下建立一个以.sh结尾的文件,在里面定义,如果只想对当前用户生效编辑自己家目录下的~/.bash_profile文件,所以放到个人配置里面只对当前用户生效,放到全局对所有用户都生效,如果两个文件里面都有,一个环境变量在全局也定义了,在个人配置也定义了,而且结果还不一样,以个人配置的为准,作用范围越小的越是最终生效的。
登录式shell,配置文件及次序:
/etc/profile --> /etc/profile.d/
.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非登录式shell:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
profile: 定义环境变量、运行程序或脚本
bashrc:定义本地变量、命令别名

[hive@Smoke ~]$ alias cls=clear(定义clear命名别名为cls)
[hive@Smoke ~]$ cls(可以使用)
[hive@Smoke ~]$ logout
重新使用终端通过用户名加密码登录hive用户
[hive@Smoke ~]$ cls(定义的cls别名不能使用)
-bash: cls: command not found

总结:不能生效,不能跨shell生效,要想生效编辑~/.bashrc文件[hive@Smoke ~]$ nano .bashrc(编辑个人配置文件bashrc添加需要定义的命令别名)

# .bashrc
# Source global definitions

if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
alias cls='clear'

[hive@Smoke ~]$ cls(不能用)
-bash: cls: command not found.
原因:shell读取配置文件在执行那一刻读取,现在已经执行好了,因此现在编辑也无效,只能对下次登录有效
[hive@Smoke ~]$ logout(退出)

重新使用终端通过用户名加密码登录hive用户

[hive@Smoke ~]$ cls(可以使用)
[hive@Smoke ~]$ nano .bash_profile(编辑bash_profile文件,定义命令脚本)
echo "Hello, hive. Welcome to our system. It is `date`."
[hive@Smoke ~]$ logout(退出)

重新使用终端通过用户名加密码登录hive用户

Connecting to 172.16.100.1:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Sun Jun  8 17:33:01 2014 from 172.16.100.254
Hello, hive. Welcome to our system. It is Sun Jun  8 17:41:31 CST 2014.

定义umask对当前用户生效:

[hive@Smoke ~]$ nano .bash_profile
umask 027
[hive@Smoke ~]$ logout(退出)

重新使用终端通过用户名加密码登录hive用户

[hive@Smoke ~]$ umask(查看遮罩码为027,永久有效)
0027

为什么默认是002:

[hive@Smoke ~]$ cat /etc/bashrc
   if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then(解释:如果用户UDI大于199并且GID和UID一样,那么用户的umask是002)
      umask 002
   else(否则umask为022)
      umask 022
   fi
[hive@Smoke ~]$ id(查看用户帐号信息)
uid=5000(hive) gid=5000(hive) groups=5000(hive),515(mygroup)

结果:hive用户的uid>199,并且uid和gid一样,所以默认umask是002
bash:脚本解释器

计算机五大部件:
运算器、控制器: CPU
存储器:RAM
输入设备/输出设备
程序:是由指令和数据组成
控制器:读取指令,并在指令控制下去读取要进行的运算包括数据和要执行的计算,控制器会控制告诉我们运算器到那去取数据,把数据取过来以后,运算器开始做运算,运算的结果由控制器的控制下输出到存储器当中
运算器:整个运算过程由运算器完成
存储器:
地址总线:内存寻址
数据总线:传输数据
控制总结:控制指令
寄存器:CPU暂时存储器
I/O: 硬盘,键盘/鼠标
程序
INPUT设备:输入设备
OUTPUT设备:输出设备
系统设定
默认输出设备:标准输出,STDOUT, 1
默认输入设备:标准输入, STDIN, 0
标准错误输出:STDERR, 2
标准输入:键盘
标准输出和错误输出:显示器
I/O重定向:本来输入设备是键盘,但是改成了别的,就是输入设备重定向,输出也可以重定向,错误输出也能重定向,改变了输入来源或输出来源的
Linux:

: 覆盖输出,原有的内容会被覆盖

:追加输出,保留此前文件原有内容
set -C: 禁止对已经存在文件使用覆盖重定向;
强制覆盖输出,则使用 >|
set +C: 关闭上述功能
2>: 重定向错误输出
2>>: 追加方式
标准输出和标准错误输出属于不同的数据流
ls /var/ > /tmp/var3.out 2> /tmp/err.out:将ls执行结果标准输出重定向到var3.out,标准错误输出重定向到err.out
&>: 重定向标准输出或错误输出至同一个文件
<:输入重定向
<<:Here Document在此处生成文档
cat << END/EOF(END OF FILE):END/EOF结束符
cat >> /tmp/myfile.txt << EOF:将cat的内容追加输出到myfile.txt,<< EOF生成文档
管道:前一个命令的输出,作为后一个命令的输入
命令1 | 命令2 | 命令3 | ...
tee:从标准输入读取数据,并且发送至标准输出和文件,可以实现将一个数据即保存到文件中又能够输出到显示器


[hive@Smoke ~]$ ls /var/(查看/var目录下的文件及子目录)
account  crash  db     ftp      games  lib    lock  mail  opt       run    tmp  yp
cache    cvs    empty  ftproot  gdm    local  log   nis   preserve  spool  www
[hive@Smoke ~]$ ls /var/ &gt; /tmp/var.out(将ls执行结果输出重定向到var.out文件)
[hive@Smoke ~]$ cat /tmp/var.out(查看var.out)
account
cache
crash
cvs
db
empty
ftp
ftproot
games
gdm
lib
local
lock
log
mail
nis
opt
preserve
run
spool
tmp
www
yp
[hive@Smoke ~]$ cat /etc/fstab
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 /                       ext4    defaults        1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot                   ext4    defaults        1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
[hive@Smoke ~]$ cat /etc/fstab &gt; /tmp/var.out(将cat执行结果输出到var.out文件)
[hive@Smoke ~]$ cat /tmp/var.out(查看var.out)

#

/etc/fstab

Created by anaconda on Mon Apr 14 08:18:01 2014

#

Accessible filesystems, by reference, are maintained under '/dev/disk'

See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 / ext4 defaults 1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot ext4 defaults 1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[hive@Smoke ~]$ ls /var >> /tmp/var.out(将ls执行结果追加到var.out文件)
[hive@Smoke ~]$ cat /tmp/var.out(查看var.out文件)
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 / ext4 defaults 1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot ext4 defaults 1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
account
cache
crash
cvs
db
empty
ftp
ftproot
games
gdm
lib
local
lock
log
mail
nis
opt
preserve
run
spool
tmp
www
yp
[hive@Smoke ~]$ set -C(打开禁止对已经存在文件使用覆盖重定向)
[hive@Smoke ~]$ ls /usr > /tmp/var.out(将ls执行结果覆盖输出到var.out)
-bash: /tmp/var.out: cannot overwrite existing file(不允许覆盖已经存在的文件)
[hive@Smoke ~]$ set +C(关闭进制对已经存在文件使用覆盖重定向)
[hive@Smoke ~]$ ls /usr/ > /tmp/var.out(将ls执行结果覆盖输出到var.out)
[hive@Smoke ~]$ set -C(打开禁止对已经存在文件使用覆盖重定向)
[hive@Smoke ~]$ ls /usr/ > /tmp/var.out(将ls执行结果覆盖输出到var.out)
-bash: /tmp/var.out: cannot overwrite existing file(不允许覆盖已经存在的文件)
[hive@Smoke ~]$ ls /usr/ >| /tmp/var.out(将ls执行结果强制覆盖输出到var.out)
[hive@Smoke ~]$ set +C(关闭进制对已经存在文件使用覆盖重定向)
[hive@Smoke ~]$ ls /varr > /tmp/var2.out(将ls执行结果输出到var2.out,var写错成varr,无法标准输出重定向)
ls: cannot access /varr: No such file or directory
[hive@Smoke ~]$ ls /varr 2> /tmp/var2.out(将ls错误执行结果输出到var2.out)
[hive@Smoke ~]$ cat /tmp/var2.out(查看var2.out文件)
ls: cannot access /varr: No such file or directory
[hive@Smoke ~]$ ls /varr > /tmp/var3.out 2> /tmp/err.out(将ls执行结果标准输出重定向到var3.out,标准错误输出重定向到err.out)
[hive@Smoke ~]$ cat /tmp/err.out(查看err.out文件)
ls: cannot access /varr: No such file or directory
[hive@Smoke ~]$ ls /var/ > /tmp/var3.out 2> /tmp/err.out(将ls执行结果标准输出重定向到var3.out,标准错误输出重定向到err.out)
[hive@Smoke ~]$ cat /tmp/var3.out(查看var3.out文件)
account
cache
crash
cvs
db
empty
ftp
ftproot
games
gdm
lib
local
lock
log
mail
nis
opt
preserve
run
spool
tmp
www
yp
[hive@Smoke ~]$ ls /var6 &> /tmp/var5.out(将标准输出和错误标准输出都重定向到var5.out)
[hive@Smoke ~]$ cat /tmp/var5.out(查看var5.out文件)
ls: cannot access /var6: No such file or directory
[hive@Smoke ~]$ ls /var &> /tmp/var5.out(将标准输出和错误标准输出都重定向到var5.out)
[hive@Smoke ~]$ cat /tmp/var5.out(查看var5.out文件)
account
cache
crash
cvs
db
empty
ftp
ftproot
games
gdm
lib
local
lock
log
mail
nis
opt
preserve
run
spool
tmp
www
yp
[hive@Smoke ~]$ cat < /etc/fstab
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 / ext4 defaults 1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot ext4 defaults 1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[hive@Smoke ~]$ tr 'a-z' 'A-Z' /etc/fstab(tr不能跟文件名,报错误)
tr: extra operand /etc/fstab'<br/>Trytr --help' for more information.
[hive@Smoke ~]$ tr 'a-z' 'A-Z' < /etc/fstab(使用输入重定向将fstab内容输入让tr将小写换为大写)
UUID=9F66AADB-2E9A-49D5-9748-CECEEA2D41F0 / EXT4 DEFAULTS 1 1
UUID=67344573-C4C0-4B5F-BEAE-E6837A9712F7 /BOOT EXT4 DEFAULTS 1 2
UUID=FB6D8EA4-ED81-4024-BCBC-7BC44F431282 SWAP SWAP DEFAULTS 0 0
TMPFS /DEV/SHM TMPFS DEFAULTS 0 0
DEVPTS /DEV/PTS DEVPTS GID=5,MODE=620 0 0
SYSFS /SYS SYSFS DEFAULTS 0 0
PROC /PROC PROC DEFAULTS 0 0
[hive@Smoke ~]$ cat << END(在此处生成文档,END文件结束标记)

The first line.
The second line.
END
The first line.
The second line.
[root@Smoke ~]# cat >> /tmp/myfile.txt << EOF(将cat的内容追加输出到myfile.txt,<< EOF生成文档)
The first line.
The second line.
EOF
[root@Smoke ~]# cat /tmp/myfile.txt(查看myfile.txt文件)
The first line.
The second line.
[root@Smoke ~]# echo "hello,world." | tr 'a-z' 'A-Z'(将echo内容通过管道输出给tr将小写换成大写)
HELLO,WORLD.
[root@Smoke ~]# echo "redhat" | passwd --stdin hive(将echo内容通过管道送给passwd更改hive用户密码,--从标准输入读取密码,标准输入键盘)
Changing password for user hive.
passwd: all authentication tokens updated successfully.
[root@Smoke ~]# cat /etc/passwd | sort(将cat显示passwd文件内容,通过管道输入给sort进行排序,默认升序)
abrt:x:173:173::/etc/abrt:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@Smoke ~]# cut -d: -f1 /etc/passwd | sort(对文件passwd通过冒号进行分段并取出第一段,通过管道输入给sort进行排序,默认升序)
abrt
adm
apache
avahi-autoipd
bin
daemon
dbus
ftp
games
gdm
[root@Smoke ~]# cut -d: -f3 /etc/passwd | sort(对文件passwd通过冒号进行分段并取出第三段,通过管道输入给sort进行排序,默认升序)
0
1
10
1003
1004
1005
1006
11
[root@Smoke ~]# cut -d: -f3 /etc/passwd | sort -n对文件passwd通过冒号进行分段并取出第三段,通过管道输入给sort进行排序,-n按字符大小排序,默认升序)
0
1
2
3
4
5
6
7
[root@Smoke ~]# cut -d: -f1 /etc/passwd | sort | tr 'a-z' 'A-Z'(对文件passwd通过冒号进行分段并取出第一段,通过管道输入给sort进行排序,默认升序,并将排序结果输入给tr将所有小写字母更好成大写)
ABRT
ADM
APACHE
AVAHI-AUTOIPD
BIN
DAEMON
DBUS
FTP
GAMES
GDM
GOPHER
[root@Smoke ~]# ls /var | tr 'a-z' 'A-Z'(将ls命令的输出通过管道输入给tr将文件名小写全更换为大写)
ACCOUNT
CACHE
CRASH
CVS
DB
EMPTY
FTP
FTPROOT
GAMES
GDM
LIB
LOCAL
LOCK
LOG
MAIL
NIS
OPT
PRESERVE
RUN
SPOOL
TMP
WWW
YP
[root@Smoke ~]# echo "Hello,World." | tee /tmp/hello.out(将echo命令的输出通过管道输入给tee,将内容保存至hello.out文件,并显示出来)
Hello,World.
[root@Smoke ~]# cat /tmp/hello.out(查看hello.out文件)
Hello,World.
[root@Smoke ~]# wc -l /etc/passwd | cut -d' ' -f1(只显示passwd文件有多少行,不显示目录,将wc命令的输出通过管道输入给cut,通过空白进行分段,并显示第一行)
53

练习:
1、统计/usr/bin/目录下的文件个数;
`# ls /usr/bin | wc -l`
2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;
`# cut -d: -f7 /etc/passwd | sort -u`
3、思考:如何显示/var/log目录下每个文件的内容类型?
file /var/log/*
4、取出/etc/inittab文件的第6行;
`# head -6 /etc/inittab | tail -1`
5、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中;
`# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users`
6、显示/etc目录下所有以pa开头的文件,并统计其个数;
`# ls -d /etc/pa* | wc -l`
7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;
`# echo "alias cls=clear" &gt;&gt; ~/.bashrc`
1、

[root@Smoke ~]# ls /usr/bin/ | wc -l(显示bin目录下有多少文件子目录,将ls命令执行结果通过管道输入给wc统计,-l行数)
1642
[root@Smoke ~]# ls -l /usr/bin/ | wc -l(显示bin目录下有多少文件子目录,将ls命令执行结果通过管道输入给wc统计,-l行数)
1643
[root@Smoke ~]# ls -l /usr/bin/ | head -n 1(将ls命令执行结果通过管道输入给head只显示第一行)
total 214204(文件总体大小)

2、

[root@Smoke ~]# cut -d: -f7 /etc/passwd | sort -u
/bin/bash
/bin/false
/bin/sync
/bin/tcsh
/sbin/halt
/sbin/nologin
/sbin/shutdown

3、

[root@Smoke ~]# file /var/log/*
[root@Smoke ~]# cd /var/log/
[root@Smoke log]# file ls /var/log/

4、

[root@Smoke ~]# head -6 /etc/inittab | tail -1
#

5、

[root@Smoke ~]# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users
user4:/bin/bash

6、

[root@Smoke ~]# ls -d /etc/pa* | wc -l
5

7、

[root@Smoke ~]# echo "alias cls=clear" >> ~/.bashrc
[root@Smoke ~]# printf "alias cls=clear" >> ~/.bashrc

grep, egrep, fgrep
grep: 根据模式搜索文本,并将符合模式的文本行显示出来。
Pattern: 模式,文本字符和正则表达式的元字符组合而成匹配条件
grep [options] PATTERN [FILE...]
-i,--ignore-case:忽略大小写
--color[=WHEN],--colour[=WHEN]:显示颜色
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串
-E: 使用扩展正则表达式
-A #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行后的多少行,#代表数值
-B #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行前的多少行,#代表数值
-C #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行前行后的多少行,#代表数值
文件名通配符:
*: 任意长度的任意字符
?:任意单个字符
[]:匹配指定范围内的任意单个字符

正则表达式:部分匹配,显示的是整行
正则表达式:REGular EXPression, REGEXP
元字符:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
^:匹配指定范围外的任意单个字符
[abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
字符集合:[:digit:]数字, [:lower:]小写字母, [:upper:]大写字母, [:punct:]标点符号, [:space:]空白字符, [:alpha:]所有字母, [:alnum:]所有数字字母
匹配次数(贪婪模式):
: 匹配其前面的字符任意次
a, b, ab, aab, acb, adb, amnb
a
b, a?b
a.b
.
: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次
{m,n}:匹配其前面的字符至少m次,至多n次
{1,}:匹配其面前的字符至少1次
{0,3}:匹配其前面的字符至多3次
位置锚定:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行
\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<root\>或\broot\b:在整个文件每一行找root单词,必须作为整个单词出现
分组:
():把内容分组
(ab):把ab当成整体,ab可以出现任意次
后向引用
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2: 引用第二个左括号以及与之对应的右括号所包括的所有内容
\3: 引用第三个左括号以及与之对应的右括号所包括的所有内容
He love his lover.
She liker her lover.
He like his liker.
She lover her liker.
l..e
'(l..e).
\1'

[root@Smoke ~]# grep 'root' /etc/passwd(查找passwd文件包含root的字符的行)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
virtual:x:501:501::/var/ftproot:/sbin/nologin
[root@Smoke ~]# grep -i 'root' /etc/passwd(查找passwd文件包含root的字符的行,-i不区分大小写)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
virtual:x:501:501::/var/ftproot:/sbin/nologin
[root@Smoke ~]# grep --color=auto 'root' /etc/passwd(查找passwd文件中包含root字符的行,--color使用高亮显示)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
virtual:x:501:501::/var/ftproot:/sbin/nologin
[root@Smoke ~]# alias grep='grep --color'(给grep --color取别名叫grep)
[root@Smoke ~]# grep -v 'root' /etc/passwd(查找passwd文件中包含root字符的行,-v显示没有被root匹配到的行)
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@Smoke ~]# grep -o 'root' /etc/passwd(查找passwd文件中包含root的字符,-o只显示匹配到的字符串)
root
root
root
root
root
[root@Smoke ~]# grep 'r..t' /etc/passwd(查找passwd文件中包含r开头t结尾中间任意两个字符)
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
virtual:x:501:501::/var/ftproot:/sbin/nologin
[root@Smoke ~]# nano test.txt(编辑test.txt文件)
a
b
ab
aab
acb
amnb
amnbmnbmnb
[root@Smoke ~]# grep 'a.*b' test.txt(查找test.txt文件中a开头b结尾中间任意长度任意字符)
ab
aab
acb
amnb
amnbmnbmnb
[root@Smoke ~]# grep 'a*b' test.txt(查找test.txt文件中以a开头任意次数后面b)
b
ab
aab
acb
amnb
amnbmnbmnb
[root@Smoke ~]# grep 'a\?b' test.txt(查找test.txt文件中a可有可无后面跟b)
b
ab
aab
acb
amnb
amnbmnbmnb
[root@Smoke ~]# grep 'a\{1,3\}b' test.txt(查找test.txt文件中a至少1次至多3次后面跟b)
ab
aab
[root@Smoke ~]# grep 'a.\{1,3\}b' test.txt(查找test.txt文件中a和b之间出现1个字符2个字符3个字符,而且什么字符都可以,至少有1个至多有3个)
aab
acb
amnb
amnbmnbmnb
[root@Smoke ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
virtual:x:501:501::/var/ftproot:/sbin/nologin
[root@Smoke ~]# grep '^r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@Smoke ~]# grep 'w$' /etc/inittab(查找inittab文件w结尾的行)
\# For information on how to write upstart event handlers, or how
[root@Smoke ~]# grep 'b..h$' /etc/passwd(查找passwd文件中b和h之间跟任意两个字符,并且必须出现在行尾)
root:x:0:0:root:/root:/bin/bash
Smoke:x:500:500:Smoke:/home/Smoke:/bin/bash
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
hadoop:x:502:502::/home/hadoop:/bin/bash
nfstest:x:510:510::/home/nfstest:/bin/bash
student:x:512:512::/home/student:/bin/bash
vistor:x:513:513::/home/vistor:/bin/bash
tom:x:514:514::/home/tom:/bin/bash
user4:x:1003:1003:Tony Blare:/home/blare:/bin/bash
user7:x:1006:1006::/home/user7:/bin/bash
sysuser:x:495:492::/home/sysuser:/bin/bash
user8:x:2003:2003::/home/user8:/bin/bash
openstack:x:2004:2004::/home/openstack:/bin/bash
hive:x:5000:5000:Hive:/home/hive:/bin/bash
[root@Smoke ~]# grep '^$' /etc/inittab | wc -l(查找inittab文件存在空白字符的行将结果通过管道输入wc统计行数)
9
[root@Smoke ~]# grep '[[:digit:]]$' /etc/inittab(查找inittab文件中以数字结尾的行)
\#   5 - X11
[root@Smoke ~]# grep '[[:space:]][[:digit:]]$' /etc/inittab(查找inittab文件中以一个或多个空白字符后面跟数字结尾的行)
[root@Smoke ~]# nano test2.txt
This is        root.
The user is mroot.
rooter is a dog's name.
chroot is a command.
mrooter        is not a word.
[root@Smoke ~]# grep 'root\>' test2.txt(查找test2.txt文件中root必须出现在词尾的行)
This is root.
The user is mroot.
chroot is a command.
[root@Smoke ~]# grep '\<root' test2.txt(查找test2.txt文件中root必须出现在词首的行)
This is root.
rooter is a dog's name.
[root@Smoke ~]# grep '\<root\>' test2.txt(查找test2.txt文件中root单词的行)
This is root.
[root@Smoke ~]# grep '\broot\b' test2.txt(查找test2.txt文件中root单词的行)
This is root.
[root@Smoke ~]# nano test3.txt(编辑test3.txt文件)
He love        his lover.
She liker her lover.
He like        his liker.
She lover her liker.
[root@Smoke ~]# grep 'l..e' test3.txt(查找test3.txt文件中l和e中间任意连个字符)
He love his lover.
She liker her lover.
He like his liker.
She lover her liker
[root@Smoke ~]# nano test3.txt(编辑test3.txt文件)
He love        his lover.
She liker her lover.
He like        his liker.
She lover her liker.
She like him.
[root@Smoke ~]# grep  'l..e.*l..er' test3.txt(查找test3.txt文件中l和e之间任意两个字符,l和er之间任意两个字符,中间任意长度任意字符)
He love his lover.
She liker her lover.
He like his liker.
She lover her liker.
[root@Smoke ~]# grep '\(l..e\).*\1' test3.txt(查找test3.txt文件中l和e之间任意两个字符并且后面和前面字符相同)
He love his lover.
He like his liker.
[root@Smoke ~]# grep '\([[:digit:]]\).*\1$' /etc/inittab(查找inittab文件任意地方是数字,而且行尾必须和这个数字相同)
\#   5 - X11

练习:
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
grep -i '^s' /proc/meminfo
grep '^[sS]' /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
grep 'nologin$' /etc/passwd
取出默认shell为/sbin/nologin的用户列表
grep "nologin$' /etc/passwd | cut -d: -f1
取出默认shell为bash,且其用户ID号最小的用户的用户名
grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
grep "^#[[:space:]]{1,}[^[:space:]]" /etc/inittab
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep ':[0-9]:' /etc/inittab
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
grep '^[[:space:]]{1,}' /boot/grub/grub.conf
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
grep '^([0-9]).*\1$' /etc/inittab
练习:
1、找出某文件中的,1位数,或2位数;
grep '[0-9]{1,2}' /proc/cpuinfo
grep --color '\<[0-9]{1,2}\>' /proc/cpuinfo
2、找出ifconfig命令结果中的1-255之间的整数;
ifconfig | egrep --color '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-5][0-5])\>'

3、查找当前系统上名字为student(必须出现在行首)的用户的帐号的相关信息, 文件为/etc/passwd
grep '^student\>' /etc/passwd | cut -d: -f3
id -u student
student1
student2
练习:分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep '^l([0-9]):\1.*\1$' /etc/inittab

猜你喜欢

转载自blog.51cto.com/smoke520/2426099
今日推荐