频道栏目
首页 > 系统 > 其他 > 正文

用户管理、权限管理、管道、IO重定向、grep、正则表达式

2015-02-02 09:41:32         来源:相聚在此  
收藏   我要投稿
Linux04
Linux04_01?用户管理命令详解
[root@localhost test_cp]# which useradd
/usr/sbin/useradd
[root@localhost test_cp]# ls -l useradd -->列出的是文件,所以只在当前目录下查找
ls: useradd: No such file or directory
[root@localhost test_cp]# ls -l `which useradd`
-rwxr-x--- 1 root root 79288 Nov 27 2009 /usr/sbin/useradd
[root@localhost test_cp]# ls -l $(which adduser)
lrwxrwxrwx 1 root root 7 Dec 21 02:57 /usr/sbin/adduser -> useradd
[root@localhost test_cp]#

加密方法:
对称加密:加密和解密使用同一个密码
公钥加密:每个密码都成对儿出现,一个为私钥(secret key),一个为公钥(public key)
单向加密(指纹加密),散列加密:提取数据特征码,常用于数据完整性校验
3、不可逆
1、雪崩效应/蝴蝶效应:初始条件微小改变导致结构的巨大改变
2、定长输出
MD5:Message Digest, 128位定长输出
SHA1:Secure Hash Algorithm, 160位定长输出

[root@localhost ~]# file /etc/default/useradd
/etc/default/useradd: ASCII text-->说明是纯文本可以cat了
[root@localhost ~]# cat /etc/default/useradd
# useradd defaults file-->useradd m默认配置如下
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash -->默认shell
SKEL=/etc/skel -->下面有提到的:用户信息骨架,用户创建所需要的环境配置信息
CREATE_MAIL_SPOOL=yes

[root@localhost ~]#

[root@localhost ~]# id monkey-->用户的相关信息
uid=502(monkey) gid=501(oinstall) groups=501(oinstall),502(dba)
[root@localhost ~]# id -G -->列出当前用户的额外组(额外组默认是默认组)
0 1 2 3 4 6 10
[root@localhost ~]# id -G -n
root bin daemon sys adm disk wheel
-------------------------------------
[root@localhost ~]# id -G -n monkey
oinstall dba
[root@localhost ~]# id -G monkey
501 502
[root@localhost ~]#
oinstall:x:501:
dba:x:502:oracle,monkey
用户的额外组(额外组默认是默认组所指的组)
---------------------------------------
useradd USERNAME
groupadd GRPNAME

用户管理:
useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage

组管理:
groupadd, groupdel, groupmod, gpasswd

权限管理:
chown, chgrp, chmod, umask


/etc/passwd:
用户名:密码:UID:GID(为其基本组):注释:家目录:默认SHELL

/etc/group:
组名:密码:GID:以此组为其附加组的用户列表

/etc/shadow:
用户名:密码:最近一次修改密码的时间:最短使用期限:最长使用期限:警告时间:非活动时间:过期时间:

/etc/gshadow:
用户名:密码:组ID:以此组为其附加组的用户列表
用户管理:
useradd, userdel, usermod, passwd, chsh, chfn, finger, id, chage


useradd [options] USERNAME
-u UID
-g GID(基本组)
-G GID,... (附加组)
-c "COMMENT"
-d /path/to/directory
-s SHELL
-m -k:在某些情况下强制创建家目录,虽然默认情况也会创建家目录,即使不使用这个option
-M :不创建用户家目录
-r: 添加系统用户,系统用户没有家目录,而且不能让其登录:s:/sbin/nologin
[root@localhost ~]# useradd -r user03
[root@localhost ~]# tail -1 /etc/passwd
user03:x:101:104::/home/user03:/bin/bash
[root@localhost ~]# su - user03
su: warning: cannot change directory to /home/user03: No such file or directory
-bash-3.2$ exit
logout
[root@localhost ~]#
/etc/login.defs:账户的配置信息
/etc/skel :shell的配置文件
环境变量:
PATH
HISTSIZE
SHELL


/etc/shells:指定了当前系统可用的安全shell



userdel:
userdel [option] USERNAME
-r: 同时删除用户的家目录,不加默认不删除家目录

id:查看用户的帐号属性信息
-u
-g
-G:列出额外组
-n:和上面一起列出名称而非ID

finger: 查看用户帐号信息
finger USERNAME

修改用户帐号属性:
usermod
-u UID
-g GID
-a -G GID:不使用-a选项,会覆盖此前的附加组;
-c:注释信息
-d -m:-m会使原来家目录中的文件移动至此前指定的家目录中
-s
-l:改登录名
-L:锁定帐号
-U:解锁帐号

chsh: 修改用户的默认shell

chfn:修改注释信息
[root@localhost ~]# chfn lvyongwen
Changing finger information for lvyongwen.
Name [lvyongwen]: lyw
Office []: jiali
Office Phone []: 110
Home Phone []: 112

Finger information changed.
[root@localhost ~]# finger
Login Name Tty Idle Login Time Office Office Phone
oracle pts/1 1:54 Jan 30 17:24 (:2.0)
root root pts/0 1:55 Jan 30 17:24 (:1.0)
root root pts/2 Jan 30 17:26 (192.168.91.1)
root root pts/3 27 Jan 30 17:27 (192.168.91.1)
[root@localhost ~]# finger lyw
Login: lvyongwen Name: lyw
Directory: /home/lvyongwen Shell: /bin/bash
Office: jiali, 110 Home Phone: 112
Never logged in.
No mail.
No Plan.
[root@localhost ~]#
lvyongwen:x:500:500:lyw,jiali,110,112:/home/lvyongwen:/bin/bash
---------------------------
/etc/passwd
User account information.

/etc/shadow
Secure user account information.

/etc/group
Group account information.

/etc/gshadow
Secure group account information.

/etc/default/useradd
Default values for account creation.

/etc/skel/
Directory containing default files.

/etc/login.defs
Shadow password suite configuration
-----------------------------------------

密码管理:
passwd [USERNAME]
--stdin:从标准输入读取密码
[root@localhost ~]# echo "lvw123" | passwd --stdin lvyongwen
Changing password for user lvyongwen.
passwd: all authentication tokens updated successfully.
-l:锁定用户账号
-u:解锁
-d: 删除用户密码

pwck:检查用户帐号完整性


组管理:
创建组:groupadd
groupadd
-g GID
-r:添加为系统组

groupmod
-g GID
-n GRPNAME

groupdel

gpasswd:为组设定密码

newgrp GRPNAME <--> exit
[root@localhost ~]# groupadd -g 2015 group1
[root@localhost ~]# tail -1 /etc/group
group1:x:2015:
[root@localhost ~]# id lvyongwen
uid=500(lvyongwen) gid=500(lvyongwen) groups=500(lvyongwen)
[lvyongwen@localhost ~]$ touch test01.txt
[lvyongwen@localhost ~]$ ls -l
total 0
-rw-rw-r-- 1 lvyongwen lvyongwen 0 Jan 30 19:43 test01.txt
[lvyongwen@localhost ~]$ su - root
Password:
[root@localhost ~]# gpasswd group1
They don't match; try again
New Password:
Re-enter new password:
[root@localhost ~]# su lvyongwen
[lvyongwen@localhost root]$ newgrp group1-->假如切换的组是自己的额外组,就不需要输入密码
Password:
[lvyongwen@localhost ~]$ touch test02.txt
[lvyongwen@localhost ~]$ ls -l
total 0
-rw-rw-r-- 1 lvyongwen lvyongwen 0 Jan 30 19:43 test01.txt
-rw-r--r-- 1 lvyongwen group1 0 Jan 30 19:49 test02.txt
[lvyongwen@localhost ~]$ id
uid=500(lvyongwen) gid=2015(group1) groups=500(lvyongwen),2015(group1)
[lvyongwen@localhost ~]$ exit
exit



练习:
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
7、

chage:change user password expiry information
-d: 最近一次的修改时间
-E: 过期时间
-I:非活动时间
-m: 最短使用期限
-M: 最长使用期限
-W: 警告时间


chage:change user password expiry information,改变用户密码过期时间
-d: 最近一次的修改时间
-E: 过期时间
-I:非活动时间
-m: 最短使用期限
-M: 最长使用期限
-W: 警告时间


Linux04_02?权限和权限管理
权限管理:
r:
w:
x:

三类用户:
u: 属主
g: 属组
o: 其它用户

chown: 改变文件属主(只有管理员可以使用此命令)
# chown USERNAME file,...
-R: 修改目录及其内部文件的属主
--reference=/path/to/somefile file,...:表示改成跟指定路径下的文件属主、属组一样
[root@localhost test_dir]# chown -R --reference=/home/oracle/ test_dir_re/ -->改成跟指定路径下的文件属主、属组一样
[root@localhost test_dir]# ll
total 8
-rw-r--r-- 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 oracle oinstall 4096 Jan 30 23:59 test_dir_re

chown USERNAME:GRPNAME file,... 同时该属主和属组
chown USERNAME.GRPNAME file,... 同时该属主和属组

# chgrp GRPNAME file,...
-R
--reference=/path/to/somefile file,...

[root@localhost test_dir]# chgrp root test_dir_re/-->改变所属组
[root@localhost test_dir]# ll
total 8
-rw-r--r-- 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 oracle root 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]# ls -l test_dir_re/test1
-rw-r--r-- 1 oracle oinstall 24 Jan 30 23:59 test_dir_re/test1
[root@localhost test_dir]# chgrp -R root test_dir_re/-->假如针对的是目录记得加 R
[root@localhost test_dir]# ls -l test_dir_re/test1
-rw-r--r-- 1 oracle root 24 Jan 30 23:59 test_dir_re/test1

chmod: 修改文件的权限
修改三类用户的权限:
chmod MODE file,...
-R
--reference=/path/to/somefile file,...

[root@localhost test_dir]# ls -l
total 8
-rw-r--r-- 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]# chmod 755 test1 -->同时改变三类用户权限缺省从前面补0 --> 57 :057表示属主为0属组为5其他为7
[root@localhost test_dir]# ll
total 8
-rwxr-xr-x 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re

修改某类用户或某些类用户权限:
u,g,o,a
chmod 用户类别=MODE file,...

[root@localhost test_dir]# chmod o=rwx test1 -->改变某个用户权限
[root@localhost test_dir]# ll
total 8
----r-xrwx 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]# chmod u=rw test1
[root@localhost test_dir]# ll
total 8
-rw-r-xrwx 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]# chmod u=775 test1-->既然是给变某个用户则不可能是这样u=755了
chmod: invalid mode: `u=775'
Try `chmod --help' for more information.
[root@localhost test_dir]# chmod u=7 test1
chmod: invalid mode: `u=7'
Try `chmod --help' for more information.
[root@localhost test_dir]# chmod ug= test1
[root@localhost test_dir]# ll
total 8
-------rwx 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re

修改某类用户的某位或某些位权限:
u,g,o,a
chmod 用户类别+|-MODE file,...

[root@localhost test_dir]# chmod u+w test1
[root@localhost test_dir]# ll
total 8
--w----rwx 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]# chmod ug+x test1
[root@localhost test_dir]# ll
total 8
--wx--xrwx 1 root root 24 Jan 30 23:58 test1
drwxr-xr-x 2 root oinstall 4096 Jan 30 23:59 test_dir_re
[root@localhost test_dir]#

练习:
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
su - openstack

-------------------------------------------------
手动添加用户hive, 基本组为hive (5000),附加组为fedora

[root@localhost ~]# vi /etc/group
[root@localhost ~]# tail -2 /etc/group
fedora:x:2003:hive <--把用户添加到指定额外组中
hive:x:5000:<--添加需要的组
[root@localhost ~]# vi /etc/passwd <--添加用户
[root@localhost ~]# tail -2 /etc/passwd
hive:x:5000:5000:HIVE:/home/hive:/bin/bash
[root@localhost ~]# vi /etc/shadow <--设置 密码
[root@localhost ~]# cp -r /etc/skel/ /home/hive <--复制家目录所需要的文件
[root@localhost ~]# ls -la /home/hive/
total 28
drwxr-xr-x 3 root root 4096 Jan 30 23:38 .
drwxr-xr-x 11 root root 4096 Jan 30 23:38 ..
-rw-r--r-- 1 root root 33 Jan 30 23:38 .bash_logout
-rw-r--r-- 1 root root 176 Jan 30 23:38 .bash_profile
-rw-r--r-- 1 root root 124 Jan 30 23:38 .bashrc
drwxr-xr-x 4 root root 4096 Jan 30 23:38 .mozilla
[root@localhost ~]# chown -R hive.hive /home/hive <--改变目录的所属主、组
[root@localhost ~]# chmod -R go= /home/hive <--改变访问权限
[root@localhost ~]# su - hive
[hive@localhost ~]$ ls
[hive@localhost ~]$ ls -a
. .. .bash_logout .bash_profile .bashrc .mozilla
[hive@localhost ~]$ id
uid=5000(hive) gid=5000(hive) groups=2003(fedora),5000(hive)
[hive@localhost ~]$
但是注意此时的用户只能su过去,但是不能登录;在Linux中不能使空密码用户登录
所以设置密码:
[root@localhost test_dir]# whatis passwd
passwd (1) - update a user's authentication tokens(s)
passwd (5) - password file
passwd (rpm) - The passwd utility for setting/changing passwords using PAM
passwd [sslpasswd] (1ssl) - compute password hashes <--
[root@localhost test_dir]# man sslpasswd -->用于生成密码的hash
[root@localhost test_dir]# openssl passwd -1 -salt "12345678"
Password:
$1$12345678$Sx03Gy86On0pOXXdarGbj.
[root@localhost test_dir]# vi /etc/shadow
这样就可以登录了....
-----------------------------------------
[root@localhost test_dir]# ll
total 4
drwxr-xr-x 2 root root 4096 Jan 31 00:56 dir1 755 = 777-022
-rw-r--r-- 1 root root 0 Jan 31 00:56 file1 644 = 666-022
[hive@localhost ~]$ ll
total 4
drwxrwxr-x 2 hive hive 4096 Jan 31 00:57 dir1 775 = 777-002
-rw-rw-r-- 1 hive hive 0 Jan 31 00:56 file1 664 = 666-002
[hive@localhost ~]$
为什么上面所创建文件和目录权限不一样?
答:是因为umask不一样:
[root@localhost test_dir]# umask
0022
[hive@localhost ~]$ umask
0002
umask:遮罩码,用于创建文件时所使用的反码

注意下面:遮罩码是可以改变的
[hive@localhost ~]$ umask 023 <--改变umask
[hive@localhost ~]$ umask
0023
[hive@localhost ~]$ rm -rf ./*
[hive@localhost ~]$ ll
total 0
[hive@localhost ~]$ !touch
touch file1
[hive@localhost ~]$ !mkdir
mkdir dir1
[hive@localhost ~]$ ll
total 4
drwxr-xr-- 2 hive hive 4096 Jan 31 01:03 dir1 754 = 777-023
-rw-r--r-- 1 hive hive 0 Jan 31 01:03 file1 644 != 666-023
文件:666-023=643 X
目录:777-023=754
为什么上面计算的文件结果和实际的不一样?
答:文件默认不能具有执行权限,如果算得的结果中有执行权限,则将其权限加1;

注意:在Linux中默认所有被创建的文件都是不具有执行权限的!

所以加入不想让其他用户访问文件设置umask为027--> 640 = 666-027 + 1


站在用户登录的角度来说,SHELL的类型:
登录式shell:
1、正常通常某终端登录
2、su - USERNAME
3、su -l USERNAME

非登录式shell:
1、su USERNAME
2、图形终端下打开命令窗口
3、自动执行的shell脚本


bash的配置文件:通过全局和个人
全局配置
/etc/profile, /etc/profile.d/*.sh, /etc/bashrc
个人配置
~/.bash_profile, ~/.bashrc

bash的配置文件:通过文件配置的功能
profile类的文件:
设定环境变量
需运行命令或脚本

bashrc类的文件:
设定本地变量
定义命令别名

登录式shell如何读取配置文件?
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell如何配置文件?
~/.bashrc --> /etc/basrc --> /etc/profile.d/*.sh

针对于以前还未解决的问题:Alisa cls=clear 退出就会失效
-----------------------------
[hive@localhost ~]$ alias cls="clear"
[hive@localhost ~]$ cls
[hive@localhost ~]$ alias cls="clear"
[hive@localhost ~]$ alias
alias cls='clear'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[hive@localhost ~]$ cls-->有效
[hive@localhost ~]$
Last login: Sat Jan 31 00:40:42 2015 from 192.168.91.1
[root@localhost ~]# su - hive
[hive@localhost ~]$ cls -->但是这里无效
-bash: cls: command not found
[hive@localhost ~]$
如下解决:
[hive@localhost ~]$ nano ./.bash
.bash_logout .bash_profile .bashrc
[hive@localhost ~]$ nano ./.bashrc <--在里面添加alias cls = "clear"
[hive@localhost ~]$ logout
[root@localhost ~]# su - hive
[hive@localhost ~]$ cls <--有效了

要求:假如希望用户登录后可以显示当前用户和日期?
如下解决:
# nano ./.bash_profile
echo "Welcome to system `id -un` ,Date is $(date +%F)}"

Last login: Sat Jan 31 00:41:17 2015 from 192.168.91.1
Weclome to system : hive ,Date is 2015-01-31
[hive@localhost ~]$

Linux04_03?IO重定向和管道
姓名,来自地区,性格、爱好和特长,个人寄语




登录式shell,配置文件及次序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

profile: 定义环境变量、运行程序或脚本

bashrc:定义本地变量、命令别名


chown, chgrp, chmod
-R
--reference=

chmod:
perm: 777, 666
u,g,o,a =
u,g,o,a +/-

umask



管道和重定向:> < >> <<

运算器、控制器: CPU
存储器:RAM
输入设备/输出设备

程序:指令和数据

控制器:指令
运算器:
存储器:

地址总线:内存寻址
数据总线:传输数据
控制总结:控制指令

寄存器:CPU暂时存储器

I/O: 硬盘,

程序

INPUT设备:鼠标、键盘、网卡、硬盘

OUTPUT设备


系统设定
默认输出设备:标准输出,STDOUT, 1
默认输入设备:标准输入, STDIN, 0
标准错误输出:STDERR, 2

标准输入:键盘
标准输出和错误输出:显示器

I/O重定向:

Linux:
>: 覆盖输出
>>:追加输出

set -C: 禁止对已经存在文件使用覆盖重定向;
强制覆盖输出,则使用 >|
set +C: 关闭上述功能

2>: 重定向错误输出
2>>: 追加方式
--------------------------------
这段代码是测试输出情况
[root@localhost test_dir]# ls-->说明有两个文件
dir1 file1
[root@localhost test_dir]# clear
[root@localhost test_dir]# ls ./ > /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
dir1 -->说明重定向了正确输出
file1
[root@localhost test_dir]# ls ./a > /tmp/test.out
ls: ./a: No such file or directory
[root@localhost test_dir]# ls ./a 2> /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
ls: ./a: No such file or directory

错误信息不能通过 > 输出到文件中而只能通过 2>输出到文件中?
答:因为 > 该为正确重定向输出 2> 为错误重定向输出
因此也说明了错误和正确重定向输出使用的不同


[root@localhost test_dir]# ls ./b 2>> /tmp/test.out -->标准错误附加输出
[root@localhost test_dir]# cat /tmp/test.out
ls: ./a: No such file or directory
ls: ./b: No such file or directory
[root@localhost test_dir]# set -C -->是否覆盖文件开关
[root@localhost test_dir]# ls ./c 2> /tmp/test.out
-bash: /tmp/test.out: cannot overwrite existing file
[root@localhost test_dir]# set +C
[root@localhost test_dir]# ls ./c 2> /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
ls: ./c: No such file or directory
[root@localhost test_dir]# set -C
[root@localhost test_dir]# ls ./d >| /tmp/test.out -->虽然关闭覆盖开关,但是强制覆盖
ls: ./d: No such file or directory
[root@localhost test_dir]# ls ./d 2>| /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
ls: ./d: No such file or directory
[root@localhost test_dir]# ls ./d 2>| /tmp/test.out >| /tmp/test.out -->同时重定向错误、正确输出
[root@localhost test_dir]# cat /tmp/test.out
ls: ./d: No such file or directory
[root@localhost test_dir]# ls ./ 2>| /tmp/test.out >| /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
dir1
file1
[root@localhost test_dir]#
[root@localhost test_dir]# ls ./ &> /tmp/test.out
-bash: /tmp/test.out: cannot overwrite existing file
[root@localhost test_dir]# set +C
[root@localhost test_dir]# ls ./ &> /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
dir1
file1
[root@localhost test_dir]# ls ./f &> /tmp/test.out
[root@localhost test_dir]# cat /tmp/test.out
ls: ./f: No such file or directory
[root@localhost test_dir]#
------------------------------------------------
&>: 重定向标准输出或错误输出至同一个文件
&>>:不支持注意了!!!
<:输入重定向
<<:Here Document 而不是追加输入重定向
----------------------------------
tr [seq1] [seq2] 转换存在第一个seq1中字符变成seq2中的或者删除
[root@localhost test_dir]# tr 'a-z' 'A-Z' --> tr - translate or delete characters
asd
ASD
[root@localhost test_dir]# tr 'a-z' 'A-Z' < /tmp/test.out -->表示吧文件test.out作为标准输入
LS: ./F: NO SUCH FILE OR DIRECTORY
[root@localhost test_dir]# cat < /tmp/test.out
ls: ./f: No such file or directory
[root@localhost test_dir]# cat << /tmp/test.out --> <<不是追加输入重定向,而是此处文档
>
[root@localhost test_dir]# cat <<END -->END表示此处文档的结束标志;就是模拟出一个文档出来作为编写,再一起输出
> this is first line
> this is second line
> END
this is first line
this is second line
[root@localhost test_dir]# cat >>/tmp/test.out <<EOF -->这个意思是从此处文档中的输入追加重定向test.out文件中
> THIS IS FIRST LINE
> THIS IS SECOND LIE
> EOF
[root@localhost test_dir]# cat /tmp/test.out
ls: ./f: No such file or directory
THIS IS FIRST LINE
THIS IS SECOND LIE
[root@localhost test_dir]#
bc:计算器
---------------------------------------------------


管道:前一个命令的输出,作为后一个命令的输入

命令1 | 命令2 | 命令3 | ...

tee:是表示通过标准输入输出到文件和标准输出上
tee - read from standard input and write to stan-
dard output and files

SYNOPSIS
tee [OPTION]... [FILE]...
需求:怎么样才能把输入的字符串大写,并且输出到文件中而且也输出到控制台中呢?
[root@localhost test_dir]# echo 'hello ,world !' | tr 'a-z' 'A-Z' | tee /tmp/test.out
HELLO ,WORLD !
[root@localhost test_dir]# cat /tmp/test.out
HELLO ,WORLD !
[root@localhost test_dir]#

wc:打印在指定文件中行数目、单词数目、等等
wc - print the number of newlines, words, and
bytes in files

SYNOPSIS
wc [OPTION]... [FILE]...

DESCRIPTION
Print newline, word, and byte counts for each
FILE, and a total line if more than one FILE is
specified. With no FILE, or when FILE is -, read
standard input.
[root@localhost test_dir]# cat /tmp/test.out
HELLO ,WORLD !
[root@localhost test_dir]# wc -l /tmp/test.out | cut -d' ' -f1
1
[root@localhost test_dir]#


w:展现系统中的用户信息
NAME
w - Show who is logged on and what they are doing.

SYNOPSIS
w - [husfV] [user]
-------------------------------------------
[root@localhost test_dir]# ls /etc/ | wc -l
215
[root@localhost test_dir]# ls -l /etc/ | wc -l
216
[root@localhost test_dir]# ls -l /etc/ | head -2
total 3196
drwxr-xr-x 4 root root 4096 Dec 21 02:59 acpi
[root@localhost test_dir]# ls /etc/ | head -2
acpi
adjtime
[root@localhost test_dir]#
你会发现写了-l的结果不一样,是因为-l还会出现total3096多这行结果,所以在查找文件数不要写-l操作否则输出错误

-----------------------------------------
练习:
1、统计/usr/bin/目录下的文件个数;
# ls /usr/bin | wc -l
2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示;
# cut -d: -f7 /etc/passwd | sort -u
3、思考:如何显示/var/log目录下每个文件的内容类型?
第一种:file /val/log/*
第二种:
[root@localhost test_dir]# cd /var/log/-->一定要到该目录下才可行
[root@localhost log]# file `ls /var/log/`
acpid: ASCII text
anaconda.log: ASCII English text, with very long lines
anaconda.syslog: ASCII English text
anaconda.xlog: ASCII English text
audit: directory
boot.log: empty
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
--------------------------------------------
[root@localhost ~]# ls -ld /etc/pa*
drwxr-xr-x 2 root root 4096 Dec 21 03:00 /etc/pam_pkcs11
-rw-r--r-- 1 root root 12 Jul 12 2006 /etc/pam_smb.conf
drwxr-xr-x 4 root root 4096 Dec 21 02:59 /etc/pango
-rw-r--r-- 1 root root 2015 Jan 30 23:44 /etc/passwd
-rw-r--r-- 1 root root 1971 Jan 30 22:13 /etc/passwd-
-rw-r--r-- 1 root root 1816 Jan 30 18:17 /etc/passwd.OLD
[root@localhost ~]# ls -ld /etc
drwxr-xr-x 89 root root 12288 Jan 31 00:40 /etc
[root@localhost ~]# ls -ld /etc/
drwxr-xr-x 89 root root 12288 Jan 31 00:40 /etc/
[root@localhost ~]# ls /etc/
acpi hosts.allow profile
...... ........ .........
-d表示以目录的形式列出
-----------------------------------------------
7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中;
# echo "alias cls=clear" >> ~/.bashrc


Linux04_04?grep和正则表达式

uniq:显示 report or omit(跳过) repeated lines
-c:统计连续的条目数,并且在前面显示其连续出现的数目
-d: only print duplicate lines,只打印重复行
-u:打印唯一行

grep, egrep, fgrep

grep: 根据模式搜索文本,并将符合模式的文本行显示出来。(部分匹配即可,注意匹配哪部分
Pattern: 文本字符和正则表达式的元字符组合而成匹配条件

grep [options] PATTERN [FILE...]
-i:忽略大小写
--color:匹配出的字符串加上颜色
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串

文件名通配: globbing
#man 7 glob
*: 任意长度的任意字符
?: 任意单个字符
[]:
[^]:

正则表达式:REGular EXPression, REGEXP
元字符:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]

匹配次数(贪婪模式):
*: 匹配其前面的字符任意次
a, b, ab, aab, acb, adb, amnb
a*b: a, b, ab, aab 被匹配
a?b:b,ab,aab,acb,adb,amnb被匹配
a.*b:ab, aab, acb, adb, amnb被匹配

.*: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{1,\}
\{0,3\}

位置锚定:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行
单词:并不是我们英语中所说的那样,而是只要中间没有特殊字符的串就是单词
\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

分组:
\(\)
\(ab\)*
后向引用,括号中出现要在后面出现同样的内容
\1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
\2: 以上述类推
\3:

He love his lover.
She like her liker.
He like his lover.

练习:
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之间的整数;


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












上一篇:Mac把socks5代理转换成http/https的代理
下一篇:nginx安装配置记录
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站