Linux常用基础命令实例:
工具:
- 安装好的Centos7系统 www.mirrors.aliyun.com 下载CentOS-7-x86_64-Everything-1810
- VMware Workstation Pro
- Xshell
Linux起源:
1991年10月5日,Torvalds在comp.os.minix新闻组上发布消息正式向外宣布他自行编写的完全自有免费的内核诞生(Freeminix-linke kernel sources for 386-AT)
类Unix的内核,在GPL下发布
官网:www.kernel.org
Linux操作系统:
完整的类UNIX操作系统
Linux内核+GNU工具
如:Centos,Ubuntu,Android
目录:
1、基础参考命令
2.文件管理
3.标准IO和管道
4.用户组和权限管理
5.文本处理工具
1、基础参考命令
1.显示当前使用的shell
[root@elroy ~]# echo ${SHELL}
/bin/bash
2.显示当前系统使用的所有shell
[root@elroy ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
3.type可以用来判断命令是内部命令还是外部命令
builtin为内部反之为外部
[root@elroy ~]# type cd
cd is a shell builtin
[root@elroy ~]# type top
top is /bin/top
4.0.0. alias可以将字符串定义成自己想要自定义功能的命令
[root@elroy ~]# alias a='ls'
[root@elroy ~]# alias
alias a='ls'
[root@elroy ~]# a
anaconda-ks.cfg Downloads fileb fl.s Pictures Desktop file filec fsdfdsfsd Public Templates Documents filea filed initial-setup-ks.cfg Music
取消别名:unalias name 如果使用unalias -a取消所有别名
[root@elroy ~]# unalias a
[root@elroy ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
4.0.1.将设置的别名永久生效
有两个文件可以写,~/.bashrc文件仅对当前用户,/etc/bashrc文件是对所有用户生效
[root@elroy ~]# echo "alias a='mkdir test'" >> ~/.bashrc
[root@elroy ~]# tail -1 ~/.bashrc
alias a='mkdir test'
命令前面加入\为不使用定义的别名功能使用命令本身原始功能
[root@elroy ~]# \ls
anaconda-ks.cfg Downloads fileb fl.s
5.date命令:显示时间和日期
格式:
date [OPTION]..[+FORMAT]
常用选项
-s:设定系统时间为指定时间STRING
FORMAT格式为:
%% 一个文字的 %
%a 当前locale 的星期名缩写(例如: 日,代表星期日)
%A 当前locale 的星期名全称 (如:星期日)
%b 当前locale 的月名缩写 (如:一,代表一月)
%B 当前locale 的月名全称 (如:一月)
%d 按月计的日期(例如:01)
%D 按月计的日期;等于%m/%d/%y
%F 完整日期格式,等价于 %Y-%m-%d
%g ISO-8601 格式年份的最后两位 (参见%G)
%G ISO-8601 格式年份 (参见%V),一般只和 %V 结合使用
%h 等于%b
%H 小时(00-23)
%I 小时(00-12)
%j 按年计的日期(001-366)
%k hour, space padded ( 0..23); same as %_H
%l hour, space padded ( 1..12); same as %_I
%m month (01..12)
%M minute (00..59)
%n 换行
%N 纳秒(000000000-999999999)
%p 当前locale 下的"上午"或者"下午",未知时输出为空
%P 与%p 类似,但是输出小写字母
%r 当前locale 下的 12 小时时钟时间 (如:11:11:04 下午)
%R 24 小时时间的时和分,等价于 %H:%M
%s 自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数
%S 秒(00-60)
%t 输出制表符 Tab
%T 时间,等于%H:%M:%S
%u 星期,1 代表星期一
%U 一年中的第几周,以周日为每星期第一天(00-53)
%V ISO-8601 格式规范下的一年中第几周,以周一为每星期第一天(01-53)
%w 一星期中的第几日(0-6),0 代表周一
%W 一年中的第几周,以周一为每星期第一天(00-53)
%x 当前locale 下的日期描述 (如:12/31/99)
%X 当前locale 下的时间描述 (如:23:13:48)
%y 年份最后两位数位 (00-99)
%Y 年份
示例:
-s方法是使用,设定日期为2019年3月19日,00时00分00秒
[root@elroy ~]# date -s "2019-3-19 00:00:00"
Tue Mar 19 00:00:00 CST 2019
再次查看时间
[root@elroy ~]# date
Tue Mar 19 00:00:24 CST 2019
[root@elroy ~]# date "+%Y年%m月%d日,%H时%M分%S秒"
2019年03月19日,00时01分33秒
6.cal命令:显示日历,输入cal -y显示整年日历
[root@elroy ~]# cal
March 2019
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
7.关机、重启shutdown 选项后面可以加时间来设置多久执行的分钟数
重启:
[root@elroy ~]# init 6
[root@elroy ~]# shutdown -r now
[root@elroy ~]# reboot
关机:
[root@elroy ~]# poweroff
[root@elroy ~]# halt
[root@elroy ~]# shutdown -h now
[root@elroy ~]# init
8.用户登录信息查看命令
查看当前登录系统的用户
[root@elroy ~]# whoami
root
查看当前所有系统登录的用户
[root@elroy ~]# who
root pts/0 2019-03-20 19:45 (192.168.126.1)
root pts/1 2019-03-20 15:06 (192.168.126.1)
elroy :0 2019-03-20 08:46 (:0)
使用W显示系统当前使用会话及所做操作
[root@elroy ~]# w
00:12:41 up 18:49, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.126.1 19:45 ? 0.15s 0.03s w
root pts/1 192.168.126.1 15:06 ? 0.04s 0.04s -bash
elroy :0 :0 08:46 ?xdm? 3:22 0.56s /usr/libexec/gnome-session-binary --sess
9.echo命令:显示字符
格式:echo[SHORT-OPTION]...[STRING]...
echo LONG-OPTION
常用选项:
-n:不启动换行;
-e:启用字符的解释功能
回显字符
[root@elroy ~]# echo "abc"
abc
显示PATH变量的值
[root@elroy ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
显示abc不换行
[root@elroy ~]# echo -n "abc"
abc[root@elroy ~]#
10.命令行扩展:$()或``
把一个命令的输入打印给另一命令给的参数
abc[root@elroy ~]# echo "i am `whoami`"
i am root
[root@elroy ~]# echo "i am $(whoami)"
i am root
[root@elroy ~]# echo "i am whoami"
i am whoami
11.大括号扩展:{}
数字、字符扩展
[root@elroy ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@elroy ~]# echo {a..f}
a b c d e f
12.命令历史使用方法:
命令历史的配置文件在**~/.bash_histroy
重复前一个命令:
1.按方向键,调出,按回车即执行
2.输入!!并回车执行
[root@elroy ~]# touch test
[root@elroy ~]# ll test
-rw-r--r--. 1 root root 0 Mar 21 09:28 test
[root@elroy ~]# !!
ll test
-rw-r--r--. 1 root root 0 Mar 21 09:28 test
3.输入!-1并回车执行
[root@elroy ~]# !-1
ll test
-rw-r--r--. 1 root root 0 Mar 21 09:28 test
4.history命令查看命令历史记录
[root@elroy ~]# history | head -5
1 ip a
2 history
3 tty
4 stat
5 stat --help
[root@elroy ~]# history | tail -5
198 touch test
199 ll test
200 history | head 5
201 history | head -5
202 history | tail -5
5.输入!n,执行history命令输出对应序号n的命令
[root@elroy ~]# !199
ll test
-rw-r--r--. 1 root root 0 Mar 21 09:28 test
6.!string:
[root@elroy ~]# !his
history | tail -5
201 history | head -5
202 history | tail -5
203 ll test
204 ip a
205 history | tail -5
13.调用上一次命令最后一个参数
1.输入:!$
[root@elroy ~]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 3907 Apr 11 2018 /etc/ssh/sshd_config
[root@elroy ~]# file !$
file /etc/ssh/sshd_config
/etc/ssh/sshd_config: ASCII text
2.按ESC键松开后,再按.(点号)
14.命令历史环境变量:
系统默认的环境变量都使用大写字母,显示环境变量的内容,则需要使用echo $环境变量名称的形式查看其值。而要想修改或设置环境变量,有两种方法,一种是可直接在命令行使用export命令方式设置环境变量,则立即生效,退出shell登录或服务器重启生效,另一种是把export命令设置环境变量代码写到配置文件里,重读配置文件则永久生效。重读配置文件生效有两种方法:一种是使用source命令重读配置文件生效,另一种使用点号。
15.HISTISIZE是查看命令历史记录条数
[root@elroy ~]# echo $HISTSIZE
1000
临时通过export修改变量
[root@elroy ~]# export HISTSIZE=2000
[root@elroy ~]# echo $HISTSIZE
2000
永久修改环境变量历史记录条数为2000
[root@elroy ~]# source ~/.bash_profile
点也可以
[root@elroy ~]# . ~/.bash_profile
16.HISTFILE:历史文件保存的变量
[root@elroy ~]# echo $HISTFILE
/root/.bash_history
17.HISTFILESIZE:历史文件记录历史的条数
[root@elroy ~]# echo $HISTFILESIZE
1000
18.HISTTIMEFRMAT:历史命令记录的格式
设置历史命令显示执行的日期和时间
[root@elroy ~]# export HISTTIMEFORMAT="%F %T"
[root@elroy ~]# history | head -5
1 2019-03-21 08:50:02ip a
2 2019-03-21 08:50:02history
3 2019-03-21 08:50:02tty
4 2019-03-21 08:50:02stat
5 2019-03-21 08:50:02stat --help
19.Bash中常用快捷键:
ctrl+A: 把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用。
ctrl+E: 把光标移动到命令行结尾。
ctrl+C: 强制终止当前的命令。
ctrl+L: 清屏,相当于clear命令。
ctrl+U: 删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
ctrl+K: 删除或剪切光标之后的内容。
ctrl+R: 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索。
ctrl+Z: 暂停,并放入后台。这个快捷键牵扯工作管理的内容,我们在系统管理章节详细介绍。
2.文件管理
linux文件系统上的文件类型如下:
-:表示普通文件
d:表示目录文件
b:表示块设备文件
c:表示字符设备文件
l:表示软连接文件
p:表示管道文件
s:表示套接字文件
[root@elroy ~]# ll
total 6
-rw-------. 1 root root 1783 Mar 18 17:11 anaconda-ks.cfg
drwxr-xr-x. 2 root root 6 Mar 18 17:15 Desktop
drwxr-xr-x. 2 root root 6 Mar 18 17:15 Documents
drwxr-xr-x. 2 root root 6 Mar 18 17:15 Downloads
-rw-r--r--. 1 root root 16 Mar 19 14:03 file
-rw-r--r--. 1 root root 5 Mar 19 14:04 filea
1.pwd命令:显示当前的工作目录
[root@elroy ~]# pwd
/root
2.basename命令:取路径基名 & dirname命令:取路径径名
[root@elroy ~]# basename /etc/sysconfig/
sysconfig
[root@elroy ~]# dirname /etc/sysconfig/
/etc
3.cd命令:切换目录
切换到用户家目录
[root@elroy meng]# cd
[root@elroy ~]#
[root@elroy meng]# cd ~
[root@elroy ~]#
切换到父目录
[root@elroy first]# pwd
/root/meng/first
[root@elroy first]# cd ..
切换到/etc/sysconfig/
[root@elroy first]# cd /etc/sysconfig/
[root@elroy sysconfig]#
切换到上一次所在的目录
[root@elroy meng]# cd -
/root/meng/first
4.ls命令:列出目录的内容
选项:
-a:包含隐藏文件;
-l:显示额外信息;
-R:目录递归通过;
-l:文件分行显示;
显示当前目录下所有文件
[root@elroy first]# ls -a
. .. text1.txt text2.txt text3.txt text4.txt text5.txt
显示目录内容的额外信息
[root@elroy first]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 21 10:44 text1.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text2.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text3.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text4.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text5.txt
[root@elroy first]# ll
total 0
-rw-r--r--. 1 root root 0 Mar 21 10:44 text1.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text2.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text3.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text4.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text5.txt
递归显示目录内容
[root@elroy meng]# pwd
/root/meng
[root@elroy meng]# ls -R
.:
first
./first:
text1.txt text2.txt text3.txt text4.txt text5.txt
组合使用
额外显示文件之外的信息和隐藏信息
[root@elroy meng]# ll -aR
.:
total 4
drwxr-xr-x. 3 root root 19 Mar 21 10:38 .
dr-xr-x---. 20 root root 4096 Mar 21 09:39 ..
drwxr-xr-x. 2 root root 91 Mar 21 10:44 first
./first:
total 0
drwxr-xr-x. 2 root root 91 Mar 21 10:44 .
drwxr-xr-x. 3 root root 19 Mar 21 10:38 ..
-rw-r--r--. 1 root root 0 Mar 21 10:44 text1.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text2.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text3.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text4.txt
-rw-r--r--. 1 root root 0 Mar 21 10:44 text5.txt
5.stat命令:查看文件状态
查看test.txt文件的状态,注意三个时间戳
[root@elroy first]# stat text1.txt
File: ‘text1.txt’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 802h/2050d Inode: 36028387 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2019-03-21 10:44:49.707218477 +0800
Modify: 2019-03-21 10:44:49.707218477 +0800
Change: 2019-03-21 10:44:49.707218477 +0800
Birth: -
6.touch命令:创建空文件和刷新时间
[root@elroy first]# ll test6.sh
-rw-r--r--. 1 root root 0 Mar 21 11:03 test6.sh
7.cp命令:复制文件和目录
[root@elroy first]# cp test6.sh ../
[root@elroy first]# pwd
/root/meng/first
[root@elroy first]# cd ..
[root@elroy meng]# ll
total 0
drwxr-xr-x. 2 root root 107 Mar 21 11:03 first
-rw-r--r--. 1 root root 0 Mar 21 11:04 test6.sh
加入-R递归,注意meng和meng/的区别
[root@elroy cc]# cp -R ~/meng/ ./
[root@elroy cc]# ls
meng
cp也可以用作重命名
[root@elroy meng]# cp test6.sh test6.sh.bak
[root@elroy meng]# ls
first test6.sh test6.sh.bak
复制meng/到cc下并重命名
[root@elroy cc]# ls
meng
[root@elroy cc]# cd ./meng/ ./meng.bak
[root@elroy meng]# ls
first test6.sh test6.sh.bak
8.mv命令:移动文件或目录
注意:移动目录时,无需添加-R递归选项,要与cp命令区别。
[root@elroy ~]# mv meng/ cc/meng/first/meng.bak
[root@elroy ~]# ll ~/cc/meng/first/meng.bak
total 0
drwxr-xr-x. 3 root root 35 Mar 21 11:04 meng.bak
移动文件到目录
[root@elroy ~]# touch xixi.txt
[root@elroy ~]# mv xixi.txt cc/
[root@elroy ~]# ll cc/
total 0
drwxr-xr-x. 3 root root 55 Mar 21 11:10 meng
-rw-r--r--. 1 root root 0 Mar 21 11:20 xixi.txt
9.rm命令:删除文件或目录
删除目录及所有文件
[root@elroy ~]# rm -rf cc/
[root@elroy ~]# ll cc
ls: cannot access cc: No such file or directory
10.mdkir命令:创建目录
创建目录a,其下包含b和c两目录,且b和c目录下都有一个目录d
[root@elroy ~]# mkdir -p a/{b,c}/d
[root@elroy ~]# ll a
total 0
drwxr-xr-x. 3 root root 15 Mar 21 11:29 b
drwxr-xr-x. 3 root root 15 Mar 21 11:29 c
11.tree命令:显示目录树
查看a
[root@elroy ~]# tree a
a
├── b
│  └── d
└── c
└── d
查看/usr/local目录树,但仅查看2级的目录深度
[root@elroy ~]# tree -L 2 /usr/local/
/usr/local/
├── bin
├── etc
├── games
├── include
├── lib
├── lib64
├── libexec
├── sbin
├── share
│  ├── applications
│  ├── info
│  └── man
└── src
13 directories, 0 files
4 directories, 0 files
12.ln命令:创建链接文件
把/usr/sbin/applygnupgdefaults文件在当前目录下创建软连接文件为applygnupgdefaults
[root@elroy ~]# ln -s /usr/sbin/applygnupgdefaults applygnupgdefaults
[root@elroy ~]# ll
total 32
drwxr-xr-x. 4 root root 24 Mar 21 11:29 a
-rw-------. 1 root root 1783 Mar 18 17:11 anaconda-ks.cfg
lrwxrwxrwx. 1 root root 28 Mar 21 11:41 applygnupgdefaults -> /usr/sbin/applygnupgdefaults
3.标准IO和管道
linux系统中的三种I/O设备所代表的编号分别是:标准输入(STDIN),文件描述为0,默认从键盘获取输入;标准输出(STDOUT),文件描述符为1,默认输出到显示屏;标准错误(STDERR),文件描述符为2,默认输出到显示屏。
I/O重定向就是为了改变默认输入、输出的位置:
>:表示标准输出覆盖重定向
>>:表示标准输出追加重定向;
2>:表示错误输出覆盖重定向;
2>>:表示错误输出追加重定向;
&>:表示合并标准输出和错误输出覆盖重定向;
&>>:表示合并标准输出和错误输出追加重定向;
2>&1:表示意义同&>即合并标准输出和错误输出覆盖重定向;
<:输入重定向
<<:多行输入
set -C:禁止覆盖重定向
>|:强制覆盖重定向(set -C相反)
set +C:解除禁止覆盖重定向的设置
|: 打前一个命令的执行结果当做后一个命令的输入
1.重定向
把/etc/fstab文件内容重定向到/tmp目录下文件名为fstab.out
[root@elroy ~]# cat /etc/fstab > /tmp/fstab.out
把hello world追加到/tmp/fstab.out文件尾部
[root@elroy ~]# echo "hello word" >> /tmp/fstab.out
禁止覆盖重定向和强制重定向
[root@elroy ~]# set -C
[root@elroy ~]# echo "hello" > /tmp/fstab.out
-bash: /tmp/fstab.out: cannot overwrite existing file
设置禁止覆盖重定向后,可强制覆盖重定向
[root@elroy ~]# echo "hello" >| /tmp/fstab.out
[root@elroy ~]# cat /tmp/fstab.out
hello
解除禁止覆盖重定向设置
[root@elroy ~]# set +C
[root@elroy ~]# echo "www.baidu.com" > /tmp/fstab.out
[root@elroy ~]# cat /tmp/fstab.out
www.baidu.com
把标准错误覆盖重定向到which.out文件
先看下只重定向标准输出的情况:
[root@elroy ~]# whch cat > /tmp/which.out
bash: whch: command not found...
[root@elroy ~]# cat /tmp/which.out
[root@elroy ~]#
再看把标准错误重定向的情况:
[root@elroy ~]# whch cat 2> /tmp/which.out
[root@elroy ~]# cat /tmp/which.out
bash: whch: command not found...
把标准错误和标准输出分别覆盖定向到不同的文件里,即标准错误重定向到falt.txt文件,标准输出重定向到correct.txt
[root@elroy ~]# which cat 2> falt.txt > correct.txt
[root@elroy ~]# cat correct.txt
/usr/bin/cat
[root@elroy ~]# cat falt.txt
[root@elroy ~]# wh cat 2> falt.txt > correct.txt
[root@elroy ~]# cat falt.txt
bash: wh: command not found...
[root@elroy ~]# cat correct.txt
合并标准输出和标准错误覆盖重定向到out.txt文件里
[root@elroy ~]# which cat &> out.txt
[root@elroy ~]# cat out.txt
/usr/bin/cat
[root@elroy ~]# hich cat &>> out.txt
[root@elroy ~]# cat out.txt
/usr/bin/cat
bash: hich: command not found...
&>等价于2&>1,功能同上例
[root@elroy ~]# which cat > out.txt 2>&1
[root@elroy ~]# cat out.txt
/usr/bin/cat
[root@elroy ~]# wich cat >> out.txt 2>&1
[root@elroy ~]# cat out.txt
/usr/bin/cat
bash: wich: command not found...
2.输入重定向和tr命令
tr命令是把字符集1转换为字符集2
用输入重定向的方式,把所有小写字母转换为大写
[root@elroy ~]# cat /etc/issue
\S
Kernel \r on an \m
[root@elroy ~]# tr a-z A-Z < /etc/issue
\S
KERNEL \R ON AN \M
从文件导入标准输入
把out.txt文件里的内容,写到file.txt文件里
[root@elroy ~]# cat > file.txt < out.txt
[root@elroy ~]# cat file.txt
/usr/bin/cat
bash: wich: command not found...
多行输入:<<终止词
屏幕随便输入几行内容,遇到END字样结尾后,屏幕内容自动保存在f1.txt里
[root@elroy ~]# cat > f1.txt << END
> first
> scond
> third
> END
[root@elroy ~]# cat f1.txt
first
scond
third
3.管道符:|
把echo输出的内容,传递给tr命令,实现小写字母转成为大写字母
[root@elroy ~]# echo "this is test line" | tr a-z A-Z
THIS IS TEST LINE
4.用户组和权限管理
用户user
Linux用户:Username/UID
管理员:root,0
普通用户:1-65535
系统用户:1-499,1-999(CentOS7)
对守护进程获取资源进行权限分配
登录用户:500+,1000+(CentOS7)
交互式登录
组group
Linux组:Groupname/GID
管理员组:root,0
普通组:
系统组:1-499,1-999(CentOS7)
普通组:500+,1000+(CentOS7)
进程所能够访问资源的权限取决于进程的运行者的身份
组的类别
Linux组的类别
用户的主要组(primary group)
用户必须属于一个且只有一个主组
组名同用户名,且仅包含一个用户,私有组
用户的附加组(supplementary group)
一个用户可以属于零个或多个辅助组
用户和组的配置文件
/etc/passwd:用户及其属性信息(名称、UID、主组ID等)
/etc/group:组及其属性信息
/etc/shadow:用户密码及相关属性
/etc/gshadow:组密码及相关属性
passwd文件格式
login name:登录用户(meng)
passwd:密码(x)
UID:用户身份编码(1000)
GID:登录默认所在组编号(1000)
GECOS:用户全名或注释
home directory:用户主目录(/home/wang)
shell:用户默认使用shell(/bin/bash)
shadow文件格式
登录用户名
用户密码,一般用sha512加密
从1970年1月1日起到密码最近一次被更改的时间
密码再过几天可以被变更(0表示随时可被改变)
密码再过几天必须被变更(99999表示永不过期)
密码过期前几天系统提醒用户(默认为一周)
密码过去几天后账号会被锁定
从1970年1月1日算起,多少天后账号失效。
group文件格式
群组名称:就是群组名称
群组密码:通常不需要设定,密码是被记录在/etc/gshadow
GID:就是群组的ID
以当前组为组家组的用户列表(分隔符为逗号)
gshdow文件格式
群组名称:就是群组名称
群组密码:
组管理员列表:组管理员的列表,更改组密码和成员
以当前组为附加组的用户列表:(分隔符为逗号)
用户和组管理命令
用户管理命令
useradd
usermod
userdel
组账号维护命令
groupadd
groupmod
groupdel
用户创建:useradd
useradd [options]LOGIN
-u UID
-o 配合-u选项,不检查UID的唯一性
-g GID:指明用户所属基本组,可为组名,也可以GID
-c "COMMENT":用户的注释信息
-d HOME_DIR:以指定的路径(不存在)为家目录
-s SHELL:指明用户默认shell程序
可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...]:为用户指明附加组,组须事先存在
-N 不创建用组做主组,使用users组做主组
-r 创建系统用户CentOS 6:ID<500,CentOS 7:ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
用户属性修改:usermod
usermod[OPTION]login
-u UID:新UID
-g GID:新主组
-G GROUP1[,GROUP2,...[,GROUPN]]:新附加组,原来的附加组将会被覆盖;
若保留原有,则要同时使用-a选项
-s SHELL:新的默认SHELL
-c 'COMMENT':新的注释信息
-d HOME:新家目录不会自动创建;若要创建新家目录并移动原家目录数据,同时使用-m选项
-l login_name:新的名字;
-L lock指定用户,在/etc/shadow 密码栏的增加!
-U unlock指定用户,将/etc/shadow密码栏的!拿掉
-e YYYY-MM-DD:指明用户账号过期日期
-f INACTIVE:设定非活动期限
删除用户
userdel[OPTION]...login
-r :删除用户家目录
id可以用来显示用户的相关信息
-u:显示UID
-g:显示GID
-G:显示用户所属的组的ID
切换用户或以其他用户身份执行命令
su[options...][-][user[args...]]
切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录
su -UserName:登录式切换,会读取目标用户的配置文件,切换至家目录,完全切换
root su 至其他用户无需密码;非root用户切换时需要密码
换个身份执行命令:
su[-]UserName -c 'COMMAND'
选项:-l --login
su -l USERName 相当于su - UserName
设置密码
passwd[OPTIONS]UserName:修改指定用户的密码
常用选项:
-d:删除指定用户密码
-l:锁定指定用户
-u:解锁指定用户
-e:强制用户下次登录修改密码
-f:强制操作
-n mindays:指定最短使用期限
-x maxdays:最大使用期限
-w warndays:非活动期限
-i inactivedays:非活动期限
--stdin:从标准输入接受用户密码
!!!!!!!!!!!!!!!!echo "PASSWORD" | passwd --stdin USERNAME
更改组密码
组密码:gpasswd
gpasswd[OPTION]GROUP
-a user 将user添加至指定组中
-d user 从指定组中移除用户user
-A user1,user2, 设置有管理权限的用户列表
newgrp命令:临时切换主组
如果用户本不属于此组,则需要组密码
文件权限:
|-rw-r--r--.| 1 |root| root| 1978 |Mar 18 17:13 |initial-setup-ks.cfg|
|---|---|---|---|---|---|---|
|权限|引用计数|所有者|所属组|大小|创建时间|文件名|
文件属性操作
chown 设置文件的所有者
chgrp设置文件的属组信息
文件权限
文件的权限主要针对三类对象进行定义
owner:属主,u
group:属组,g
other:其他,o
每个文件每类访问者都定义了三种权限
r:readable
w:writable
x:excutable
文件:
r:可使用文件查看类工具获取其内容
w:可修改其内容
x:可以把此文件提请内核启动为一个进程
目录:
r:可以使用ls查看此目录中文件列表
w:可在此目录中创建文件,也可删除此目录中的文件
x:可以使用ls -l查看此目录中文件列表,可以cd进入此目录
|权限项|文件类型|读|写|执行|读|写|执行|读|写|执行|
|---|---|---|---|---|---|---|---|---|---|---|
|字符表示|(d|l|c|s|p)|r|w|x|r|w|x|r|w|x|
|数字表示| |4|2|1|4|2|1|4|2|1|
文件权限操作命令
chmod
1、useradd创建用户,并用id查看
[root@elroy ~]# useradd liubei
[root@elroy ~]# useradd zhangfei
[root@elroy ~]# useradd guanyu
[root@elroy ~]# id liubei
uid=1002(liubei) gid=1002(liubei) groups=1002(liubei)
创建apache的用户,默认shell为/sbin/nolgoin且不创建家目录
[root@elroy ~]# useradd -s /sbin/nologin -M apache
2、groupadd命令:添加组
-g GID:指定GID号;
-r:创建系统组
CentOS 6:ID<500
CentOS 7:ID<1000
[root@elroy ~]# groupadd develop
3.chown命令:修改文件所属关系
[root@elroy ~]# mkdir -p /home/app/run/apache/{log,htdoc,conf}
[root@elroy ~]# chown -R apache:apache /home/app/run/apache/
[root@elroy ~]# ll /home/app/run/apache/
total 0
drwxr-xr-x. 2 apache apache 6 Mar 21 17:58 conf
drwxr-xr-x. 2 apache apache 6 Mar 21 17:58 htdoc
drwxr-xr-x. 2 apache apache 6 Mar 21 17:58 log
[root@elroy ~]# ll /home/app/run/
total 0
drwxr-xr-x. 5 apache apache 42 Mar 21 17:58 apache
注意:chown -R apache.apache 等价于chown -R apache:apache
4.chmod命令:改变文件权限
修改权限为属主添加写和执行权限、属组没有读权限其他人有读和执行权限
[root@elroy ~]# touch 1.sh
[root@elroy ~]# ll 1.sh
-rw-r--r--. 1 root root 0 Mar 21 18:02 1.sh
[root@elroy ~]# chmod u+wx,g-r,o=rx 1.sh
[root@elroy ~]# ll 1.sh
-rwx---r-x. 1 root root 0 Mar 21 18:02 1.sh
递归设置testdir目录权限为:属组添加可读可写可执行权限
[root@elroy testdir]# chmod -R g=rwX testdir/
[root@elroy ~]# ll testdir/
total 0
drwxrwxr-x. 2 root root 6 Mar 21 18:57 meng
设置文件1.sh权限为只有属主有读写权限
[root@elroy ~]# ll 1.sh
-rwx---r-x. 1 root root 0 Mar 21 18:02 1.sh
[root@elroy ~]# chmod 600 1.sh
[root@elroy ~]# ll 1.sh
-rw-------. 1 root root 0 Mar 21 18:02 1.sh
5.passwd命令:设置用户密码
修改用户elroy的登录密码
[root@elroy ~]# passwd elroy
Changing password for user elroy.
New password:
6.su命令:切换用户
完全切换elroy用户身份
[root@elroy ~]# su - elroy
Last login: Thu Mar 21 16:08:00 CST 2019 on pts/0
[elroy@elroy ~]$ id
uid=1000(elroy) gid=1000(elroy) groups=1000(elroy) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
不完全切换到elroy用户身份
[root@elroy elroy]# su elroy
[elroy@elroy ~]$ id
uid=1000(elroy) gid=1000(elroy) groups=1000(elroy) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
7.SUID权限设置
设置二进制可执行程序文件chmod拥有suid权限
[elroy@elroy ~]$ cp /usr/bin/chmod ./
[elroy@elroy ~]$ ll chmod
-rwxr-xr-x. 1 elroy elroy 58656 Mar 21 19:21 chmod
[elroy@elroy ~]$ chmod u+s chmod
[elroy@elroy ~]$ ll chmod
-rwsr-xr-x. 1 elroy elroy 58656 Mar 21 19:21 chmod
取消二进制可执行程序文件chmod拥有的suid权限
[elroy@elroy ~]$ chmod u-s chmod
[elroy@elroy ~]$ ll chmod
-rwxr-xr-x. 1 elroy elroy 58656 Mar 21 19:21 chmod
8.SGID权限设置
设置二进制可执行程序文件chmod拥有sgid权限
[elroy@elroy ~]$ clear
[elroy@elroy ~]$ chmod g+s chmod
[elroy@elroy ~]$ ll chmod
-rwxr-sr-x. 1 elroy elroy 58656 Mar 21 19:21 chmod
取消二进制可执行程序文件chmod拥有的sgid权限
[elroy@elroy ~]$ chmod g-s chmod
[elroy@elroy ~]$ ll chmod
-rwxr-xr-x. 1 elroy elroy 58656 Mar 21 19:21 chmod
对testdir目录设置sgid权限,作为协同目录
[root@elroy ~]# ll -d testdir/
drwxrwxr-x. 3 root root 18 Mar 21 18:57 testdir/
[root@elroy ~]# chmod g+s testdir/
[root@elroy ~]# ll -d testdir/
drwxrwsr-x. 3 root root 18 Mar 21 18:57 testdir/
取消testdir目录sgid权限
[root@elroy ~]# chmod g-s testdir/
[root@elroy ~]# ll -d testdir/
drwxrwxr-x. 3 root root 18 Mar 21 18:57 testdir/
9.sticky权限设置
对testdir目录设置sticky权限,实现只有文件的所有者或root才能删除该目录下的文件
[root@elroy ~]# ll -d testdir/
drwxrwxr-x. 3 root root 18 Mar 21 18:57 testdir/
[root@elroy ~]# chmod o+t testdir/
取消sticky权限
[root@elroy ~]# ll -d testdir/
drwxrwxr-t. 3 root root 18 Mar 21 18:57 testdir/
[root@elroy ~]# chmod o-t testdir/
10.acl特殊权限
在/testdir/dir里创建的新文件自动属于g1组,组g2的成员如:alice能对这些文件有读写权限,组g3的成员如果:tom只能对新文件有读权限,其他用户(不属于g1,g2,g3)不能访问这个文件夹。
[root@elroy ~]# setfacl -Rm g:g1:rwx /testdir/dir/
[root@elroy ~]# setfacl -m d:g:g1:rwx /testdir/dir/
[root@elroy ~]# setfacl -m d:u:tom:r-- /testdir/dir/
[root@elroy ~]# setfacl -m d:u:alice:rw- /testdir/dir/
5.文本处理工具
学会文本处理工具会让运维在使用linux中事半功倍,主要的工具有:
正则表达式、扩展正则表达式、vim、grep、sed、文件内容less和cat、文件截取head和tail、按列抽取cut、按关键字抽取grep
cat是用来查看文件内容直接输出的命令:
cat,tac(反向输出),rev
cat [OPTION]...[FILE]
-E:显示行结束符$
-n:对显示出的每一行进行编号
-A:显示所有控制符
-b:非空行编号
-s:压缩连续的空行成一行
1.cat命令:查看文件全部内容
[root@elroy ~]# cat 1.sh
11
22
33
44
55
66
77
88
99
10
more:分页查看文件
more [OPTIONS...] FILE...
-d:显示翻页及退出提示
less:一页一页地查看文件或STDIN输出查看时有用的命令包括(是man命令使用的分页器)
/文本 搜索 文本
n/N 跳到下一个或上个匹配
2.less命令:分页显示文件内容
[root@elroy ~]# less /var/log/messages
按Q退出
head:用来从头显示
head[OPTION]...[FILE]...
-c &:指定获取前&字节
-n &:指定获取前&行
-# : 指定行数
3.head命令:查看文件首部的内容
[root@elroy ~]# head -3 1.sh
11
22
33
tail:用来从后显示
tail[OPTION]...[FILE]...
-c &:指定获取前&字节
-n &:指定获取前&行
-# : 指定行数
-f:跟踪显示文件fd新追加的内容,常用日志监控相当于--follow=descriptor
-F:跟踪文件名,相当于follow=name --retry
4.tail命令:查看文件尾部的内容
[root@elroy ~]# tail -3 1.sh
88
99
1010
加入-f选项可以随时查看1.sh文件尾部追加的内容,按ctrl+c键退出
[root@elroy ~]# tail -f 1.sh
11
22
33
44
55
66
77
88
99
1010
101001
cut[OPTION]...[FILE]...
-d DELIMITER:指明分隔符,默认tab
-f FILEDS:
#:第#个字段
#,#[,#]:离散的多个字段,例如1,3,6
#-#:连续的多个字段,例如1-6
混合使用:1,-3,7
-c 按字符切割
--output-delimiter=STRING指定输出分隔符
6.cut命令:按列抽取文本内容
查看第一行,以冒号为分隔符取第7段
[root@elroy ~]# head -1 /etc/passwd | cut -d: -f7
/bin/bash
[root@elroy ~]# cut -c2-5 /etc/passwd | tail -5
hang
uany
pach
lice
om:x
7.past合并两个文件同行号的列到一行
paste[OPTION]...[FILE]...
-d:分隔符:指定分隔符,默认用TAB
-s:所有行合成一行显示
paste f1 f2
paste -s f1 f2
[root@elroy ~]# cat 1.sh 2.sh
zhangfei:x:1003:1003::/home/zhangfei:/bin/bash
guanyu:x:1004:1004::/home/guanyu:/bin/bash
apache:x:1005:1005::/home/apache:/sbin/nologin
alice:x:1006:1008::/home/alice:/bin/bash
tom:x:1007:1009::/home/tom:/bin/bash
12
123
34
1234
1
2344
1324
1324
[root@elroy ~]# paste 1.sh 2.sh
zhangfei:x:1003:1003::/home/zhangfei:/bin/bash 12
guanyu:x:1004:1004::/home/guanyu:/bin/bash 123
apache:x:1005:1005::/home/apache:/sbin/nologin
alice:x:1006:1008::/home/alice:/bin/bash 34
tom:x:1007:1009::/home/tom:/bin/bash 1234
1
2344
1324
1324
sort可以将文件排序,不改变原始文件
sort[options]file(s)
-r 执行反方向(由上至下)整理
-R 随机排序
-n 执行按数字大小整理
-f 选项忽略(fold)字符串中的字符大小写
-u 选项(独特,unique)删除输出中的重复行
-t c 选项使用c作为字符界定符
-k X 选项按照使用c字符分隔的X列来整理能够使用多次
8.sort命令:文本排序
以1.sh文件一行内容的空格分隔,按第三段从大到小排序
[root@elroy ~]# sort -k3 -r 1.sh
99
88
77
66
55
44
33
22
11
101001
1010
wc命令:统计单次,行,字节和字符总数
wc [OPTION]...[FILE]...
-l 只计行数
-w 单次总数
-c 字节总数
-m 字符总数
-L 显示文件中最长行的长度
9.wc命令:文本数据统计
统计/etc/pass文件有多少行
[root@elroy ~]# cat /etc/passwd | wc -l
51
uniq命令:从输入中删除前后相接的重复的行
uniq[OPTION]...[FILE]...
-C:显示每行重复出现的次数
-d:仅显示重复过的行
-u:仅显示不曾重复过得行
注:连续且完全相同就是重复
常和sort命令一起配合使用:
sort userlist.txt | uniq -c
10.uniq命令:文本去重,-c为显示去重多少行
[root@elroy ~]# uniq -c 3.sh
3 111
1 222
1 333
grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep [OPTIONS]PATTERN[FILE...]
--color=auto:对匹配到的文本着色显示
-m # 匹配次后停止
-v 显示不被pattern匹配到的行
-I 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默输出
-A # after,后#行
-B # before,前#行
-C #context,前后各#行
-e 实现多个选项间的逻辑or关系
grep -e 'cat' -e 'dog' file
-w 匹配整个单词
-E 匹配整个单词
-F 相当于fgrep,不支持正则表达式
查看3.sh中除了111的行
11.[root@elroy ~]# grep -v 111 3.sh
222
333
显示/etc/passwd文件中以bash结尾的行
12.[root@elroy ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
elroy:x:1000:1000:elroy:/home/elroy:/bin/bash
wang:x:1001:1001::/home/wang:/bin/bash
liubei:x:1002:1002::/home/liubei:/bin/bash
zhangfei:x:1003:1003::/home/zhangfei:/bin/bash
guanyu:x:1004:1004::/home/guanyu:/bin/bash
alice:x:1006:1008::/home/alice:/bin/bash
tom:x:1007:1009::/home/tom:/bin/bash
13.[root@elroy ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
显示/etc/passwd文件中以bash结尾的行
14.[root@elroy ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
elroy:x:1000:1000:elroy:/home/elroy:/bin/bash
wang:x:1001:1001::/home/wang:/bin/bash
liubei:x:1002:1002::/home/liubei:/bin/bash
zhangfei:x:1003:1003::/home/zhangfei:/bin/bash
guanyu:x:1004:1004::/home/guanyu:/bin/bash
alice:x:1006:1008::/home/alice:/bin/bash
tom:x:1007:1009::/home/tom:/bin/bash
找出"ldd /usr/bin/cat"命令的结果中的文件路径
15.[root@elroy ~]# ldd /usr/bin/cat | grep -o '/[^[:space:]]\+'
/lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2
找出ifconfig命令结果中所有IPv4地址
16.[root@elroy ~]# ifconfig ens33 | grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"
192.168.126.7
255.255.255.0
192.168.126.255
将此字符串:wlcome to xixiheiheiheihei linux中的每个字符去重并排序,重复次数多的排到前面
17.[root@elroy ~]# echo "wlcome to xixiheiheiheihei linux" | grep -o "." | sort |uniq -c | sort -nr
7 i
5 e
4 h
3 x
3
2 o
2 l
1 w
1 u
1 t
1 n
1 m
1 c
使用egrep取出/etc/rc.d/init.d/functions路径的目录名
18.[root@elroy ~]# echo /etc/rc.d/init.d/functions |egrep -o "^[/].*/"
/etc/rc.d/init.d/
Stream EDitor,行编辑器
sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓存区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,然后读入厦航,执行下一个循环。如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,指导文件末尾。文件内容并没有改变,除非你是用重定向存储输出。
功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
参考:http://www.gnu.org.software/sed/manual/sed.html
sed工具
用法:
sed[option]...'script' inputfile
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e:多点编辑
-f:/PATH/SCRIPT_FILE:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:bak:备份文件并原处编辑
script:
'地址命令'
地址定界:
1.不给地址:对全文进行处理
2.单地址:
#:指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
3.地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
4.~:步进
1-2 奇数行
2-2 偶数行
编辑命令:
d:删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a [\]text:在指定行后面追加文本,支持使用\n实现多行追加
i[\]text:在行前面插入文本
c][\]text:替换行为单行或多行文本
w /path/somefile:保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=:为模式空间中的行打印行号
!:模式空间匹配行取反处理
s///:查找替换,支持使用其他分隔符,s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /PATHN/TO/SOMEFILE:将替换成功的行保存至文件中
利用sed 取出ifconfig ens33命令中本机的IPV4地址
19.[root@elroy ~]# ifconfig ens33 | sed -r '2!d; s@(.*inet )(.*)(netmask.*)@\2@'
192.168.126.8
删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
20.[root@elroy ~]# sed -r 's/^#[[:blank:]]+//'g /etc/fstab
#
/etc/fstab
Created by anaconda on Mon Mar 18 16:56:35 2019
#
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=d2d48239-a754-4075-977f-89474aeba0b7 / xfs defaults 0 0
UUID=bf586c49-d3d5-47a4-94c7-4449e8574026 /boot xfs defaults 0 0
UUID=1cd32e35-43bc-415f-8efa-ea9db0c27831 /data xfs defaults 0 0
UUID=d5826232-f085-44d2-bf8b-1784cd7e4f5d swap swap defaults 0 0
把/etc/httpd/conf/httpd.conf文件内的Linsten 80改为Listen 8081
21.[root@elroy ~]# sed -r 's/Listen 80/Listen 8081/' /etc/httpd/conf/httpd.conf
把pets文件中所有的dog修改为cat
22.[root@elroy ~]# cat pets
1 dog
2 cat
3 dog
4 cat
[root@elroy ~]# cat pets | sed "s/dog/cat/"
1 cat
2 cat
3 cat
4 cat
23.删除pets中第二行、仅显示pets文件的第二行
[root@elroy ~]# cat pets | sed "2d"
1 dog
3 dog
4 cat
[root@elroy ~]# sed -n '2p' pets
2 cat
24.显示pets文件中,包含2或4的行之间的所有行
[root@elroy ~]# sed -n '/2/,/4/p' pets
2 cat
3 dog
4 cat
25.显示pets文件中,第1行到第3行之间的所有行
[root@elroy ~]# sed -n '1,3p' pets
1 dog
2 cat
3 dog
26.显示pets文件中第2行及后面的1行
[root@elroy ~]# sed -n '2,+1p' pets
2 cat
3 dog
27.显示pets文件中第1行和dog字符串之间的行
[root@elroy ~]# sed -n '1,/dog/p' pets
1 dog
2 cat
3 dog
28.显示pets文件的偶数行
[root@elroy ~]# sed -n '2~2p' pets
2 cat
4 cat
29.在pets文件的第2行的下一行添加2行内容为hello和world
[root@elroy ~]# sed '2a\hello\nworld\' pets
1 dog
2 cat
hello\nworld
3 dog
4 cat
30.在pets文件的第2行的前一行添加2行内容为hello和world
[root@elroy ~]# sed '2i\hello\nworld\' pets
1 dog
hello\nworld
2 cat
3 dog
4 cat
31.把pets文件的第2行替换为hello
[root@elroy ~]# sed '2c\hello' pets
1 dog
hello
3 dog
4 cat
32.把pets文件的第1-3行内容,另存为test.txt文件
[root@elroy ~]# cat pets | sed '1,3w test.txt'
1 dog
2 cat
3 dog
4 cat
[root@elroy ~]# cat test.txt
1 dog
2 cat
3 dog
33.在第2行后读入test.txt文件
[root@elroy ~]# seq 1 5|sed '2r test.txt'
1
2
1 dog
2 cat
3 dog
3
4
5
34.不显示第2行
[root@elroy ~]# seq 1 5|sed -n '2!p'
1
3
4
5
35.把pets文件中的每行内容前都编序号显示
[root@elroy ~]# sed "=" pets
1
1 dog
2
2 cat
3
3 dog
4
4 cat