文章目录
- Linux基础
-
- 1.基础概念
- 2.基础命令
- 3.文本处理相关命令
- 4.Linux重要目录及配置
-
- [4.1etc目录下重要配置 /etc](#4.1etc目录下重要配置 /etc)
-
- 网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
- DNS配置文件/etc/resolv.conf
- 主机名配置/etc/hostname
- 本地DNS解析文件/etc/hosts
- 设备开机自动挂载配置文件/etc/fstab
- Linux内核参数设置文件/etc/sysctl.conf(了解)
- 查看RedHat版本号和名称信息文件/etc/redhat-release(了解)
- [开机自启动目录 /etc/rc.d/rc.local(比较老的方法了,默认情况下未激活,需赋予执行权限,可用下方4.5 系统环境变量配置 文件替代)](#开机自启动目录 /etc/rc.d/rc.local(比较老的方法了,默认情况下未激活,需赋予执行权限,可用下方4.5 系统环境变量配置 文件替代))
- etc重要配置文件汇总
- 4.2usr目录下重要文件及目录
-
- 编译安装软件默认的目录/usr/local/bin
- [存放系统的基础命令 /usr/bin](#存放系统的基础命令 /usr/bin)
- [存放系统的特权命令 /usr/sbin](#存放系统的特权命令 /usr/sbin)
- 4.3/var/log目录
- 4.4/proc下的重要路径知识
- 4.5系统环境变量配置文件
- 5.Linux文件属性及软链接
- 6.Linux用户管理
-
- Linux管理用户命令
- Linux管理用户组命令
- passwd修改用户密码
- 查看用户信息
- [su和su - 的区别](#su和su - 的区别)
- [sudo 普通用户权限提升](#sudo 普通用户权限提升)
- 7.Linux权限管理
- 8.正则表达式与三剑客grep,sed,awk
- 9.定时任务
- 10.磁盘管理与lvm逻辑卷管理
- 11.软件包管理与服务管理
- 12.进程管理
-
-
- ps查看系统进程状态
- [pstree 以树状图查看进程状态](#pstree 以树状图查看进程状态)
- [pidof 查看指定名称进程](#pidof 查看指定名称进程)
- top查看当前的进程状态
- [lsof 查看进程打开文件](#lsof 查看进程打开文件)
- kill家族进程管理命令
- 进程后台管理
- 系统平均负载
-
- 13.命令汇总
- 练习题(提高记忆)
Linux基础
1.基础概念
-
为什么要学Linux?
- 开源 稳定 生态丰富
- 免费!!!!!!
-
常见发行版
- CeontOS
- Ubuntu
- Debian
- RedHat
- Suse
- 麒麟 V10
- 统信
-
Linux系统 = Linux内核+GNU系统软件
-
命令提示符的含义
powershell[root@centos7-magician ~]#
[当前的用户身份@主机名 当前所在目录]用户身份
-
命令行注意事项
- 使用方法:
- 命令 选项 执行的目标
- 注意:
- 命令和选项和执行目标之间都有空格
- 使用方法:
-
Linux目录和Windows目录的区别
- Linux下一切以根目录/开始,所有目录在/目录下面
-
什么是绝对路径
-
绝对路径:
绝对路径就是以/为起点,完整的目录路径。
-
注意:
只有第一个/表示根目录,剩下的/都仅仅表示目录的层级关系
-
举例:
powershell/opt/data1/data2
/目录下有个opt目录,opt目录下又有个data1目录,data1目录下有个data2目录
-
-
什么是相对路径
-
相对路径:
就是以当前所在目录为起点,表示相对于其他目录的路径。
-
注意:
相对路径不用从/开始写,只需要从当前目录下开始写就行
-
举例:
当前在/opt/data1/下,进入data2(在当前目录下)下的data3只需要执行
-
powershell
cd data2/data3
2.基础命令
命令行快捷键
自动补全: tab
- 按1下 补全符合条件的内容
按2下 把所有符合条件的内容都列出来
移动光标
ctrl + a
移动到行首ctrl + e
移动到行尾crtl + 左右键
以单词为单位移动
快速删除
ctrl + k
删除光标及光标后面的所有内容ctrl + u
删除光标前面的所有内容
翻看历史命令
- 上下键
history
终止程序
ctrl + c
退出登录
ctrl + d
清屏
ctrl + l
查看命令帮助
- 命令
--help
命令选项的简单说明
man
命令 非常详细的说明书 - man快捷键:
- 滚动:上下键
- 查找关键词:/关键词
- 下一个关键词:n
- 上一个匹配的关键词:N
- 退出:q
alias命令别名-快捷键
-
作用
alias
自定义命令的快捷键unalias
取消别名
-
使用格式
alias 打印所有已经设置过的别名
alias 自定义命令="要替换的命令 [选项]"
unalias 取消已经设置过的别名
powershell[root@localhost ~]# 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'
pwd-类似于地图
-
命令作用
显示当前所在的绝对路径
-
使用方法
pwd
powershell
[root@localhost rh]# pwd
/opt/rh
cd-类似于传送术
-
命令作用
在不同目录之间切换
-
关键选项
-
cd ..
返回上一层
cd -
返回上一次
cd ~
返回用户家目录
cd
返回用户家目录 -
举例(使用方法
cd+路径(相对或绝对)
)cd /data1/data2/data3/data4
cd ...
cd ~
cd /data1
cd data2/data3
cd
cd ...
cd -
pwd
mkdir-类似于合成装备
-
命令作用
用来创建目录
-
命令格式
mkdir [选项] 目录名
-
关键选项
-p
递归创建目录- 如果目录已存在,不提示错误信息,也不会做任何操作
- 如果目录不存在,自动创建
-
举例
powershell
mkdir -p data1/data2/data3/data4/data5/data6
mkdir data1/data2/data3/data4/data5/data6 -p
-
注意
- 如果要创建的目录已经存在并且mkdir没有接
-p
,则会提示文件已存在
powershell[root@centos7-100 ~]# mkdir magician mkdir: cannot create directory 'magician': File exists
- 如果创建多层目录并且mkdir没有接
-p
,则需要每一层目录都存在
powershell[root@centos7-100 network-scripts]# mkdir data1/data2/data3 mkdir: cannot create directory 'data1/data2': No such file or directory
- 如果要创建的目录已经存在并且mkdir没有接
touch-创建文件
-
命令作用
- 用来创建空文件
- 用来修改文件或目录的最后修改时间
-
命令格式
touch [选项] 文件
-
关键选项
-d
修改文件最后修改时间 -
举例
powershelltouch magician.txt touch -d "00:00" magician.txt
-
注意
-d
后面的时间单引号,双引号,不加引号都是可以的- 如果对一个已经存在的文件执行touch,但是不接-d选项,效果是修改这个文件
最后修改
的时间
ls-类似于查看装备
-
命令作用
显示文件或目录的信息
-
命令格式
ls [-选项] 目标文件或目录
-
常用选项
-l
显示详细信息
-h
把文件大小转换成人类可读的格式
-d
只显示目录本身的详细信息,而不是目录下面的文件信息
-t
按照文件最后修改时间进行排序,最新的在最前面
-r
按照倒叙排序
-a
把所有文件都显示出来,包含隐藏文件 -
详细信息解释
powershelldrwxr-xr-x. 2 root root 6 Nov 3 00:00 data1 -rw-r--r--. 1 root root 2 Nov 3 10:09 dudu.txt
- d或-
- -表示文件 d表示目录
- rwxr-xr-x.
- user,group,others的权限
- root
- 所属用户
- root
- 所属用户组
- 6
- 文件大小,目录的不准确,文件的准确
- Nov 3 00:00
- 修改时间
- data1
- 文件或目录名
- d或-
-
常见选项组合
-lh
-la
-lrth
-
举例
powershell[root@localhost ~]# ls -lh 总用量 8.0K -rw-------. 1 root root 1.3K 7月 18 00:37 anaconda-ks.cfg drwxr-xr-x. 2 root root 6 7月 21 21:31 data1 -rw-r--r--. 1 root root 1.4K 7月 17 16:40 initial-setup-ks.cfg [root@localhost ~]# ls -la 总用量 44 dr-xr-x---. 6 root root 4096 7月 21 21:31 . drwxr-xr-x. 17 root root 4096 7月 21 21:07 .. -rw-------. 1 root root 1293 7月 18 00:37 anaconda-ks.cfg -rw-r--r--. 1 root root 18 12月 29 2013 .bash_logout -rw-r--r--. 1 root root 176 12月 29 2013 .bash_profile -rw-r--r--. 1 root root 176 12月 29 2013 .bashrc drwx------. 4 root root 29 7月 21 21:09 .cache drwxr-xr-x. 3 root root 17 7月 21 21:09 .config -rw-r--r--. 1 root root 100 12月 29 2013 .cshrc drwxr-xr-x. 2 root root 6 7月 21 21:31 data1 drwx------. 3 root root 24 7月 17 16:39 .dbus -rw-r--r--. 1 root root 1344 7月 17 16:40 initial-setup-ks.cfg -rw-r--r--. 1 root root 129 12月 29 2013 .tcshrc -rw-------. 1 root root 650 7月 17 17:02 .viminfo -rw-------. 1 root root 67 7月 21 21:09 .Xauthority [root@localhost ~]# ls -lrth 总用量 8.0K -rw-r--r--. 1 root root 1.4K 7月 17 16:40 initial-setup-ks.cfg -rw-------. 1 root root 1.3K 7月 18 00:37 anaconda-ks.cfg drwxr-xr-x. 2 root root 6 7月 21 21:31 data1
tree-打印目录层级结构
-
安装命令
yum install tree -y
-
命令格式
tree [选项] 目标路径
-
重要选项
-L n
指定只显示n层目录-h
显示层级关系的同时显示文件大小
-
示例
powershellmagician@magician-virtual-machine:~$ tree -L 1 #只显示一层 . ├── Desktop ├── Documents ├── Downloads ├── Music ├── Pictures ├── Public ├── Templates ├── test.sh ├── Videos ├── VMwareTools-10.3.21-14772444.tar.gz └── 太酷啦.txt 8 directories, 3 files magician@magician-virtual-machine:~$ tree -hL 1 . ├── [4.0K] Desktop ├── [4.0K] Documents ├── [4.0K] Downloads ├── [4.0K] Music ├── [4.0K] Pictures ├── [4.0K] Public ├── [4.0K] Templates ├── [ 32] test.sh ├── [4.0K] Videos ├── [ 54M] VMwareTools-10.3.21-14772444.tar.gz └── [ 0] 太酷啦.txt 8 directories, 3 files
cp-复制命令
-
命令作用
- 复制文件或目录
-
命令格式
cp [选项] 源文件或目录 目标文件或目录
-
重要选项
-i
覆盖前提示
-r
递归复制目录及目录以下的内容,copy directories recursively
-a
递归复制目录及文件并保持原有的所有属性 -
注意
-
如果一条命令,使用的是绝对路径,那么
命令别名
失效比如:
/bin/cp 123.txt 1.txt
-
如果一条命令,在最前面添加\,那么命令别名失效
比如:
\cp 123.txt 1.txt
-
-
练习
touch file1.txt
cp file1.txt file2.txt
mkdir dir1
touch dir1/file3.txt
cp -a dir1 dir2
tree
-
思考
-
[root@centos7-100 ~]# \ll
-bash: ll: command not found
-
[root@centos7-100 ~]# cp data1 data2
cp: omitting directory 'data1'
-
[root@centos7-100 ~]# cp data3 data2
cp: cannot stat 'data3': No such file or directory
-
-
已知dir1 和 data1已存在(理解下面的区别)
cp -a dir1 data1
cp -a dir1/ data1
cp -a dir1 data1/
cp -a dir1/ data1/
cp -a dir1 data2/
cp -a dir1 data2/
cp -a dir1 data2/
\cp -a dir1 data2/
-
总结:
-
第一种情况:复制的目标目录已存在
结论:将源目录复制到目标目录下
-
第二种情况:复制的目标目录不存在
结论:将源目录复制一份并改名目标目录,结构和源目录一样
-
第三种情况:复制的目标目录已存在,并且目录下有重名的文件
结论:会提示是否覆盖
-
mv-移动命令
-
命令作用
- 将文件或目录移动到目标路径
- 改名,如果目标目录或文件不存在
-
命令格式
mv [选项] 源文件 目标路径
-
注意
mv 可以直接移动目录
-
思考
目录和文件不能在同一个层级下同名
powershell
[root@localhost ~]# mv data2 /opt
mv:是否覆盖"/opt/data2"? y
mv: 无法以非目录来覆盖目录"/opt/data2"
rm-删除命令
-
命令作用
删除文件或目录
-
常用选项
-r
递归删除
-f
强制删除 -
保命技能
- -rf少用
- 可以用mv代替rm,移动文件到垃圾桶/tmp
- 当你想使用rm -rf的时候,先问自己几个问题:
- 1.我为什么要删这个文件
- 2.删了之后会有什么影响?
- 3.删了之后是否可以恢复?
-
执行之前,先冷静3秒
-
思考
powershell[root@centos7-100 ~]# rm 123.txt rm: remove regular empty file '123.txt'? [root@centos7-100 ~]# rm data1 rm: cannot remove 'data1': Is a directory [root@centos7-100 ~]# rm -r data1/ rm: descend into directory 'data1/'? rm: remove regular empty file 'data1/file1.txt'? rm: remove directory 'data1/'? [root@centos7-100 ~]# rm -rf / rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe
-
练习
powershell[root@centos7-100 ~]# mkdir dir1/dir2/dir3/dir4 -p [root@centos7-100 ~]# touch dir1/file1 [root@centos7-100 ~]# touch dir1/dir2/file2 [root@centos7-100 ~]# touch dir1/dir2/dir3/file3 [root@centos7-100 ~]# touch dir1/dir2/dir3/dir4/file4 [root@centos7-100 ~]# tree . ├── 123.txt └── dir1 ├── dir2 │ ├── dir3 │ │ ├── dir4 │ │ │ └── file4 │ │ └── file3 │ └── file2 └── file1 4 directories, 5 files [root@centos7-100 ~]# [root@centos7-100 ~]# rm -r dir1/ rm: descend into directory 'dir1/'? y rm: descend into directory 'dir1/dir2'? y rm: descend into directory 'dir1/dir2/dir3'? y rm: descend into directory 'dir1/dir2/dir3/dir4'? y rm: remove regular empty file 'dir1/dir2/dir3/dir4/file4'? y rm: remove directory 'dir1/dir2/dir3/dir4'? y rm: remove regular empty file 'dir1/dir2/dir3/file3'? y rm: remove directory 'dir1/dir2/dir3'? y rm: remove regular empty file 'dir1/dir2/file2'? y rm: remove directory 'dir1/dir2'? y rm: remove regular empty file 'dir1/file1'? y rm: remove directory 'dir1/'? y [root@centos7-100 ~]#
3.文本处理相关命令
head-查看文本头N行
-
命令作用
head
查看文件前N行 -
命令格式
head -n 文件名
-
注意
如果不指定-n则默认查看前10行
-
举例
head -20 num.txt
tail-查看文本后N行
-
命令作用
- tail 查看文件后N行
-
命令格式
tail -n 文件名
-
常用选项
-n
看后n行
-f
实时显示文件最新的内容变化(常用于查看日志) -
注意
- 如果不指定-n则默认查看后10行
- 使用
-f
会卡住,不会退出,一直显示最新的变化内容
-
举例
head -20 num.txt
echo-回显命令
-
命令作用
- 在屏幕上输出内容
- 打印菜单
- 格式化输出
- 结合重定向符合向文件里写入内容
-
重要选项
-e 支持特殊符号 \n 换行 \t 制表符
-
注意事项
- 引号的问题,单引号,双引号,不加引号,单双引号
- 转义字符
-
转义字符
- 转义的意思就是还原符号本身的含义,而不是特殊符号的效果
\n --> \\特殊符号
echo -e '1\\n2'
echo -e "1\\\n2"
- 转义的意思就是还原符号本身的含义,而不是特殊符号的效果
-
引号的问题
单引号
:所见即所得,输入什么,输出什么双引号
:可以解析变量的值,同时可以限定变量的范围不加引号
:也可以解析变量的值,但是不能区分变量的范围
-
引号总结:
- 1.所见即所得,用单引号
- 2.其他所有情况,用双引号
-
举例
-
例子1:在屏幕上输出内容并支持特殊符号
powershell[root@centos7-100 ~]# echo -e "1\n2\n3" 1 2 3 [root@centos7-100 ~]# echo -e "1\n2\n3abc\n4\tABC\n5" 1 2 3abc 4 ABC 5
-
例子2:转义
powershell[root@centos7-100 ~]# echo -e '1\n2\n3\\n\n4\\t\tABC\n5' 1 2 3\n 4\t ABC 5 [root@centos7-100 ~]# echo -e "1\n2\n3\\\n\n4\\\t\tABC\n5" 1 2 3\n 4\t ABC 5
-
例子3:打印菜单
powershell[root@centos7-100 ~]# echo -e "please input num:\n1.install\n2.uninstall" please input num: 1.install 2.uninstall
-
例子4:单双引号的区别
powershell#设置一个变量 [root@centos7-100 ~]# magician="linux1" #不加引号打印变量的值 [root@centos7-100 ~]# echo $magician linux1 #双引号打印-可以解析 [root@centos7-100 ~]# echo "$magician" linux1 #单引号打印-所见即所得 [root@centos7-100 ~]# echo '$magician' $magician #双引号-可以表示变量的范围 [root@centos7-100 ~]# echo "$magician"xxxxx linux1xxxxx #不加引号-会把变量和字符串当成一个变量的整体 [root@centos7-100 ~]# echo $magicianxxxxx #不加引号-通过空格可以区分变量的表示范围 [root@centos7-100 ~]# echo $magician xxxxx linux1 xxxxx
-
例子5:单双引号组合
-
设置变量:
magician="linux1"
-
输出效果:
powershell[root@centos7-100 ~]#echo "'$magician'" '"$magician"' 'linux1' "$magician"
-
-
例子6:单双加转义
- 转义双引号"
powershell[root@centos7-100 ~]# echo "'$magician\"" '$magician' 'linux1" $magician
-
转义\
powershell[root@centos7-100 ~]# echo "'$magician\""\\ '$magician' 'linux1"\ $magician
-
例子6:生成序列
powershellecho {1..10} echo {a..z} seq 1 10
-
重定向符号 > >>
-
命令解释
-
>
输入重定向,效果会覆盖 -
>>
追加输入重定向,效果会在最后另起一行追加
-
-
注意:没有输入的情况
-
> 文件名
如果文件不存在,则会创建空文件。
如果文件存在,则会清空
-
>> 文件名
如果文件不存在,则会创建空文件。
如果文件存在,什么都不会改变
-
-
举例
-
例子1:写入内容到文件里
-
echo 123 > file1.txt
- 例子2:追加
$abc
内容文件里
- 例子2:追加
-
-
echo '$abc' >> file1.txt
-
例子3:清空文件
> file1.txt
-
cat-查看文件
-
命令作用
- 查看文件内容
- 写入多行内容到文件里
-
常用选项
-n
显示行号
-A
显示文件编码符号,windows和Unix是不一样的
EOF
写入多行文本 -
重点掌握!cat写入多行文本
-
注意:
EOF可以自定义,只要起始和终止一样就行
-
技巧:先在notepad++上写好,再复制到xshell里
-
格式:
powershellcat > 文件名 << 起始符 文本 文本 文本 .... 终止符
-
举例1:将多行文本写入文件
powershellcat > file1.txt << EOF 111 222 333 EOF
-
举例2:EOF单引号 --> 不解析变量
magician="linux1"
-
会先解析$magician,在写入文件
powershellcat > file1.txt << EOF 1 2 3 $magician EOF
-
不会先解析$magician,所见即所得
powershellcat > file2.txt << 'EOF' 1 2 3 $magician EOF
-
-
举例3:追加多行文本写入
powershellcat > file1.txt << EOF 1 2 3 EOF cat >> file1.txt << EOF a b c EOF
-
举例4:优化网卡配置文件
powershellcp /etc/sysconfig/network-scripts/ifcfg-eth0 /opt/ cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF TYPE=Ethernet NAME=eth0 DEVICE=eth0 ONBOOT=yes IPADDR=10.0.0.100 PREFIX=24 GATEWAY=10.0.0.254 DNS1=10.0.0.254 EOF
-
-
cat选项举例
-
例子1:查看文件
powershellcat /etc/passwd
-
例子2:查看文件并显示行号
cat -n /etc/passwd
-
例子3:不同系统编码不一样
powershell[root@centos7-100 ~]# cat -A linux.txt 1$ 2$ 3$ [root@centos7-100 ~]# cat -A windows.txt 1^M$ 2^M$ 3^M$
-
解决方法:
-
第一种解决方法
第1步:安装上传工具
yum install lrzsz -y
第2步:在notepad++里转换编码为UNIX
第3步:拖到Linux里
第4步:用cat -A 检查
-
第二种解决方法:
powershellyum install dos2unix -y ]# cat -A windows.txt 1^M$ 2^M$ 3^M$ ]# dos2unix windows.txt dos2unix: converting file windows.txt to Unix format ... ]# cat -A windows.txt 1$ 2$ 3$
-
-
-
-
注意!!!保命
++生产服务器上,执行cat之前,先看一下文件大小和行数++cat会把文件所有内容都打印出来,不适合查看大文件
- 如果只是看开头,用
head
- 如果只是看结尾,用
tail
- 如果看实时,用
tail -f
- 如果找关键词,用
grep
- 如果只是看开头,用
grep-过滤文本内容
-
三剑客命令
- 老大 awk
- 老二 sed
- 老三 grep
-
grep命令作用
- 过滤文本内容
-
命令格式
grep [选项] 要搜索的文本
-
重要选项
-A n
After 显示匹配行及后n行
-B n
Before 显示匹配行及后n行
-n
显示过滤出来的内容所在的行号
-v
排除包含关键词的行
-i
关键词忽略大小写 -
举例
-
例子1:找出/etc/passwd里包含root的行
grep "root" /etc/passwd
-
例子2:找出/etc/passwd里包含root的行并打印行号
grep -n "root" /etc/passwd
-
例子3:排除包含nologin的行并显示行号
grep -vn "nologin" /etc/passwd
-
例子4:查找匹配行后n行
powershell#测试数据 cat > file1.txt << EOF a b c d e EOF
-
grep -A 2 "c" file1.txt
-
例子5:查找匹配行前n行
grep -B 2 "c" file1.txt
-
例子6:查找匹配行前后n行
grep -C 1 "c" file1.txt
-
-
拓展-目前了解即可
powershell正则表达式符号 ^ 以什么开头 $ 以什么结尾 . 表示任意1个字符 * 前面的字符任意数量 .* 任意多个字符
-
练习:
-
样本:
powershellcat > file1.txt << EOF abcABC123 #abc123ABC abc123ABC ABCabc123 ABC#abc123 ABCabc#123 ABCabc123# EOF
-
例子1:查找abc开头
grep "^abc" file1.txt
-
例子2:查找123结尾
grep "123$" file1.txt
-
例子3:排除包含#的行
grep -v "#" file1.txt
-
例子4:排除以#开头的行
grep -v "^#" file1.txt
-
例子5:排除以ABC开头,中间任意,123结尾的行
grep -v "^ABC.*123$" file1.txt
-
例子6:排除空行
grep -v "^$" file1.txt
-
例子7:忽略大小写
grep -i "^ABC" file1.txt
-
wc-查看文件行数
-
wc -l 文件名
powershell[root@localhost ~]# wc -l .bashrc 12 .bashrc [root@localhost ~]# wc .bashrc 12 30 176 .bashrc
VIM-文本编辑器
-
VIM介绍
编辑器之神,上古神器
- vim是vi的增强版
yum install vim -y
-
如何让一个计算机新手打出一串随机数
答:打开VIM,然后让他退出
-
VIM工作模式
-
普通模式-快捷键模式
- VIM绝大部分的快捷键都在普通模式下生效
- 在普通模式下,字母和字符都是快捷键
-
编辑模式
- 字符和字母才是原来的意思
-
命令行模式
- 输入一些指令,比如保存和退出,搜索关键词,设置行号等
-
VIM-普通模式
-
首先备份一份网卡文件
powershellcd /opt cp /etc/sysconfig/network-scripts/ifcfg-eth0 .
移动快捷键
-
方向键
↑↓←→
,新手常用
-
hjkl
- h光标向左,l向右,j向下,k向上。(高手常用)
-
gg
- 直接跳至首行
-
G
- 直接跳至末行
-
n gg
- 直接跳至行号为n的行
-
$
- 直接跳至光标所在行的行尾
-
0(也可以
^不过更难按)
- 直接跳至光标所在行的行首
-
w
- 使光标以单词为单位向后移动,而不是一格一格移动
-
n
- 向下选中匹配的字符串
-
N
- 向上选中匹配的字符串
-
f + 关键字
- 快速定位到光标所在行,并且光标后第一个关键字的位置
复制行快捷键
-
yy
- 快速复制光标所在行
-
n yy
- 快速复制光标所在行及下方n-1行
-
P
- 粘贴复制的数据到光标所在行的下一行
-
n P
n
次粘贴复制的数据到光标所在行的下一行
-
p
大写p
,粘贴到光标所在行的前面,与小写p
相反
-
n p
- 同理
剪切行快捷键
dd
- 快速剪切光标所在行
n dd
- 快速剪切光标所在行及行后
n-1
行
- 快速剪切光标所在行及行后
替换光标所在的字符
r + 要替换的字符
- 快速替换光标选中的字符为
要替换的字符
- 快速替换光标选中的字符为
删除快捷键
- x
- 快速删除光标选中字符
- d + $
- 快速删除光标所在行的
光标至行尾字符
(包含光标所在处的字符)
- 快速删除光标所在行的
- d + 0
- 快速删除光标所在行的
光标至行首字符
(不包含光标所在处的字符)
- 快速删除光标所在行的
- dG
- 快速删除光标所在行以及其
后
所有行
- 快速删除光标所在行以及其
- dgg
- 快速删除光标所在行以及其
之前
所有行
- 快速删除光标所在行以及其
- dw
- 快速删除光标选中的单词
选中块模式
- ctrl + v + 移动键
- 进入块选择模式,然后方便进一步操作
进入编辑模式
i
- 初始定位在光标所在字符处进入编辑模式
a
- 初始定位在光标所在字符处
后一位
进入编辑模式
- 初始定位在光标所在字符处
I
- 初始定位在光标所在
行首
进入编辑模式
- 初始定位在光标所在
A
- 初始定位在光标所在
行尾
进入编辑模式
- 初始定位在光标所在
s
- 删除光标所在字符并进入编辑模式
S
- 删除光标
所在行
并定位到该行行首进入编辑模式
- 删除光标
o
- 在光标所在行下方
另起一行
进入编辑模式
- 在光标所在行下方
O
- 在光标所在行上方
另起一行
进入编辑模式
- 在光标所在行上方
撤销
u
- 撤销操作
快进
ctrl + r
- 有些东西撤销了,但我又突然又想要,就可以
ctrl+r
,它类似于u的相反操作
- 有些东西撤销了,但我又突然又想要,就可以
退出编辑模式
esc
快速加减
ctrl + a
- 快速定位至光标后所在行的第一个数字,并进行数字
加1
操作
- 快速定位至光标后所在行的第一个数字,并进行数字
ctrl + x
- 快速定位至光标后所在行的第一个数字,并进行数字
减1
操作
- 快速定位至光标后所在行的第一个数字,并进行数字
n ctrl + a
- 快速定位至光标后所在行的第一个数字,并进行数字
加n
操作
- 快速定位至光标后所在行的第一个数字,并进行数字
n ctrl + x
- 快速定位至光标后所在行的第一个数字,并进行数字
减n
操作
- 快速定位至光标后所在行的第一个数字,并进行数字
vim-命令行模式
-
进入
:
-
显示行号
:set nu
-
保存
:w
-
退出
:q
:q!
-
保存并退出
:wq!
-
取消高亮
:noh
-
搜索并高亮关键词
/关键词
-
不退出VIM执行系统命令
:!命令
-
注意事项:
++vim不要直接打开大文件,否则内存会爆掉++
总结最常用的:
poershell
echo 1 > file1.txt
cat > file1.txt << EOF
123
456
789
EOF
grep "123" file1.txt
grep -v "123" file1.txt
grep "^1" file1.txt
grep "3$" file1.txt
grep -v "^$" file1.txt
grep "^1.*3$" file1.txt
- vim:(小白记住下方即可)
- 进入编辑模式 i
- 编辑模式移动 上下左右
- 编辑模式删除 退格键
- 退出编辑模式 esc
- 保存并退出 :wq
4.Linux重要目录及配置
powershell
magician@magician-virtual-machine:~$ tree -L 1 /
/
├── bin -> usr/bin #软连接相当于/usr/bin,系统常用基础命令
├── boot #系统启动文件,没事不要碰,看都不要看
├── dev #设备文件的目录,如磁盘,光驱,U盘
├── etc #重要目录,存放的是系统的重要配置文件
├── home #普通用户家目录
├── lib -> usr/lib #启动系统和运行命令所需的共享库文件和内核模块存放目录,分为/lib和/lib64两种
├── lib64 -> usr/lib64 #和lib功能一样
├── mnt #像是一个码头,临时的存储设备可以挂载到这个目录下
├── opt #一般我们自己安装的二进制软件都放在这里
├── proc #虚拟目录,进程信息及内核信息(比如CPU,硬盘分区,内存信息等)
├── root #root用户的家目录
├── run #临时文件系统,存储系统或程序启动以来的信息,当程序或系统重启时该目录下的文件会应该重新生成
├── sbin -> usr/sbin #存放的是特权命令,普通用户一般受限使用或者不能使用
├── sys #存放一些系统文件,不要动
├── tmp #相当于垃圾回收站
├── usr #存放系统和其他程序的目录,比如命令,帮助文件等。
└── var #存放系统或软件的日志文件
精简之后:
精简的:
1.Linux重要目录讲解
/
├── bin -> usr/bin #软连接相当于/usr/bin,系统常用基础命令
├── boot #系统启动文件,没事不要碰,看都不要看
├── dev #设备文件的目录,如磁盘,光驱,U盘
├── etc #重要目录,存放的是系统的重要配置文件
├── home #普通用户家目录
├── mnt #像是一个码头,临时的存储设备可以挂载到这个目录下
├── opt #一般我们自己安装的二进制软件都放在这里
├── proc #虚拟目录,进程信息及内核信息(比如CPU,硬盘分区,内存信息等)
├── root #root用户的家目录
├── run #临时文件系统,存储系统或程序启动以来的信息,当程序或系统重启时该目录下的文件会应该重新生成
├── sbin -> usr/sbin #存放的是特权命令,普通用户一般受限使用或者不能使用
├── tmp #相当于垃圾回收站
├── usr #存放系统和其他程序的目录,比如命令,帮助文件等。
└── var #存放系统或软件的日志文件
4.1etc目录下重要配置 /etc
网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0
-
重启网卡命令
systemctl restart network
-
配置文件
powershell[root@centos7-magician ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE=Ethernet BOOTPROTO=none #网络发现协议,DHCP,static,none NAME=eth0 #网卡名称,给人看的 DEVICE=eth0 #网卡设备名称,一般和NAME一样 ONBOOT=yes #开机启动网卡 IPADDR=10.0.0.100 #IP地址 PREFIX=24 #子网掩码255.255.255.0 GATEWAY=10.0.0.254 #网络出口位置 DNS1=10.0.0.254 #主DNS域名解析系统,会自动维护/etc/resolv.conf的配置 DNS2=223.5.5.5 #备用DNS
DNS配置文件/etc/resolv.conf
powershell
[root@centos7-magician ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.0.0.254
- 此文件内容受网卡配置文件所影响,会随着网卡配置文件改变而改变
主机名配置/etc/hostname
powershell
[root@centos7-magician ~]# cat /etc/hostname
centos7-magician
- 修改主机名使用命令
hostnamectl set-hostname centos-magician
- 此命令会同步修改
/etc/hostname
文件的内容
- 此命令会同步修改
本地DNS解析文件/etc/hosts
-
自己电脑上的DNS缓存
powershell
[root@centos7-100 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
//可以自定义解析,不过只对本机有效
192.166.13.2 www.magician.com
-
解释:
相当于自己指定DNS解析规则
优先级最高,++如果本地hosts文件里有解析记录,则不向互联网DNS发起请求++
设备开机自动挂载配置文件/etc/fstab
-
目录作用
-
新增加的磁盘开机自动挂载配置
powershell[root@centos-magician ~]# grep -Ev "#|^$" /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=c52d80d0-e1cc-4456-99f7-2c3f3f616a68 /boot xfs defaults 0 0 /dev/sdb /mnt xfs defaults 0 0 #设备名 #挂载目录 #格式 #默认
- 当我们插入一块u盘或硬盘时,++dev目录下会出现对应的文件名,我们需要将其挂载到某目录下才能使用对应的存储空间++ ,而
umount
相当于windows下的弹出u盘,windows无法使用u盘,但u盘仍在电脑上。而我们手动挂载,重启后就会失效
,因此,我们需要更改此配置文件让系统自动挂载。
-
Linux内核参数设置文件/etc/sysctl.conf(了解)
- 存放系统内核参数,要对系统进行一些
参数调优或者定制
/etc/sysctl.conf
查看RedHat版本号和名称信息文件/etc/redhat-release(了解)
powershell
[root@centos-magician ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
开机自启动目录 /etc/rc.d/rc.local(比较老的方法了,默认情况下未激活,需赋予执行权限,可用下方4.5 系统环境变量配置 文件替代)
-
作用:设置开机自启动脚本或软件
-
编写脚本
powershellcat > /opt/time.sh << EOF #!/bin/bash echo "start time --->" $(date) >> /opt/time.log EOF chmod +x /opt/time.sh
-
配置开机自启动
powershellecho "/bin/bash /opt/time.sh" >> /etc/rc.local chmod +x /etc/rc.d/rc.local
-
效果
- 重启之后会在
/opt/
下生成一个日志time.log
- 重启之后会在
etc重要配置文件汇总
4.2usr目录下重要文件及目录
编译安装软件默认的目录/usr/local/bin
-
/usr/local/bin
-
为什么放在这个路径下?
因为Linux默认能识别的命令的目录就包含了
/usr/local/bin
powershell[root@centos-magician ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
存放系统的基础命令 /usr/bin
- 存放命令如:
cd
,pwd
,touch
,mv
,cp
,mv
,rm
,ls
等
存放系统的特权命令 /usr/sbin
- 存放命令如:
useradd
,usermod
,userdel
,mkfs.xfs(格式化系统磁盘命令)
等
4.3/var/log目录
-
目录作用
目录下包含了大量记录系统及软件服务运行的日志文件
-
重要日志
/var/log/secure
安全日志,记录登录信息/var/log/messages
系统日志,如系统崩溃等信息/var/log/dmesg
硬件日志信息/var/log/cron
定时任务的日志- ...
- 也有第三方软件日志
- 如:
/var/log/nginx
/var/log/redis
- 如:
4.4/proc下的重要路径知识
-
目录作用
/proc
是Linux系统下的一个重要的虚拟文件系统,记录着内核和进程方方面面的信息,是一个很重要的信息宝库
-
重要文件说明
/proc/cpuinfo
#当前CPU信息/proc/meminfo
#当前内存信息/proc/loadavg
#当前系统平均负载信息/proc/mounts
#当前设备挂载表信息 df -h信息来源- 那些命令如
df -h
等++获取数据就是从这些文件获得的,是经过美化后展示的,更加友好。++
4.5系统环境变量配置文件
-
只要一远程登录时就会自动执行加载
-
全局环境变量--谨慎操作
/etc/profile
/etc/bashrc
-
当前用户生效
.bash_profile
.bashrc
-
使用场景
- 修改PATH变量
export PATH=$PATH:路径
这是添加路径
- 优化终端显示效果
export PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[32;1m\]\H\[\e[0m\] \[\e[31;1m\]\w\[\e[0m\]]\\$ "
加到环境配置文件中即可生效
- 修改PATH变量
-
总结
- 全局环境变量对所有用户都生效
- 这些环境变量
读取
是有优先级顺序
的/etc/profile --> /etc/bashrc --> .bashrc --> .bash_profile
5.Linux文件属性及软链接
Linux文件类型
-
文件类型与拓展名介绍
- Linux里面,文件后缀名没有意义,++只是给人看的++
-
Linux下常见的文件类型说明
.txt
#文本.log
#日志.conf
#配置文件.sh
#脚本- 以上都是文本,后缀就是为了区分
.tar.gz
#压缩包.rpm
#软件包
-
查看文件原本类型
file 要查看的文件名
Linux软链接
-
什么是软链接
- 说人话就是快捷方式
-
有什么应用场景
- 1)代码目录一般使用软链接来表示不同的版本
- 2)自己安装的软件通过软链接来表示不同的版本
-
ln 软链接命令使用
ln -s 源文件 目标文件
-
实验
-
实验1:文件创建软连接
powershell[root@centos-magician ~]# echo "111" > file1.txt [root@centos-magician ~]# cat file1.txt 111 [root@centos-magician ~]# ll total 4 -rw-r--r--. 1 root root 4 Nov 8 10:27 file1.txt [root@centos-magician ~]# [root@centos-magician ~]# ln -s file1.txt file2.txt [root@centos-magician ~]# ll total 4 -rw-r--r--. 1 root root 4 Nov 8 10:27 file1.txt lrwxrwxrwx. 1 root root 9 Nov 8 10:27 file2.txt -> file1.txt [root@centos-magician ~]# file file2.txt file2.txt: symbolic link to `file1.txt'
-
实验2:软链接文件读写测试
powershell[root@centos-magician ~]# ll total 4 -rw-r--r--. 1 root root 4 Nov 8 10:27 file1.txt lrwxrwxrwx. 1 root root 9 Nov 8 10:27 file2.txt -> file1.txt [root@centos-magician ~]# cat file2.txt 111 [root@centos-magician ~]# echo 222 >> file1.txt [root@centos-magician ~]# cat file2.txt 111 222 [root@centos-magician ~]# echo 333 >> file2.txt [root@centos-magician ~]# cat file1.txt 111 222 333
-
实验3:相对路径实验
powershell[root@centos-magician ~]# mkdir dir1/dir2/dir3 -p [root@centos-magician ~]# cd dir1/ [root@centos-magician ~/dir1]# echo 111 > file1.txt [root@centos-magician ~/dir1]# ll total 4 drwxr-xr-x. 3 root root 18 Nov 8 10:42 dir2 -rw-r--r--. 1 root root 4 Nov 8 10:42 file1.txt [root@centos-magician ~/dir1]# cd dir2/ [root@centos-magician ~/dir1/dir2]# ls dir3 [root@centos-magician ~/dir1/dir2]# ln -s ../file1.txt file2.txt [root@centos-magician ~/dir1/dir2]# ll total 0 drwxr-xr-x. 2 root root 6 Nov 8 10:42 dir3 lrwxrwxrwx. 1 root root 12 Nov 8 10:43 file2.txt -> ../file1.txt [root@centos-magician ~/dir1/dir2]# cat file2.txt 111
-
实验4:绝对路径实验
-
源文件绝对路径,软链接文件相对路径
ln -s /root/dir1/file1.txt file2.txt
- 源文件绝对路径,软链接文件绝对路径
ln -s /root/dir1/file1.txt /opt/file2.txt
-
-
-
应用场景
-
98% 都是同级目录 ln -s 源文件 目标软链接
-
版本更新:
创建code_v1目录
在code_v1目录下创建index.html并写入v1
在code_v1同级目录下创建code_v2
在code_v2目录下创建index.html并写入v2
在code_v1同级目录下,创建code软链接,指向code_v1
访问code/index.html
删除code软链接
在code_v1同级目录下,创建code软链接,指向code_v2
访问code/index.html
将删除软链接和创建软链接组合成一条命令
rm -rf code && ln -s code_v1 code
-
软件版本链接:
cd /opt/ mv mysql-5.7.28-linux-glibc2.12-x86_64 mysql-5.7.28 ln -s mysql-5.7.28 mysql echo 'export PATH=$PATH:/opt/mysql/bin' >> /etc/profile source /etc/profile mysql -V
-
-
总结
1)软链接文件和源文件可以不在同一个目录下
2)软链接创建好之后,如果源文件不存在了,会红底白字闪烁提示
3)如果把源文件再放回原位置,那么软链接恢复正常访问
4)如果是使用相对路径创建的软链接,只要保证源文件和软链接文件的相对关系保持一致,则不一样要在创建时的目录下。
5)如果源文件和软链接在同一个目录,使用相对路径更合适
6)如果源文件和软链接不在同一个目录,最好使用绝对路径
7)即使没有源文件,也能创建出软链接,但是无法使用
8)软链接一旦创建就不能修改了,只能删除后再重新创建
Linux文件存储inode和block(了解)
-
文件属性-不要背,了解即可
powershell[root@centos7-100 /opt]# ll -i total 0 17261296 lrwxrwxrwx. 1 root root 12 Nov 8 11:50 mysql -> mysql-5.7.28 50806056 drwxr-xr-x. 3 root root 17 Nov 8 11:41 mysql-5.7.28 17261284 drwxr-xr-x. 3 root root 17 Nov 8 11:41 mysql-8.0 文件属性解释: 50806056 inode号 d 文件类型- l d rwxr-xr-x. 权限 3 硬链接个数 root 所属用户 root 所属用户组 17 文件大小 Nov 8 11:41 修改日期 mysql-5.7.28 文件名
-
Linux里文件和目录的结构--了解即可
1)目录也是一种特殊文件,存储的是当前目录的文件名以及inode号
2)文件的文件名存放在当前目录里
3)一个文件包含三个部分,文件名(在目录里),文件属性(inode),文件内容(block)
-
什么是inode
一片存储空间,包含了以下信息:
1)文件的inode号
2)文件属性
3)文件指向的block指针
-
什么是block
1)文件在硬盘里存储的块的位置
2)一个block占有4KB大小,即使存储的数据不满足4K,也会占用4K
3)block也有自己的编号
-
删除文件原理
- Linux的文件名是存在父目录的block里面并指向这个文件的inode节点.
- 这个文件的inode节点再标记指向存放这个文件的block的数据块。
- 我们删除一个文件,实际上并不是删除inode节点和block的数据。
只是在这个文件的父目录里面的block删除这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode节点 - 当没有文件名指向这个inode节点同时没有进程调用的时候,这个inode和下面的block是无主的。
- 在磁盘检查或者有内容写入的时候会是否释放inode节点和存放这个文件的数据块,并更新inodeMAP和blockMAP今后让这些位置存放其他文件数据。
Linux打包压缩
-
打包 49%
tar zcvf xxx.tar.gz xxx
-
解压 49%
tar zxvf xxx.tar.gz -C /xxx/
Linux和Windows常见压缩包格式
-
什么叫压缩包
简单来讲就是将很多文件打包压缩成一个文件
-
为什么需要压缩包
源文件比较大,传输不方便
源文件比较多,传输不方便
备份文件,不会经常访问
-
windows下常见压缩包格式:
*.zip
*.rar
*.7z
-
Linux下常见压缩包格式
*.zip
99% windows传过来的*.tar.gz
99% Linux自己打包的
Linux下常见打包压缩命令
-
tar打包压缩 !!!必须掌握!!!
-
命令格式
-
如果是打包压缩
tar [选项] 打包后的名字 要打包压缩的文件或目录
-
如果是解压缩
tar [选项] 需要解压的压缩包
-
-
重要选项
c
创建一个压缩包
v
显示打包压缩时的详细信息
f
指定压缩包的名称,如果有多个参数
z
指定使用gzip压缩算法,一般后缀名为.gz
x
解压缩
h
保留软链接的真实文件
t
仅列出压缩包里的文件名而不解压
--exclude=
排除不需要打包的文件
-C
解压到指定目录下 -
常用打包压缩命令组合--必须掌握
-
tar zcvf 压缩包名字.tar.gz 需要压缩的文件
-
c
打包
z
gzip压缩算法 --> 抽空
v
显示压缩过程中的详细信息
f
指定压缩包的名称,如果有多个参数
-
-
常用解压缩命令组合--必须掌握
-
tar zxvf 压缩包名字.tar.gz
-
x
解压
z
gzip压缩算法 --> 充气
v
显示压缩过程中的详细信息
f
指定压缩包的名称,如果有多个参数
-
-
打包压缩中的坑--良好习惯
[root@centos-magician ~]# tar zcf etc1.tar.gz /etc/
tar: Removing leading `/' from member names
-
总结:
1)++解压缩的时候文件如果已存在会覆盖并且没有任何提示++
2)解压缩的时候,如果目录已经存在,会合并并没有任何提示
3)这样会有风险,因为可能会把别人机器上的文件覆盖到自己的机器
4)如果压缩的文件是绝对路径比如/etc,不用担心,tar会自动帮我们去掉/,但是会有报错提示,如上方。
5)++如果不想要报错提示,那么进入到要压缩的文件回目录上级,然后使用相对路径打包压缩++
cd / && tar zcvf /opt/etc.tar.gz etc
6)只查看压缩包内容不解压用
tf
7)打包压缩软链接时如果想保留软链接指向的真实目录,使用
zcvhf
,但是如果想++保留目录原来的结构++ 不需要h8)指定要解压到哪个目录使用-C
-
解压zip包
-
安装
yum install unzip -y
-
解压 99% 来自winodws
uzip xxx.zip
-
解压到指定目录
uzip xxx.zip -d 目标目录
-
find文件查找
-
find应用场景
-
根据文件或目录名进行查找 90%
-name
-
根据文件大小进行查找 9%
-size
-
根据文件或目录修改时间进行查找
-mtime
-type
-
根据文件或目录所属用户和用户组进行查找
-
根据文件或目录权限进行查找
-
-
find命令格式
find [查找路径] [选项参数] [限定条件] [执行动作]
-
find关键选项
-
选项参数
-maxdepth N
搜索的目录深度 -
限定条件
-name
按名称查找
-type
按类型查找f
文件d
目录
-size
按文件大小+-
k M G+
代表大于,-
代表小于
-mtime
按时间查找-N ,N, +N
-
-
通配符
`*` 任意
`^` 开头
`$ ` 结尾
-
举例:
-
ls
不会识别find
找出来的文件路径find . -type f -name "111.txt"|ll
-
使用
xargs
后ls可以识别find找到的文件路径find . -type f -name "111.txt"|xargs ls -lh
-
-
find查找后执行动作(重要)
-
xargs
执行动作powershellfind . -type f -name "112.txt"|xargs cp -t /opt/ find . -type f -name "112.txt"|xargs mv -t /opt/ find . -type f -name "115.txt"|xargs cat find . -type f -name "112.txt"|xargs rm
-
-exec
执行动作powershellfind . -type f -name "112.txt" -exec cp {} /opt/ \; find . -type f -name "112.txt" -exec mv {} /opt/ \; find . -type f -name "115.txt" -exec cat {} \; find . -type f -name "112.txt" -exec rm {} \;
-
-
find与打包压缩结合
需求:
1)用find找出/opt下所有*.txt的文件
2)将find找出的文件打包成txt.tar.gz并存放在/mnt下
-
exec和xargs区别
- -exec执行的效果:类似于一条一条执行,用于打包就会失败,不断覆盖。
tar zcf all.tar.gz 1.txt
tar zcf all.tar.gz 2.txt
tar zcf all.tar.gz 3.txt
- -exec执行的效果:类似于一条一条执行,用于打包就会失败,不断覆盖。
-
|xargs
tar zcf all.tar.gz 1.txt 2.txt 3.txt
-
find过滤文本内容
需求:
- 1)find找出/opt下以html或conf结尾的文件
find /opt -type f -name "*.html" -name "*.conf"
- 2)在找出的文件中再过滤出文件内容包含
magician
的文件find /opt -type f -name "*.html" -name "*.conf"|xargs grep "magician"
- 1)find找出/opt下以html或conf结尾的文件
-
总结:
powershelltar zcvf *.tar.gz * tar zxvf *.tar.gz -C /opt/ unzip *.zip -d /opt/ find /etc -name xxx -type f|d -size +100k -size -200M -mtime +7|xargs tar zcvf all.tar.gz find /etc -name xxx -type f|d -size +100k -size -200M -mtime +7 -exec cp {} /opt/ \; find /etc -name xxx -type f|d -size +100k -size -200M -mtime +7|xargs grep "eth0"
6.Linux用户管理
-
9%的场景只需要以下几条命令!!!
groupadd -g gid 组名
useradd -u uid -g gid -s /sbin/nologin -M 用户名
usermod -u uid -s /sbin/nologin 用户名
userdel -r 用户名
passwd 用户名
echo "密码"|passwd --stdin 用户名
su - 用户名
visudo
sudo 命令
-
Linux用户介绍
-
多用户与多任务
- 说人话
多用户 系统里有多个用户 多个用户可以同时登录
多任务 系统可以同时执行多个任务
- 说人话
-
Windows:
- 可以存在多个用户,但是同时只能有一个用户登录
-
Linux:
- 存在多个用户,而且可以同时登录执行任务
-
Linux用户角色划分
Linux里所有的进程都必须属于某个用户
- 超级管理员 root用户权限最大,是Linux里的上帝,可以做任何事
- 普通用户 权限小一些的用户,一般是可以登录的,做一些风险较小的维护操作
- 系统/虚拟用户 不是给人用的,是用来启动程序的用户,不允许登录,不需要家目录,不需要切换
-
Linux用户UID说明
- UID就是用户的身份证号码 不能重复
简单来说,每个用户都有一个身份证号,也叫UID,而且这个UID是唯一的
- UID就是用户的身份证号码 不能重复
用户UID 角色定义 0 超级管理员 最高权限 拥有核爆炸的能力 1~200 系统用户 用来运行系统自带的进程 安装完系统就默认创建的 201~999 系统用户 用来运行用户安装的程序 这些用户无需登录系统 1000+ 普通用户 可以正常登陆系统的用户 权限比较小 能执行的任务有限 -
-
用户相关配置文件
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
-
/etc/passwd讲解
作用:
- 存放用户的账号信息
-
字段解释:
user1:x:1002:1002::/home/user1:/bin/bash
用户名:x:UID:GID:用户说明:用户家目录:登录shell
-
/etc/shadow讲解
作用:
- 记录用户的密码信息
重要字段解释:
用户名:加密后的密码:19674:0:99999:7:::
-
/etc/group讲解
组名:x:GID:
-
/etc/gshadow讲解
组名:密码::
-
-
总结
创建用户会涉及到的文件和目录
- /etc/passwd #记录用户的账号信息,UID,GID,家目录,登录shell
- /etc/shadow #记录的是用户加密后的密码信息
- /etc/group #记录用户组信息
- /etc/gshadow #记录用户组密码
- /home/用户名 #普通用户家目录
-
Linux用户组
-
Linux用户组介绍
说人话就是可以将同一类或者多个用户归到一个组里
以后可以对整个组进行权限控制
-
用户与用户组的关系
一对一 一个用户属于一个组
一对多 一个用户可以属于多个组
-
用户组配置文件
/etc/gshadow
-
Linux管理用户命令
useradd添加用户命令
-
语法:
useradd [选项] 用户名
-
重要选项:
-s
-M
-u
-g
-
案例1: ++不接任何选项直接创建用户++
命令:
-
useradd user1
-
记录内容:
user1:x:1002:1002::/home/user1:/bin/bash
-
总结:
创建一个用户叫user1
创建一个组叫user1
默认用户的UID如果不指定的话,会以当前用户最大的UID加1
默认用户uid和gid是一样的(不严谨)
创建用户时uid不能重复
默认登录解释器是/bin/bash
在/home下创建用户家目录
默认没有密码
-
-
案例2: ++创建用户指定UID++
命令:
-
useradd -u 1111 user2
-
记录内容:
user2:x:1111:1111::/home/user2:/bin/bash
-
总结:
如果指定uid,则会创建指定UID的账号
同时会创建和UID相同的GID(不严谨)
-
-
案例3: ++创建用户但是不创建家目录++
命令:
-
useradd -M fafa
-
解释:
使用-M不会创建用户家目录
虽然不会真正的创建家目录,但是/etc/passwd里还会有记录
-
报错:
powershell[root@centos7-magician ~]# su - fafa su: warning: cannot change directory to /home/fafa: No such file or directory
-
-
案例4: ++创建用户但是不允许登录++
命令:
-
useradd -M -s /sbin/nologin oldzhang
-
记录信息:
oldzhang:x:1116:1116::/home/oldzhang:/sbin/nologin
-
总结:
-M -s 一般结合使用,表示创建一个虚拟用户,不需要家目录不需要登录
/sbin/nologin就是专门给不允许登陆的用户配置的
-
报错:
powershell[root@centos7-magician ~]# su - oldzhang su: warning: cannot change directory to /home/oldzhang: No such file or directory This account is currently not available.
-
-
案例5: 指定GID
命令:
powershell[root@centos7-magician ~]# groupadd xiaoren -g 3306 [root@centos7-magician ~]# tail -1 /etc/group xiaoren:x:3306:
powershell[root@centos7-magician ~]# useradd xiaoren -u 3306 -g 3306 [root@centos7-magician ~]# tail -1 /etc/passwd xiaoren:x:3306:3306::/home/xiaoren:/bin/bash
-
案例6: 综合实验
举例:
-
groupadd -g 2000 mysql
useradd -u 2000 -g 2000 -M -s /sbin/nologin mysql
-
groupadd redis -g 3000
useradd redis -u 3000 -g 3000 -M -s /sbin/nologin
-
groupadd mongo -g 1777
useradd mongo -g 1777 -u 1777 -M -s /sbin/nologin
-
userdel删除用户命令
-
重要选项:
-r
-
案例1: 不接任何选项删除用户
命令:
-
userdel 用户名
-
解释:
从以下文件清除删除用户信息,但是保留了用户家目录
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
-
-
案例2: 删除用户以及用户的家目录
命令:
-
userdel -r 用户名
-
解释:
从以下文件清除删除用户信息,同时删除了用户家目录
/etc/passwd
/etc/shadow
/etc/group
/etc/gshadow
-
usermod和groupmod修改用户命令
- 语法:
useradd能加的选项,他都能改 - 重要选项:
-u
-s
Linux管理用户组命令
-
groupadd
使用:
groupadd -g GID 组名
-
注意:
- 如果创建用户时想指定gid,那么这个组必须是已经存在的
passwd修改用户密码
-
作用
修改用户密码
- root用户可以修改任何用户的密码且不需要知道原来的密码
- 普通用户只能修改自己的密码,并且需要知道原来的密码
-
语法
passwd
passwd 用户名
-
使用方法
-
交互式: 需要手动输入和确认
passwd 用户名
-
免交互式: 不需要手动确认
echo "密码"|passwd --stdin 用户名
-
-
练习
创建两个用户user1和user2
user1使用交互设置密码
user2使用免交互设置密码
su - user1 #不需要密码
su - user2 #需要密码
ctrl + d
-
案例1: root用户修改任意用户密码
passwd #修改root自己的密码
passwd user1 #修改别人的密码
-
案例2: 普通用户修改密码
passwd
-
注意:
-
普通用户只能修改自己的密码
-
普通用户修改密码需要知道当前的密码
-
普通用户修改密码有强度检查
-
长度要超过8位
-
不能包含系统保留关键词
-
不能太简单
-
不能和老密码一样,不能和老密码相似
-
-
示例
powershell[root@centos7-magician ~]# passwd hui Changing password for user hui. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. [linux@centos7-magician ~]$ passwd Changing password for user linux. Changing password for linux. (current) UNIX password: New password: BAD PASSWORD: The password is the same as the old one New password: BAD PASSWORD: The password is too similar to the old one New password: BAD PASSWORD: The password is shorter than 8 characters passwd: Have exhausted maximum number of retries for service [linux@centos7-magician ~]$ passwd Changing password for user linux. Changing password for linux. (current) UNIX password: New password: BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic New password: BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word New password: Retype new password: Sorry, passwords do not match. passwd: Have exhausted maximum number of retries for service
查看用户信息
- 命令汇总
w
id
whoami
su和su - 的区别
-
- login
的意思
su - 用户名
以完整登录的形式切换用户 -
总结一句话
用su就用
su -
-
什么是环境变量?
- 环境变量就是用户登录时设置的一些准备环境
-
环境变量位置
-
全局配置文件:对所有的用户都生效
/etc/profile
/etc/bashrc
/etc/profile.d/*.sh
-
个人配置文件:只对个人用户生效
~/.bash_profile
~/.bashrc
-
-
环境变量生效顺序
-
su - 用户名
登录式shell配置文件执行顺序:1./etc/profile
2.~/.bash_profile
3.~/.bashrc
4./etc/bashrc
-
su 用户名
非登陆式shell配置文件执行顺序:1.~/.bashrc
2./etc/bashrc
-
su 用户名
不会加载配置文件/etc/profile
,但会加载etc/bashrc.
.bash_profile
在用户登录时执行,而.bashrc
则在每次打开新的Shell时或者每次运行Shell脚本时被读取,这可能会影响到性能,因此不推荐在.bashrc
中配置用户专用的环境变量。
-
sudo 普通用户权限提升
-
提权介绍
- 简单来讲提权就是提升权限
-
我们现在可以实现的
root --> 普通用户 不需要知道密码
普通用户 --> 普通用户 需要知道密码
普通用户 --> root 需要知道root密码
-
++为什么要提升权限?++
- 虽然我们可以使用su - root来切换成超级用户使用所有命令,但是这样做会有几个安全问题:
1)使用su - 切换用户,普通用户也就知道了root的密码,这显然是不太能接受的。
2)当普通用户切换到root用户之后,就可以使用所有的命令,甚至可以改掉root密码,这显然也是不可接受的。- 那么我们可不可以实现既让普通用户可以一些特权执行命令又不需要告诉他root密码呢?
- 答案是可以的,那就是使用sudo命令来++临时提升权限++。
- 那么我们可不可以实现既让普通用户可以一些特权执行命令又不需要告诉他root密码呢?
- 虽然我们可以使用su - root来切换成超级用户使用所有命令,但是这样做会有几个安全问题:
sudo配置使用
-
配置
/etc/sudoers
-
解释
root ALL=(ALL) ALL
用户名 允许登录主机 允许执行的特权命令
-
练习
-
案例1:配置user1可以以root身份执行rm命令
-
第一步:编辑/etc/sudoers
vim /etc/sudoers
user1 ALL=(ALL) /bin/rm
-
第二步:切换到普通用户
su - user1
-
第三步:查看自己的sudo权限
[user1@centos7-magician~]$ sudo -l We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for user1: Matching Defaults entries for user1 on centos7-magician: ... User user1 may run the following commands on centos7-magician: <u>(ALL) /bin/rm</u>
-
第四步:测试特权命令执行
powershell[user1@centos7-magician ~]$ rm -rf /opt/gun.txt rm: cannot remove '/opt/gun.txt': Permission denied [user1@centos7-magician ~]$ sudo rm -rf /opt/gun.txt [user1@centos7-magician ~]$ ll /opt/ total 0 -rw-r--r--. 1 root root 0 Nov 10 15:51 1.txt
-
-
sudo多用户多角色多权限命令配置
-
需求:
| 用户 | 角色 | 可以执行的命令 | | -------------- | ---- | ----------------------------| | user1 | 运维 | 网络命令: ifconfig、ping 软件命令: rpm、yum 服务命令: service、systemctl 进程命令: kill、killall | user2 | 开发 | 网络命令: ifconfig、ping 服务命令: service、systemctl
-
实验步骤:
-
第一步:使用visudo编辑配置
visudo
-
第二步:创建用户组
User_Alias OPS = ops1, ops2
User_Alias DEV = dev1, dev2
-
第三步:创建命令组
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/yum
Cmnd_Alias PROCESSES = /bin/kill, /usr/bin/kill, /usr/bin/killall
-
第四步:将用户组和命令组建立匹配关系
OPS ALL=(ALL) NETWORKING, SOFTWARE, PROCESSES
DEV ALL=(ALL) NETWORKING
-
测试:
- su - dev1
sudo -l
sudo yum install tree
sudo ping www.baidu.com
sudo kill - su - ops1
sudo -l
sudo yum install tree
sudo ping www.baidu.com
sudo kill
- su - dev1
-
7.Linux权限管理
-
重点!!!
99%的情况默认即可
- 默认文件是 644
rw-r--r--
- 默认目录是 755
rwxr-xr-x
- 默认文件是 644
-
99%的情况以下组合
grouadd -g 2000 mysql
useradd -u 2000 -g 2000 -M -s /sbin/nologin mysql
chown -R mysql:mysql /opt/mysql/
-
了解掌握
- rwx r-x r-x 表示的含义
- rwx 表示的含义
- 644 表示的含义
- chmod 644
- 对于目录来说r和x少一个都不正常
- 对于root用户来说,权限没意义
-
Linux系统权限介绍
-
什么是权限
在Linux里,权限有几种理解
-
账号的权限
命令的权限
-
文件的权限
目录的权限
-
-
-
文件权限位说明
rw- 所属用户
r-- 所属组
r-- 其他用户
-
rwx解读
数字表达法 字母表达法
4 r read 可读
2 w write 可写
1 x execut 可执行
0 - null 没有权限
-
排列组合:
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
-
-
练手:
rw- r-- r-- root magician file1.txt
这个文件是root用户创建的,拥有可读可写的权限
magician组的用户对这个文件有可读权限
其他用户对这个文件有可读权限
Linux权限命令
chmod修改文件或目录权限
-
chmod [ugoa] [-+=] [rwx] [文件或目录]
chmod [7|6|5|4|3|2|1] [文件或目录]
-
关键选项:
-R
递归更改目录及目录以下的所有文件 -
字母表达法解释:
-
u user
g group
o other
a all
-
rw- u 所属用户 all
r-- g 所属组 all
r-- o 其他用户 all
-
+ 增加权限
-
- 减少权限
-
= 覆盖权限
-
-
数字表达法解释:
-
755 rwx r-x r-x
644 rw- r-- r--
-
6 rw-
4 r--
4 r--
-
-
字母表达法练习
chmod u+x file1.txt
chmod g-x file1.txt
chmod o-x file1.txt
chmod a+x file1.txt
chmod a=rwx file1.txt
-
数字表达法练习
chmod 735 file1.txt
chown更改文件或目录的所属用户及用户组
-
chown 格式
chown [选项] 所属用户:所属用户组 文件或目录
-
重要参数
-R
递归更改目录及目录以下的所有文件 -
练习
-
只改所属用户
chown user1 1.txt
-
所属用户和用户组都修改
chown user1:user1 1.txt
-
只改所属用户组
chown :user1 1.txt
-
递归修改目录及目录下的文件的所属用户及用户组
chown -R user1:user1 dir1
-
特殊情况,只写用户: 不写组,组也会变
chown root: dir1
-
Linux文件及目录权限详解
文件和目录的权限区别
-
文件来说:
r 可读
w 可写
x 可执行
-
目录来说:
r 具有浏览目录及其子目录的权限
w 具有增加,删除或修改目录内文件的权限
x 具有进入目录的权限
-
目录的权限实验
-
创建实验环境
mkdir /opt/dir1/dir2/dir3
mkdir /opt/dir1/dir2/dir3 -p
touch /opt/dir1/file1.txt
touch /opt/dir1/dir2/file2.txt
touch /opt/dir1/dir2/dir3/file3.txt
chown -R user1:user1 /opt/dir1
-
r-x 可列出目录下文件名 可进入目录 显示正常
r-- 可列出目录下文件名 不可进入目录 文件属性显示异常
-wx 不可列出目录下文件名 可进入目录 文件属性显示异常
-w- 啥都干不了
--x 只能进去 啥都干不了
rw- 可列出目录下文件名 啥都干不了
rwx 啥都可以干
--- 啥都干不了
-
-
为什么目录的默认权限是755
- rwx 创建者 啥都可以干
r-x 所属组 可列出目录下文件名 可进入目录 显示正常
r-x 其他用户 可列出目录下文件名 可进入目录 显示正常
- rwx 创建者 啥都可以干
-
总结:
目录能正常工作的最低权限是r-x
目录能完全工作的只能是rwx
特殊权限
-
什么是特殊权限
- 作用于目录的
sticky bit
权限(对应符号t)- 当某个目录具有t权限后,++该目录下的文件只能由文件的拥有者,root用户,文件所在目录的拥有者删除++,普通用户即使拥有对该目录的写权限,也不能删除其它用户在具有t权限位的目录中建立的文件与子目录
- 使用
o+t
或者o-t
来设置或删除
- 作用于目录的
sgid
(对应符号s)- 如果建立文件或子目录所在的父目录设置了sgid权限位,++则在该目录下新建的文件或者目录所在组会自动地设置为父母所在的用户组++,同时在该目录中新建的子目录自动赋予sgid权限。
- 使用
g+s
或者g-s
来设置或者删除此权限
- 配置suid权限
- ++让执行该可执行程序的用户以该程序文件拥有者的权限去执行++ ,也就是说普通用户执行有suid权限的
/usr/bin/passwd
时会拥有root权限,这样普通用户执行passwd
时就可以修改etc/shadow
文件了。 - 用
u+s
,u-s
来设置
- ++让执行该可执行程序的用户以该程序文件拥有者的权限去执行++ ,也就是说普通用户执行有suid权限的
- 注意:
- 在设置
suid
与sgid
权限时,文件的拥有者,文件所在的组必须先设置相应的x权限,否则不会生效,chmod
命令不进行必要的完整性检查
- 在设置
- 作用于目录的
-
特殊权限位表达
suid
4000 如何用户权限位有x则表达为s 如果没有x则表达为S
sgid
2000 如何用户权限位有x则表达为s 如果没有x则表达为S
sticky
1000 如何用户权限位有x则表达为t 如果没有x则表达为T -
思考题:如何设计垃圾回收站
功能需求:
-
1.所有人都能往里面仍垃圾
rwx rwx rwx 777
-
2.只有自己能删除自己的东西
手动更改垃圾文件的权限属于自己
-
-
能不能删文件,取决于文件所在上层目录你有没有w权限
删除文件只需要rw权限即可
-
思考题:
如何找出系统里所有包含suid权限的文件 find
find /usr -type f
-perm /4000
|xargs ls -l
特殊属性
-
特殊属性介绍
i
对文件加锁,任何用户都不能对+i的文件进行更改
a
对文件加锁,只能追加,不能删除或清空 -
命令
chattr [选项] 目标文件
-
使用场景---非常少
对重要文件保护,不允许更改
chattr +i
chattr -i
-
重要日志,防止别人篡改或删除
chattr +a
chattr -a
查看文件属性命令
-
查看特殊属性
lsattr
-
查看文件详情
stat test.txt
默认权限掩码umask
-
umask作用
用来定义系统默认创建文件和目录的权限位是多少
- 文件默认权限是
644
- 目录默认权限是
755
- 文件默认权限是
-
查看当前系统umask值
powershell[root@centos7-magician~]# umask 0022
-
如何计算umask值
文件 0666
目录 0777
文件权限计算 0666 - 0022 umask -------- 0644 默认创建文件权限 目录权限计算 0777 - 0022 umask -------- 0755 默认创建目录权限
-
umask设置
-
umask 三位数字
-
需求:创建的文件默认权限是600
0666 - 0066 umask -------- 0600 默认创建文件权限
-
需求:umask是0066,目录是多少?
0777 - 0066 -------- 0711
-
8.正则表达式与三剑客grep,sed,awk
什么是通配符
- 1.通配符的作用是查找和匹配文件名称而不是文件里的内容!
- 2.通配符是shell的内置功能
- 3.Linux大部分命令都支持通配符
-
常用符号说明
-
匹配任意(0个或多个)字符或字符串,包含空字符串
? 匹配任意1个字符,有且只有一个字符
[abcd] 匹配[abcd]中任何一个字符,abcd也可是其他任意不连续字符
[a-z] 匹配a-z之间的任意一个字符
[0-9] 匹配0-9之间的任意一个数字
[a-Z] 匹配a-zA-Z之间的任意一个数字
[!abcd] 不匹配括号里面的任意字符,也可以写作[!a-d],这里的!可以用^替代,即[^abcd] -
-
通配符练习
-
创建测试环境
mkdir test
cd test/
touch oldboy.txt oldgirl.txt test.txt oldzhang.sh
ls
-
-
匹配任意字符
#1.查看所有结尾为txt的文件
[root@centos7 test]# ls *.txt
oldboy.txt oldgirl.txt test.txt#2.查看以sh结尾的文件
[root@centos7 test]# ls *.sh
oldzhang.sh#3.查找以old开头,txt结尾的文件
[root@centos7 test]# ls old*.txt
oldboy.txt oldgirl.txt -
? 匹配任意一个字符(用的不多,了解即可)
#1.尝试匹配?.sh
[root@centos7 test]# ls ?.sh
ls: 无法访问?.sh: 没有那个文件或目录 #这里报错了,为什么呢,因为?只代表任意一个字符,因此没有符合条件的文件#2.创建一个符合条件的文件再次查找
[root@centos7 test]# touch a.sh
[root@centos7 test]# ls ?.sh
a.sh#3.那么如何查找特定字符长度的文件名呢?
[root@centos7 test]# ls *.sh
a.sh oldzhang.sh
[root@centos7 test]# ls ????????.sh #使用8个?就匹配了
oldzhang.sh -
[] 匹配指定的内容
#1.查找匹配a-z任意一个字符的以.sh结尾的文件
[root@centos7 test]# ls [a-z].sh
a.sh#2.匹配以old开头后 + xyz任意一个字符 + hang.sh结尾的文件
[root@centos7 test]# ls old[xyz]hang.sh
oldzhang.sh#3.复杂一点的匹配,其实很好理解
[root@centos7 test]# ls old[a-z]???g.sh
oldzhang.sh -
[!abcd] 取反匹配指定的内容
#1.排除所有以o开头的任意名称并且以.txt结尾的文件
[root@centos7 test]# ls [!o]*.txt
test.txt#2.排除所有以o开头的任意名称并且以.sh结尾的文件
[root@centos7 test]# ls [!o]*.sh
a.sh#3.排除所有以a开头的任意名称并且以.sh结尾的文件
[root@centos7 test]# ls [!a]*.sh
oldzhang.sh -
通配符综合练习
#1.查找/etc目录下包含hosts字符串的所有文件
[root@centos7 ~]# find /etc -type f -name "hosts"
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny#2.查找/etc目录下所有网卡配置文件
[root@centos7 ~]# find /etc -type f -name "ifcfg-*"
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-eth0#3.只查找包含了数字的网卡配置
[root@centos7 ~]# find /etc -type f -name "ifcfg-*[0-9]"
/etc/sysconfig/network-scripts/ifcfg-eth0#4.查找/dev目录下第1块到第4块磁盘文件
[root@centos7 ~]# find /dev/ -name "sd[a-d]"
/dev/sdd
/dev/sdc
/dev/sdb
/dev/sda#5.查找/dev/sda一共有几个分区
[root@centos7 ~]# find /dev/ -name "sda?"
/dev/sda2
/dev/sda1
[root@centos7 ~]# find /dev/ -name "sda[0-9]"
/dev/sda2
/dev/sda1
[root@centos7 ~]# find /dev/ -name "sda*"
/dev/sda2
/dev/sda1
/dev/sda
shell命令行特殊符号
-
什么是shell命令行特殊符号
-
通配符
是针对文件名的
特殊符号
是针对命令与命令之间的 -
路径相关
~ 用户家目录 - 上一次目录 . 当前目录 .. 上一层目录 ../../
-
重定向
> >> 2> 2>>
-
优先执行命令
`命令` 引用命令,当其他命令和``里的命令一起执行时,先执行``里的命令 $(命令) 和``的作用一模一样,但是比``更容易分辨
-
实战
实验1:使用find找出.txt结尾的文件,但是不用
xargs
和-exec
删除文件-
第一步: 先写find
find . -type f -name "*.txt"
-
第二步:
把find放在$()里
rm -rf $(find . -type f -name "*.txt")
rm -rf `find . -type f -name "*.txt"`
实验2:将
/var/log/messages
日志按日期打包到/opt
目录下-
第一步: 生成日期命令
date +%F
-
第二步: 将日期命令放在里
tar zcvf /opt/$(date +%F).tar.gz /var/log/messages
tar zcvf /opt/`date +%F`.tar.gz /var/log/messages
实验3: 根据文本里的文件名删除文件
rm -rf $(cat del_name.txt)
rm -rf `cat del_name.txt`
-
-
-
生成序列
{1...10}
{a...z}
{A...Z}
- 举例:
touch {1..100}.txt
rm -rf {1..100}.txt
- 举例:
-
;
分隔多个命令-
方法:
命令1;命令2;命令3
-
注意:
不管前面的命令执行是否成功,都会执行;后的命令
-
需求:
-
1.进入/opt目录
cd /opt
-
2.创建一个目录/opt/dir1/
mkdir /opt/dir1
-
3.echo 我在:当前路径
echo "我在:$(pwd)"
-
-
实现:
cd /opt;mkdir /opt/dir1;echo "我在:$(pwd)"
-
-
&&
前面命令执行成功才会执行后面的命令-
使用方法:
命令1 && 命令2 && 命令3
-
解释:
命令1执行成功才会执行命令2
命令1和命令2都执行成功才会执行命令3
-
需求:
1.进入/opt/dir1目录
cd /opt/dir1
2.如果/opt/dir1目录确实存在,则在dir1目录里创建一个文件file1.txt并且写入hello
echo hello >> file1.txt
3.如果file1.txt确实存在,则把他的内容打印到屏幕上
cat file1.txt
-
实现:
cd /opt/dir1 && echo hello >> file1.txt ; ls file1.txt && cat file1.txt
-
工作场景:
cd /opt/redis_6379/logs/ && tar zcvf redis-$(date +%F).tar.gz redis.log
-
-
-
||
前面命令执行不成功才会执行后面的命令-
使用方法:
命令1 || 命令2
-
解释:
命令1执行失败才会执行命令2
-
实现:
cd /opt/dir2 || mkdir /opt/dir2 && cd /opt/dir2 && touch oldya.txt
-
综合:
cd /opt/redis_6379/logs/ && tar zcf redis-$(date +%F).tar.gz redis.log && echo "ok $(date +%F)" >> all.log || echo "no $(date +%F)" >> all.log
-
-
单双引号
''
所见即所得,不解析特殊符号和变量
""
可以解析特殊符号和变量
-
正则表达式
-
正则表达式介绍
- 什么是正则表达式,为什么需要正则表达式
简单地说,正则表达式就是为处理大量的字符串及文本而定义的一套规则和方法。
正则表达式就是把人类想要查的东西,用计算机能识别的语言表达出来的一种规则。
正则表达式仅受三剑客(grep/egrep、sed、awk)
命令支持,其他命令无法使用。
- 什么是正则表达式,为什么需要正则表达式
-
通配符与正则表达式的区别
通配符 --> 文件名
正则表达式 --> 文本内容
-
什么是基础正则和拓展正则
拓展正则支持的符号更多,功能更强大
-
正则表达式符号
-
基础正则表符号:
^ 以什么开头 $ 以什么结尾 ^$ 表示空行 \ 转义,恢复字符原来的含义 . 任意一个字符 * 前面的字符出现0次或多次 123a 123aa 123cvb 123aaaa zbcaaa 3a* .* 任意字符出现了任意次 99.99% [abc] 匹配abc任意一个字符 [a-z] 匹配a-z任意一个字符 [0-9] 匹配0-9任意一个字符 [^abc] 排除abc任意一个字符
-
拓展正则符号:
+ 匹配前1个字符1次或多次 [:/]+ 匹配括号内的 ":" 或 "/" 字符1次或多次 ::: [:]+ ? 匹配前一个字符0次或1次 | 或 () \n 一个整体 abc123 --> (abc)(123) --> \2\1 \num 表示选中前面第num个括号 a{n,m} 匹配前一个字符最少n次,最多m次 a{n,} 匹配前一个字符最少n次 a{n} 匹配前一个字符正好n次 a{,m} 匹配前一个字符最多m次
-
-
三剑客命令是什么
grep
过滤匹配搜索
sed
过滤匹配替换删除
awk
过滤匹配搜索 按分隔符拆分三剑客命令之grep过滤文本内容
-
grep的应用场景
过滤文件内容或其他命令输出的字符串
-
grep重要选项
-E
支持拓展正则表达式
-v
排除
-n
显示行号
-i
不区分大小写
-o
只显示匹配上的内容
-w
精确匹配整个单词,默认是贪婪匹配
-A
After 匹配的内容的后多少行
-B
Before 匹配的内容的前多少行
-C
Context 匹配的内容前后多少行 -
grep和egrep区别
grep -E == egrep
grep配合正则表达式大量练习题
-
基础正则表达式练习
-
测试文本
cat > magician.txt << 'EOF' I am oldzhang ! I teach linux. testtttsss000123566666asbclkkkallll i like swimming, football, basketball, video games #I like ChaShao TaiQiu $my blog is http://www.cnblogs.com/hahha/ #my site is https://www.jianshe.com/u/easdwc7fwdasd0 blog is http://www.cnblogs.com/hahha/ my site is https://www.jianshe.com/u/easdwc7fwdasd0 My-qq is 526195417. my_phone is 15321312222222666644624. my_new_phone is 18126219096 call me! EOF
cat > oldya.txt << EOF ABAB ABAA ABBA ABBBA ABBBBBA EOF
-
题目如下:
-
查找以I开头的行
[root@centos7-magician~]# grep "^I" magician.txt
I am oldzhang !
I teach linux.
-
查找以0结尾的行
[root@centos7-magician~]# grep "0$" magician.txt
#my site is https://www.jianshe.com/u/easdwc7fwdasd0
my site is https://www.jianshe.com/u/easdwc7fwdasd0
-
查找A开头,中间三个任意字符再以A结尾
[root@centos7-magician~]# grep "^A...A$" oldya.txt
ABBBA
-
查找以.标点符号结尾的行
[root@centos7-magician~]# grep ".$" magician.txt
I teach linux.
My-qq is 526195417.
my_phone is 15321312222222666644624.
-
查找以I开头,以.结尾的行
[root@centos7-magician~]# grep "^I.*.$" magician.txt
I teach linux.
-
排除空行并显示行号
[root@centos7-magician ~]# grep -nv "^$" magician.txt 1:I am oldzhang ! 2:I teach linux. 3:testtttsss000123566666asbclkkkallll 5:i like swimming, football, basketball, video games 6:#I like ChaShao TaiQiu 7:$my blog is http://www.cnblogs.com/hahha/ 8:#my site is https://www.jianshe.com/u/easdwc7fwdasd0 9:blog is http://www.cnblogs.com/hahha/ 10:my site is https://www.jianshe.com/u/easdwc7fwdasd0 11:My-qq is 526195417. 12:my_phone is 15321312222222666644624.
-
打印出空行的行号是多少
[root@centos7-magician~]# grep -n "^$" magician.txt
4:
-
查找以
$
开头的行-
[root@centos7-magician~] # grep "^\\$" magician.txt
$my blog is http://www.cnblogs.com/hahha/
-
[root@centos7-magician~]# grep
'^\$'
magician.txt$my blog is http://www.cnblogs.com/hahha/
-
-
查找以
#
或$
开头的行
[root@centos7-magician~]# grep '^[$#]' magician.txt
#I like ChaShao TaiQiu
$my blog is http://www.cnblogs.com/hahha/
#my site is https://www.jianshe.com/u/easdwc7fwdasd0
-
查找以
.
或!
结尾的行
[root@centos7-magician~]# grep '[.!]$' magician.txt
I am oldzhang !
I teach linux.
My-qq is 526195417.
my_phone is 15321312222222666644624.
-
查找以
I
或m
开头,以.
或!
结尾的行
[root@centos7-magician~]# grep '^[Im].*[.!]$' magician.txt
I am oldzhang !
I teach linux.
my_phone is 15321312222222666644624.
-
查找以
m
或M
开头的行
grep -i '^m' magician.txt
-
查找不以
I
或m
不区分大小写开头的行
grep -vi '^[mi]' magician.txt
grep -i '^[^mi]' magician.txt
-
-
-
拓展正则练习
{}
匹配手机号而不是QQ号
手机号是 1开头 11位数字
egrep '1[0-9]{10}[^0-9]' magician.txt
my_new_phone is 18126219096 call me!
egrep '1[0-9]{10} ' magician.txt
my_new_phone is 18126219096 call me!
-
匹配QQ号长度是9位,5开头,7结尾,中间是数字
egrep '5[0-9]{7}7' magician.txt
My-qq is 526195417.
-
查找出所有单词中出现相同字母连续的行,比如: www,http
egrep -i '([a-z])\1{1,}' magician.txt
egrep -i '([a-z])\1+' magician.txt
-
只查找出同一个字母连续3次的行,比如www
egrep '([a-z])\1{2}' magician.txt
egrep '([a-Z])\1\1' magician.txt
-
提取网址 连续3个字母.xxx.xxx 不能用www 不能用com
egrep -o '([a-Z])\1\1\.[a-Z]+\.[a-Z]+' magician.txt
egrep -o "\w{3}\..*+\.\w{3}" magician.txt
egrep -o '([a-z])\1{2}.*\.[a-z]{2,3}' magician.txt
egrep -o '([a-Z])\1\1\.[a-z]{1,}\.[a-Z]{1,}' magician.txt
egrep -o '([a-z])\1{2}\..*\.[a-z]{1,}' magician.txt
egrep -o '([a-zA-Z])\1\1\.[a-Z]+\.[a-Z]+' magician.txt
egrep -o '[a-Z]{1,}\.[a-Z]{1,}\.[a-Z]{1,}' magician.txt
egrep -o '([a-z])\1+\..*\.[a-z]{3}' magician.txt
egrep -o "[a-z]{3}\..*\.[a-z]{3}" magician.txt
egrep '[a-Z|0-9]{1,}\.[a-Z|0-9]{1,}\.[a-Z|0-9]{1,}' magician.txt
-
提取完整的链接地址
egrep -o "\w+\://.*/\w+" magician.txt
egrep -o 'htt(p|ps)://[a-Z]{3}\..*\.com/.*/.*' magician.txt
egrep 'ht.*' magician.txt -o
工作需求实战
-
排除配置文件所有注释的行以及空行--必会
-
第一步: 找出注释的行
grep "#"
-
第二步: 找出空行
grep "^$"
-
第三步: 把注释和空行都排除
egrep -v "#|^$"
-
-
查找某个进程是否存在 99%
ps -ef|grep "进程名"
-
查看sda磁盘的使用率
df -h|grep "sda"|egrep -o "[0-9]{1,3}%"|egrep -o "[0-9]+"
-
取出eth0网卡的IP地址
ifconfig eth0|egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'|head -1
ifconfig eth0|egrep -o '..\..\..\....'|head -1
ifconfig eth0|egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'|grep -v "255"
ifconfig eth0|egrep inet.*ne -o|egrep [0-9].*[0.9] -o
-
统计/etc/passwd所有shell为nologin的行并只显示用户名
grep "/sbin/nologin" /etc/passwd|egrep '^[a-z-]+'
grep "/sbin/nologin" /etc/passwd|egrep -o '.*:x'|egrep -o "[a-z-]{2,}"
-
查找/dev/sda的UUID
-
blkid /dev/sda1|egrep -o "[0-Z-]{5,}"
blkid /dev/sda1|egrep '[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+'
blkid /dev/sda1|egrep '[a-z0-9]+-.*-[a-z0-9]+'
blkid /dev/sda1|egrep '[0-Z]+-.*-[0-Z]+'
blkid /dev/sda1|egrep '([a-z]|[0-9]){1,}-.*-([a-z]|[0-9]){1,}' -o
-
三剑客命令之sed操作
-
应用场景:
99%用于替换文本
-
命令格式:
sed [options] [sed-commands] [input-file]
sed [选项] [sed命令] [输入文件]
-
执行过程:
逐行处理,逐行打印
-
选项:
-n
取消默认输出,默认sed会把所有文本全部输出,-n只显示处理过的文本
-r
支持拓展正则
-i
将修改操作保存,会改变文本内容,建议操作前先备份 -
命令:
p
输出处理过的行
i
在匹配范围前插入新行
a
在匹配范围后插入新行
d
sed查找练习
-
sed -n '查找的范围|条件'p magician.txt
-
测试样本:
cat > magician.txt << 'EOF' I am oldzhang ! I teach linux. testtttsss000123566666asbclkkkallll i like swimming, football, basketball, video games #I like ChaShao TaiQiu $my blog is http://bbs.magician.cn/linux/ <abc> #my site is https://bbs.magician.com/u/ee1c7fcea5b0 [sss] blog is http://www.cnblogs.com/python/ "abcd" my site is https://www.magician.com/u/ee1c7fcea5b0 'xxx'. My-qq is 526195417. my_phone is 15321312222222666644624. my_new_phone is 18126219096 call me! EOF
-
查找第2行
sed -n '2p' magician.txt
-
查询第2行到第5行
sed -n '2,5p' magician.txt
-
按字包含www关键词的行
sed -n '/www/p' magician.txt
-
查找以I开头的行
sed -n '/^I/p' magician.txt
-
查找以.结尾的行
sed -n '/\.$/p' magician.txt
-
查找oldzhang到qq中间所有的行
sed -n '/oldzhang/,/qq/p' magician.txt
-
查找第3行到qq关键词的行
sed -n '3,/qq/p' magician.txt
-
查找包含ball或qq的行,需要用到
扩展正则 -r
sed -rn '/ball|qq/p' magician.txt
-
排除以I或i开头的行
sed -rn '/^[^iI]/'p magician.txt
sed增加练习
-
指定行前后增加
指定关键词前后
-
在第2行前添加内容
sed '2i xxxxxxxxxxxxxxxxxx' magician.txt
-
在第2行后添加内容
sed '2a xxxxxxxxxxxxxxxxxx' magician.txt
-
在关键词所在行前增加
sed '/http/i xxxxxxxxxxxxxxxxxx' magician.txt
-
在关键词所在
行
后增加sed '/http/a xxxxxxxxxxxxxxxxxx' magician.txt
-
在行范围内每一行前增加
sed '2,5i xxxxxxxxxxxxxxxxxx' magician.txt
sed删除练习
-
删除第2行
sed '2d' magician.txt
-
删除第2行到第3行
sed '2,3d' magician.txt
-
删除包含blog关键词的行
sed '/blog/d' magician.txt
-
删除以I开头的行
sed '/^I/d' magician.txt
-
删除以.结尾的行
sed '/\.$/d' magician.txt
-
删除oldzhang到qq中间所有的行
sed '/oldzhang/,/qq/d' magician.txt
-
删除第3行到qq关键词的行
sed '3,/qq/d' magician.txt
-
删除包含ball或qq的行,需要用到扩展正则
sed -r '/ball|qq/d' magician.txt
-
删除带有#的行
sed '/#/d' magician.txt
sed替换练习
-
命令格式
sed 选项 '[匹配范围]替换指令/匹配的内容/[替换后的内容]/[替换标志]' 文件名
sed 选项 '[匹配范围]s#匹配的内容#[替换后的内容]#g' 文件名
-
匹配范围:
N
表示第几行
/正则表达式/
匹配正则表达式的行 -
替换指令:
s
替换命令
c
覆盖原来的内容,替换成c后面的内容 -
替换标志:
N
只替换每一行第N个符合条件的内容
g
把每一行所有符合条件的内容都替换
p
将处理过的行输出到屏幕上
i
忽略大小写 -
秘籍:
-
先把公式写好,然后填写内容
sed 's###g' name.txt
-
sed '[查找的行的范围]替换命令#要替换的内容#[替换后的内容]#[控制每一行生效的范围]' name.txt
sed '[1-4排]替换命令#作业#取消#[第2个男生]' name.txt
sed 's#作业#取消#g' name.txt 99%
-
-
写入测试文本
cat > name.txt << EOF
ZhangNan,24,swda
banzhang,24,CEO
#magician,24,CTO
ShiYuXin,23,cFo
ZengChengHao,24,CSGO
WangXiao,25,UFO
EOF
-
将CEO替换为XO
sed 's#CEO#XO#g' name.txt
sed 's/CEO/XO/g' name.txt
sed 's@CEO@XO@g' name.txt
sed 's-CEO-XO-g' name.txt
sed 's~CEO~XO~g' name.txt
sed 's%CEO%XO%g' name.txt
sed 's*CEO*XO*g' name.txt
sed 's,CEO,XO,g' name.txt
行替换
-
将所有的a替换为A
sed 's#a#A#g' name.txt
-
只将
第一次
匹配上的a替换为A
sed 's#a#A#' name.txt
-
只将第二次匹配上的a替换为A
sed 's#a#A#2' name.txt
-
忽略大小写替换 将e和E替换为---
sed 's#e#---#ig' name.txt
-
将第1行文本替换为iKun,24,Rapper
sed '1s#.*#iKun,24,Rapper#g' name.txt
sed '1c iKun,24,Rapper' name.txt
-
将包含zhang和Zhang关键词(大小写区别)的行换成ChenYan,24,BUG
sed -r '/[zZ]hang/c ChenYan,24,BUG' name.txt
sed -r '/(z|Z)hang/c ChenYan,24,BUG' name.txt
sed -r '/zhang|Zhang/c ChenYan,24,BUG' name.txt
-
将以CTO结尾的行换成renzaishi,24,bot
sed -r '/CTO$/c renzaishi,24,bot' name.txt
列替换
-
将第三列替换成AAA
s#(苹果树),(梨树),(香蕉树)#\3辣椒\1花椒\3豆瓣酱\3#g
(.*),(.*),(.*) \1,\2,AAA
sed -r 's#(.*),(.*),(.*)#\1,\2,AAA#g' name.txt sed -r 's#(.*,)(.*,)(.*)#\1\2AAA#g' name.txt sed -r 's#(.*,)(.*)#\1AAA#g' name.txt sed -r 's#(.*,).*#\1AAA#g' name.txt
-
第三列和第一列替换位置-分组替换
sed -r 's#(.*),(.*),(.*)#\3,\2,\1#g' name.txt
sed -r 's#(.*)(,.*,)(.*)#\3\2\1#g' name.txt
-
将中间的的年龄换成当前系统时间,例如:
CEO,2023-11-15,CEO
sed -r "s#(.*),(.*),(.*)#\1,$(date +%F),\3#g" name.txt
-
将第三列和第一列替换位置,第一个逗号替换为 - 第二个逗号替换为 _ 举例:
CEO-22_BanZhang
sed -r 's#(.*),(.*),(.*)#\3-\2_\1#g' name.txt
实战练习题
-
将/etc/passwd第一列取出来
-
将/etc/passwd第一列和最后一列位置调换
-
将/etc/passwd 用户名列,UID列和GID列取出来
-
批量重命名文件
-
删除阿里源里包含aliyunc的行
下载文件:
wget https://mirrors.aliyun.com/repo/Centos-7.repo
-
提取IP地址 尽可能多的方法
-
修改IP地址 将网卡配置文件里ip地址修改为
192.168.100.100
sed总结
- 命令格式:
sed [-选项] 'sed命令' 文件名
sed -n '查找的范围|条件'p magician.txt
查找num,num
查找行范围,也可用正则确定范围/正则表达式/
,此处p
为sed命令sed '2i xxxxxxxxxxxxxxxxxx' magician.txt
,插入操作,i
为命令,命令前面为范围
,后面为要插入的字符sed '/^I/d' magician.txt
删除操作,d
为命令,命令前同样是范围
,这条是正则表达式确定的行范围,此删除就是删除一整行。sed 选项 '[匹配范围]替换指令/匹配的内容/[替换后的内容]/[替换标志]' 文件名
- ......
三剑客命令之awk操作
-
awk
介绍- 命令作用
以指定的分隔符作为分隔条件并且可以自定义
输出内容
- 命令作用
-
命令格式
awk [options] '[pattern {action}]'
参数选项 匹配模式 执行动作
awk输出列
-
位置变量说明
,
默认输出分隔符默认表示空格
$0
输出所有列
$1
输出第一列
$2
输出第二列
$N
输出第N列
$NF
输出最后一列
$(NF-1)
输出倒数第二列
"自定义内容" 自定义内容输出
-
输出所有列
echo '123 456 789'|awk '{print $0}'
-
只输出第一列
echo '123 456 789'|awk '{print $1}'
-
输出第1和第2列,以空格为分隔符
echo '123 456 789'|awk '{print $1,$2}'
-
输出第1列到第3列
echo '123 456 789'|awk '{print $1,$2,$3}'
-
改变输出顺序为第3列,第2列,第1列
echo '123 456 789'|awk '{print $3,$2,$1}'
-
在第1列前添加A,第2列前添加B,第3列前添加C
echo '123 456 789'|awk '{print "A"$1,"B"$2,"C"$3}'
-
以:分隔输出1-3列
echo '123 456 789'|awk '{print $1":"$2":"$3}'
-
输出最后一列
echo -e '123 456 789\naa bb'|awk '{print $NF}'
-F 或 FS改变默认输入切割分隔符:
-
语法格式:
awk
默认是以空格
作为输入
切割的分隔符
awk -F"切割分隔符" '{print $1}'
-
-F指定单个切割分隔符
echo 1:2:3|awk -F":" '{print $1,$2}'
-
-F指定多个切割分隔符
echo 1-2:3|awk -F"[:-]" '{print $1,$2,$3}'
-
-F指定多个连续符号的匹配-匹配oldbug
echo ':://...---oldbug:..magician' -------------------------------- echo ':://...---oldbug:..magician'|awk -F"[-:]" '{print $6}' echo ':://...---oldbug:..magician' |awk -F"[-:]+" '{print $3}'
-
输出
/etc/passwd
第1列和最后一列并且以:为输出分隔符最后一列:第一列
awk -F":" '{print $NF":"$1}' /etc/passwd
-
输出/etc/passwd倒数第二列:
awk -F":" '{print $(NF-1)}' /etc/passwd
-
特殊情况-以单引号或双引号为分隔符
echo 1\'2\'3\'4|awk -F"'" '{print $1}'
echo 1\"2\"3\"4|awk -F'"' '{print $1}'
OFS 自定义默认输出分隔符
- 更改默认输出分隔符
需要画图
echo 1-2-3|awk -v FS='-' -v OFS=':' '{print $1,$2,$3}'
echo 1:2:3|awk -v FS=':' -v OFS='-' '{print $1,$2,$3}'
比较匹配
-
比较匹配格式
awk '比较匹配表达式{print $0}'
-
比较符号说明
针对数字: == > < != >= <= 针对字符串: ~ !~
-
输出/etc/passwd第3列等于0的行
awk -F':' '$3==0{print $0}'
-
输出/etc/passwd第3列小于900的行
awk -F':' '$3<900{print $0}'
-
输出/etc/passwd第3列大于300的行
awk -F':' '$3>300{print $0}'
-
输出/etc/passwd最后一列匹配/sbin/nologin的行
awk -F':' '$NF~"/sbin/nologin"{print $0}'
-
输出/etc/passwd最后一列不是/sbin/nologin的行
awk -F':' '$NF!~"/sbin/nologin"{print $0}'
-
输出/etc/passwd第3列大于1000的行并且最后一列不是/sbin/nologin的行,只显示用户名和uid和shell列,默认输出分隔符使用
-
awk -F':' -v OFS='-' '$3>1000&&$NF!~"/sbin/nologin"{print $1,$3,$NF}'
awk配合正则匹配
-
格式说明
awk '/正则表达式/{print $0}'
-
输出开头包含user的行
awk '/^user/{print $0}'
-
输出以nologin结尾的行
awk '/nologin$/{print $0}'
范围匹配
-
格式说明
NR
行
NR==
等于行
NR>=
大于等于行
NR<=
小于等于
NR>=N&&NR<=M
从N行到M行
/关键词1/,/关键词2/
-
输出/etc/passwd第2行并显示行号
awk 'NR==2{print NR,$0}'
-
输出/etc/passwd第2行以后的所有行
awk 'NR>2{print NR,$0}'
-
输出/etc/passwd第1到5行所有内容
awk 'NR<=5{print NR,$0}'
-
输出/etc/passwd以root开头到sshd开头的行
awk '/^root/,/^sshd/{print NR,$0}'
-
特殊动作-BEGIN-END 在动作之前做什么操作
seq 1 10|awk 'BEGIN{print "开始"}{print $0}END{print "结束"}'
awk -F: '$3>100{a++}END{print a}' /etc/passwd
扩展-数组
-
统计排名前10的IP地址
-
方法1:
awk '{print $1}' access_log |sort | uniq -c | sort -rn | head -5
-
方法2:
awk '{LOG[$1]++}END{for(IP in LOG) print IP,LOG[IP]}' access_log |sort -rn | head -5
- LOG和IP 都是自己定义的变量
[]数组
for(变量 in 循环范围) 循环
$1 第一列
- LOG和IP 都是自己定义的变量
-
-
不纯
awk
(即方法一耗时)real 0m11.439s
user 0m7.462s
sys 0m3.954s
-
纯
awk
(即方法二耗时)real 0m3.437s
user 0m2.751s
sys 0m0.679s
9.定时任务
-
定时任务的使用场景
- 定时 任务
有一些工作需要定时执行
定时备份数据库
定时日志切割/删除
定期巡检
- 定时 任务
-
定时任务实践
定时任务语法详解:
# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
-
记忆口诀
-
++分 时 日 月 周++
* * * * * */5 * * * * 30 00 * 2 6 00 1,6 * * * * 2-8 * * * */5 2-8 * * *
-
-
间隔符号
*
每*/N
每隔N
精确的时间N,M
第N 和 M的时间N-M
第N 到 M的时间
定时任务时间表达练习
-
秘诀: 先把5颗星打好
每分钟都执行
* * * * *
-
每天0点执行
00 00 * * *
-
每天凌晨1点30分执行
30 01 * * *
-
每小时整执行
00 * * * *
-
每隔2小时整执行
00 */2 * * *
-
每隔30分钟执行
*/30 * * * *
-
每个月的15号01点整执行
00 01 15 * *
-
每个月1-14号凌晨5点整执行
00 05 1-14 * *
-
每隔5天的上午6点到8点之间每隔10分钟执行一次
*/10 06-08 */5 * *
-
白天08-15点之间,每隔2小时执行一次
00 08-15/2 * * *
-
周一到周三每天晚上11点执行
00 23 * * 01-03
-
每季度末执行一次
00 00 01 */3 *
定时任务配置管理
-
命令格式
crontab [选项]
-
内容的格式:
* * * * * 执行的命令
-
常用参数
-l
列出当前用户所有的定时任务
-e
编辑当前用户的定时任务配置 -
小试身手
-
第一步:编辑定时任务,操作命令和
VIM
一样
crontab -e
++命令本质上就是操作文件/etc/crontab
++
#错误案例%在crontab里有特殊含义 #* * * * * echo "magician -> $(date +%F)" >> /tmp/cron.log #正确案例 * * * * * echo "magician -> $(date +\%F)" >> /tmp/cron.log #更正确的案例 &>>代表即使执行失败也会把错误输出到日志文件 * * * * * echo "magician -> $(date +\%F)" &>> /tmp/cron.log
- 第二步:查看定时任务
crontab -l
-
-
总结:
1)定时任务是后台执行的,不会将信息输出到终端上,如果要看执行结果,自己写到文本里
2)有一些符号在crontab里有特殊含义,需要转义
3)通过
/var/log/cron
可以查看定时任务是否按时执行了。以及执行的过程4)一般定时任务我们不管正确和错误都要输出
-
记住公式:
* * * * * 要执行的命令或脚本 &>> 日志
定时任务实战练习
-
练习1: 每天执行一次删除/var/log/nginx/目录下7天以前日志的任务
00 06 * * * cd /var/log/nginx/ && find . -type f -mtime +7|xargs rm -rf &>> /tmp/nginx_log_cron.log
-
练习2: 备份任务
-
需求如下:
-
1.每天凌晨1点备份一次
00 01 * * *
-
备份需求:
备份内容为/var/log目录到/backup目录下
备份格式为2021-11-07_主机名_log.tar.gz
mkdir -p /backup
cd /var/log && tar zcf /backup/$(date +%F)_$(hostname)_log.tar.gz *
-
要求备份文件只保留3天,多余的删掉
cd /backup && find . -type f -mtime +3|xargs rm -rf
-
将命令写进脚本里并赋予执行权限
脚本名:
/opt/backup_log.sh
-
脚本内容:
#!/bin/bash mkdir -p /backup cd /var/log && tar zcf /backup/$(date +%F)_$(hostname)_log.tar.gz * cd /backup && find . -type f -mtime +3|xargs rm -rf
-
-
赋予脚本的可执行权限:
chmod +x /opt/backup_log.sh
-
编写定时任务并将执行的结果保存到日志里/tmp/backup.log
00 01 * * * bash /opt/backup_log.sh &>> /tmp/backup.log
-
-
-
调试技巧
1)先不要动手做,先百分百理解题意
2)拆解步骤分解成每一个小步骤
3)现在shell实现命令正确
4)将测试成功的命令堆叠到脚本里
5)定时任务去执行脚本
6)记得要将执行结果不管是正确还是错误输出到日志里
7)调试的时候可以把时间缩短,但是调试成功后记得改成正常的定时时间
定时任务调试
-
工作中定时任务的坑
-
坑1:没打日志,不知道定时任务有没有执行
解决方式:
1)看定时任务系统日志 /var/log/cron
2)将正确和错误都打印到日志
-
坑2:shell命令行可以执行,但是放进定时任务里执行不成功,提示命令不存在
解决方式:
1)第一种解决方法:使用命令的绝对路径
2)第二种解决方法:将缺失的环境变量写入脚本
-
坑3:时间久了,不知道这条定时任务是干嘛的了
解决方式:
1)写注释,方便自己也方便别人,功能 作者 时间 版本
-
-
调试定时任务的思路
1)先把定时任务的命令在命令终端执行测试好,确定没问题之后再写进定时任务里
2)调试的时候可以将执行过程详细的输出到日志里,方便排查问题
3)定时任务执行的命令使用绝对路径
4)如果是执行的脚本,最好加上可执行权限
5)调试的阶段可以缩短定时任务执行的间隔,方便测试出结果
6)最后别忘了给定时任务添加注释。方便自己,也方便他人阅读
10.磁盘管理与lvm逻辑卷管理
磁盘管理
-
目标
- Linux文件系统--了解即可
- Linux磁盘分区命令mkfs.xfs--熟练掌握
- Linux磁盘挂载命令mount--熟练掌握
- Linux磁盘自动挂载/etc/fstab--熟练掌握
- Linux磁盘查看命令--熟练掌握
-
磁盘的分类--了解即可
-
1.按接口
SATA 100M/s
SAS 300M/s
m.2 500-1000M/s
-
2.按存储介质
机械硬盘
固态硬盘
-
-
硬盘使用注意
机械硬盘 害怕震动 不平的放置
固态硬盘 意外断电
-
秘传
固态硬盘至少5年质保
一般只换不修
-
分区、文件系统、格式化--了解即可
-
1.为什么要分区--户型
-
分区就是将物理的磁盘划分为逻辑的多个互相隔离的区域
就是按功能将磁盘划分为多个区域,系统盘,数据盘,资料
Windows:C盘/系统盘 D盘 E盘
Linux: / /boot
-
重点一句话:
Linux里几乎不用分区,一个盘就是一个区,挂载到一个目录下即可使用
-
-
2.文件系统--装修风格
-
Windows:
FAT32
最多支持16T文件系统,最大支持存储不超过4G大小的单个文件
NTFS
最多支持16EB的文件系统,最大支持存储16EB的文件 -
Linux:
EXT4
最大支持1EB文件系统,最大支持单个文件16T,CentOS7以前使用此文件系统
XFS
比EXT4更先进的64位文件系统,最大支持8EB的文件系统,最大单个文件支持8EB,CentOS7默认文件系统
-
-
3.格式化--施工
格式化就是按照选定的文件系统类型,准备好底层的存储格式
- 注意:
格式化会清空原来所有的数据
- 注意:
-
Linux下查看磁盘分区情况-fdisk
-
分区命令
fdisk
-
重要选项
-l
查看磁盘信息 -
Linux磁盘命名规则
-
第一块盘 /dev/sda
第一个分区 /dev/sda1
第二个分区 /dev/sda2
-
第二块盘 /dev/sdb
-
-
命令使用
-
[root@centos7-magician~]# fdisk -l
...
会列出所有磁盘信息 -
[root@centos7-magician~]# fdisk -l /dev/sdb
-
此命令查看指定的磁盘信息
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes
-
-
Linux磁盘格式化分区-mkfs
-
命令作用
将磁盘进行格式化 xfs
-
重要选项
-f
强制格式化 -
命令使用
mkfs.xfs /dev/sdb
-
注意
如果磁盘已经格式化过了,已经创建好了文件系统,那么再次格式化会提示需要使用
-f
强制覆盖[root@centos7-magician ~]# mkfs.xfs /dev/sdb mkfs.xfs: /dev/sdb appears to contain an existing filesystem (xfs). mkfs.xfs: Use the -f option to force overwrite.
Linux磁盘挂载 mount/umount
-
命令作用
临时
挂载/取消挂载
++新增加的磁盘要想正常使用必须挂载到某个目录下才行++ -
常用选项
-a
重新加载/etc/fstab
文件里的配置 -
命令格式
mount [选项] 要挂载的硬盘 要挂载的目录
umount [选项] 要取消挂载的目录
-
命令使用
-
第一步:创建目录
mkdir /data
-
第二步:挂载磁盘
mount /dev/sdb /data
-
第三步:查看磁盘挂载情况
[root@centos7-magician~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 1.1G 16G 6% / devtmpfs 475M 0 475M 0% /dev tmpfs 487M 0 487M 0% /dev/shm tmpfs 487M 7.7M 479M 2% /run tmpfs 487M 0 487M 0% /sys/fs/cgroup /dev/sda1 1014M 133M 882M 14% /boot tmpfs 98M 0 98M 0% /run/user/0 /dev/sdb 20G 33M 20G 1% /data
-
第四步:卸载已经挂载的目录
umount /data
-
-
挂载中的注意事项!!!
-
第一:挂载的注意事项
挂载磁盘到目录时,会盖住原来这个目录下的所有文件,但是并没有真正的删除,只是隐藏起来了。
当我们取消这个目录的挂载时,原来的文件又可以看到了
-
第二:卸载的注意事项
错误提示:
[root@centos7-magician data]# umount /data/
umount: /data: target is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
- 出现这种错误的可能情况
1)有程序正在使用这个目录下的文件
2)执行卸载命令的时候,你就在这个目录下
- 出现这种错误的可能情况
-
第三:数据更新的注意事项
问题现象:
磁盘挂载到目录后,看的数据不是最新的,还是未挂载之前的数据
此时进行的操作都还是源目录下的文件
-
问题原因:
你挂载的时候,
正在这个目录下
,这时候你看到的都是原目录里数据,即使挂载成功了,看到的还是原来的 -
问题解决:
退出
这个目录,再进去或者查看就行了,简单来讲,只是幻象
-
-
总结:如何避开风险
挂载的时候,如果还需要以前的数据,可以先备份一份,挂载后再复制回去
挂载的时候别在当前目录,因为这样看到的是老数据
卸载的时候确保没有程序正在占用目录里文件
卸载的时候不要在目录里
-
开机自动挂载
-
为什么要开机自动挂载?
如果不是自动开机挂载,那么就意味着每次服务器重启都需要
自己手动
挂载先临时挂载测试数据是否生效,然后再写入开机自动挂载文件,当下次开机的时候就会
自动生效
了 -
重要配置文件
cat /etc/fstab
UUID=c52d80d0-e1cc-4456-99f7-2c3f3f616a68 /boot xfs defaults 0 0
UUID 磁盘的身份证 挂载目录 文件系统 不改 不改
/dev/sdb 磁盘路径(不要用这一种,最好用UUID)
-
实战-开机自动挂载
-
第一步:添加硬盘
-
第二步:格式化文件系统
-
第三步:临时挂载
-
第四步:查看挂载是否正常
-
第五步:++查看磁盘设备的UUID++
[root@centos7-magician~]#
blkid /dev/sdb
/dev/sdb: UUID="21318219-5ef0-4965-8f94-843e397cdb6c" TYPE="xfs"
-
第六步:备份一下/etc/fstab
-
第七步:将自动挂载信息写入/etc/fstab
建议先cat,然后复制到文本里,修改好再编辑
UUID=21318219-5ef0-4965-8f94-843e397cdb6c /data xfs defaults 0 0
- 或者echo追加进去(容易清空配置)
echo "UUID=21318219-5ef0-4965-8f94-843e397cdb6c /data xfs defaults 0 0" >> /etc/fstab
- 或者echo追加进去(容易清空配置)
-
第八步:如果不想重启,可以mount -a检查是否挂载正常
mount -a
-
磁盘查看相关的命令
-
df查看磁盘信息
df -h
-
查看磁盘UUID
blkid /dev/sdb
-
查看目录的使用情况
du -sh
-
查看磁盘分区信息
fdisk -l
dd命令生成文件
-
命令作用
按照需求生成指定大小的文件,举例:
我想生成一个1G正好的文件
可以测试磁盘的速率
可以用来彻底的抹除文件
可以用来刻录镜像到U盘里
-
重要选项
if
=/dev/zero
of
=1G.txt
bs
=1M
count
=1024 -
命令组合
-
生成指定大小的文件
dd if=/dev/zero of=1G.txt bs=1M count=1024
-
刻录镜像
dd if=你的ISO镜像文件路径 of=你的U盘路径
-
-
危险--可以清空磁盘
dd if=/dev/urandom of=/dev/sda1
dd if=/dev/urandom of=/dev/sda2
添加硬盘步骤总结
-
第一步:添加硬盘
-
第二步:检查磁盘是否可以识别
fdisk -l
-
第三步:格式化文件系统
mkfs.xfs
-
第四步:临时挂载
mount /dev/sdb /mnt
-
第五步:查看挂载是否正常
df -h
-
第六步:查看磁盘设备的UUID
blkid /dev/sdb
-
第七步:备份一下/etc/fstab
cp /etc/fstab /opt/
-
第八步:将自动挂载信息写入/etc/fstab
UUID=21318219-5ef0-4965-8f94-843e397cdb6c /data xfs defaults 0 0
-
第九步:如果不想重启,可以mount -a检查是否挂载正常
mount -a
lvm逻辑卷管理
-
重点:
RAID阵列组合--纯理论 需要背
LVM逻辑卷管理--必须掌握
LVM概念
PV
、VG
、LV
--必须掌握LVM创建流程--必须掌握
-
RAID磁盘阵列
- 什么是RAID
RAID是物理服务器上的一项技术
物理服务器上有一块主板就叫RAID卡
RAID技术就是一种可以将多块磁盘
按不同的组合模拟成一块盘
让系统使用
- 什么是RAID
-
RAID常见组合
RAID0
RAID1
RAID5
RAID10
-
什么是LVM
LVM (Logical Volume Manager)
逻辑卷管理LVM是一种把硬盘空间分配成逻辑卷的方法和RAID类似,只不过LVM是
软件模拟
的而RAID一般是硬件控制卡
控制。 -
为什么需要LVM?
设想一下,工作中的生产服务器,一开始没有规划好磁盘容量的选型,随着时间和用户的增长,需要对磁盘进行扩容,这时候如果没有做
LVM
就++只能添加新磁盘和新分区++ ,但是数据文件还是在旧的磁盘分区上,那么就只能停止业务
进行数据迁移了。 -
LVM最大的优势
- 就是就是将多个物理分区抽象组合成一个逻辑卷组,而且这个逻辑卷组是可以
动态扩容
的,新添加的磁盘只需要通过相应的命令添加到指定的逻辑卷组
里,就可以不停机的情况
下立即被Linux系统识别并使用。
- 就是就是将多个物理分区抽象组合成一个逻辑卷组,而且这个逻辑卷组是可以
-
LVM相关概念
物理存储介质(The Physical media)
物理上的存储设备,可以是整块硬盘或硬盘的某个分区,比如:/dev/sda,/dev/sda1
-
物理卷(Physical Volume,
PV
)物理介质更上一层,包含了LVM的管理命令
-
卷组(Volume Group,
VG
)物理卷更上一层,卷组可以由一个或多个物理卷组成
-
逻辑卷(Logical Volume,
LV
)逻辑卷属于卷组划分出来的逻辑空间,文件系统就是建立在逻辑卷之上。
-
-
LVM的创建流程
1)添加硬盘
2)安装LVM软件
3)创建PV
4)创建VG,将多个PV划为一个或多个卷组(VG)
5)创建LV,从VG里获得使用空间
6)将LV格式化成XFS
7)将LV挂载到使用目录
8)检查挂载情况
9)写入开机自动挂载文件
10)检查开机自动挂载配置是否正确
-
LVM常用命令汇总
操作项 PV命令 VG命令 LV命令 创建(create) pvcreate vgcreate lvcreate 查看(display) pvs vgs lvs 增加(extend) vgextend lvextend 减少(reduce) 删除(remove) lvremove 改变容量(resize)
-
原理图如下:
-
LVM实验
添加磁盘
-
虚拟机添加两块10G的虚拟磁盘
重启虚拟机,检查是否可以识别到设备
-
[root@centos7-magician~]# fdisk -l|egrep "/dev/sd[^a]"
Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
-
安装LVM软件
yum install lvm2 -y
创建PV
-
命令格式
pvcreate 磁盘1 磁盘2
-
查看当前pv信息
[root@centos7-magician~]# pvs PV VG Fmt Attr PSize PFree /dev/sda2 centos lvm2 a-- <19.00g 0
-
创建pv
[root@centos7-magician ~]# pvcreate /dev/sdb /dev/sdc Physical volume "/dev/sdb" successfully created. Physical volume "/dev/sdc" successfully created.
-
再次查看pv
[root@centos7-magician~]# pvs|grep -v "sda" PV VG Fmt Attr PSize PFree /dev/sdb lvm2 --- 20.00g 20.00g /dev/sdc lvm2 --- 20.00g 20.00g
创建VG
-
命令格式
vgcreate -s 块大小 vg卷名 磁盘1 磁盘2
-
查看vg信息
[root@centos7-magician ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 1 2 0 wz--n- <19.00g 0
-
创建vg
[root@centos7-magician ~]# vgcreate -s 16M magician-vg /dev/sdb /dev/sdc Volume group "magician-vg" successfully created
-
再次查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 2 0 0 wz--n- <39.97g <39.97g
创建LV
-
命令格式
lvcreate -l 使用空间百分比 -n 逻辑卷名称 vg卷组名称
-
查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
-
创建lv使用40%的vg空间
[root@centos7-magician ~]# lvcreate -l 40%VG -n magician-lv01 magician-vg Logical volume "magician-lv01" created.
-
再次查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv01 magician-vg -wi-a----- 15.98g
-
创建lv使用剩余所有的vg空间
[root@centos7-magician ~]# lvcreate -l 100%FREE -n magician-lv02 magician-vg Logical volume "magician-lv02" created.
-
再次查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv01 magician-vg -wi-a----- 15.98g magician-lv02 magician-vg -wi-a----- 23.98g
-
再次查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 2 2 0 wz--n- <39.97g 0
格式化LV
-
查看lv的设备路径
[root@centos7-magician ~]# ll /dev/magician-vg/* lrwxrwxrwx. 1 root root 7 Nov 21 11:36 /dev/magician-vg/magician-lv01 -> ../dm-2 lrwxrwxrwx. 1 root root 7 Nov 21 11:38 /dev/magician-vg/magician-lv02 -> ../dm-3
-
将创建的lv格式化成
xfs
格式[root@centos7-magician ~]# mkfs.xfs /dev/magician-vg/magician-lv01 meta-data=/dev/magician-vg/magician-lv01 isize=512 agcount=4, agsize=1047552 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=4190208, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@centos7-magician ~]# mkfs.xfs /dev/magician-vg/magician-lv02 meta-data=/dev/magician-vg/magician-lv02 isize=512 agcount=4, agsize=1571840 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=6287360, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=3070, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
创建目录并挂载
-
创建目录
[root@centos7-magician ~]# mkdir -p /data{1..2} [root@centos7-magician ~]# ls -ld /data* drwxr-xr-x. 2 root root 6 Nov 21 11:45 /data1 drwxr-xr-x. 2 root root 6 Nov 21 11:45 /data2
-
挂载使用
[root@centos7-magician ~]# mount /dev/magician-vg/magician-lv01 /data1/ [root@centos7-magician ~]# mount /dev/magician-vg/magician-lv02 /data2/
-
查看挂载情况
[root@centos7-magician ~]# df -h|grep "data" /dev/mapper/magician--vg-magician--lv01 16G 33M 16G 1% /data1 /dev/mapper/magician--vg-magician--lv02 24G 33M 24G 1% /data2
-
写入数据测试
dd if=/dev/zero of=/data1/2G.txt bs=100M count=20 dd if=/dev/zero of=/data2/2G.txt bs=100M count=20
-
查看数据写入情况
[root@centos7-magician ~]# df -h|grep "data" /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 24G 2.0G 22G 9% /data2
-
写入开机自动挂载
[root@centos7-magician ~]# cat /etc/fstab|grep magician /dev/mapper/magician--vg-magician--lv01 /data1 xfs defaults 0 0 /dev/mapper/magician--vg-magician--lv02 /data2 xfs defaults 0 0 [root@centos7-magician ~]# mount -a [root@centos7-magician ~]# df -h|grep data /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 24G 2.0G 22G 9% /data2
LVM扩容实验
-
扩容步骤
1)添加磁盘
2)创建pv
3)扩容vg
4)扩容lv
5)
-
1.添加新磁盘
[root@centos7-magician ~]# fdisk -l|egrep "/dev/sd[^a]" Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
-
2.查看当前的挂载信息
[root@centos7-magician~]# df -h|grep data /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 24G 2.0G 22G 9% /data2
-
3.创建pv
[root@centos7-magician ~]# pvcreate /dev/sdd Physical volume "/dev/sdd" successfully created.
-
4.++扩容vg++
[root@centos7-magician ~]# vgextend magician-vg /dev/sdd Volume group "magician-vg" successfully extended
-
5.查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 3 2 0 wz--n- 59.95g 19.98g
-
6.查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv01 magician-vg -wi-ao---- 15.98g magician-lv02 magician-vg -wi-ao---- 23.98g
-
7.++扩容lv++
[root@centos7-magician ~]# lvextend -l +100%FREE /dev/magician-vg/magician-lv02 Size of logical volume magician-vg/magician-lv02 changed from 23.98 GiB (1535 extents) to <43.97 GiB (2814 extents). Logical volume magician-vg/magician-lv02 successfully resized.
-
8.查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv01 magician-vg -wi-ao---- 15.98g magician-lv02 magician-vg -wi-ao---- <43.97g
-
9.查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 3 2 0 wz--n- 59.95g 0
-
10.查看挂载信息
[root@centos7-magician ~]# df -h|grep data /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 24G 2.0G 22G 9% /data2
-
11.让xfs识别扩容后的容量
[root@centos7-magician ~]# xfs_growfs /dev/magician-vg/magician-lv02 meta-data=/dev/mapper/magician--vg-magician--lv02 isize=512 agcount=4, agsize=1571840 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=6287360, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=3070, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 6287360 to 11526144
-
12.再次查看目录挂载信息
[root@centos7-magician ~]# df -h|grep data /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 44G 2.0G 42G 5% /data2
-
13.写入超过20G的文件
[root@centos7-magician ~]# dd if=/dev/zero of=/data2/30G.txt bs=100M count=300 300+0 records in 300+0 records out 31457280000 bytes (31 GB) copied, 28.4828 s, 1.1 GB/s
-
14.再次查看挂载目录信息
[root@centos7-magician ~]# df -h|grep data /dev/mapper/magician--vg-magician--lv01 16G 2.0G 14G 13% /data1 /dev/mapper/magician--vg-magician--lv02 44G 32G 13G 72% /data2
LVM资源回收实验
-
1.删除并卸载
[root@centos7-magician ~]# cd /data1/ [root@centos7-magician /data1]# ls 2G.txt [root@centos7-magician /data1]# rm -rf * [root@centos7-magician /data1]# cd [root@centos7-magician ~]# umount /data1
-
2.查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv01 magician-vg -wi-a----- 15.98g magician-lv02 magician-vg -wi-ao---- <43.97g
-
3.查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 3 2 0 wz--n- 59.95g 0
-
4.++删除lv++
[root@centos7-magician ~]# lvremove /dev/magician-vg/magician-lv01 Do you really want to remove active logical volume magician-vg/magician-lv01? [y/n]: y Logical volume "magician-lv01" successfully removed
-
5.查看lv信息
[root@centos7-magician ~]# lvs|grep -v "centos" LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert magician-lv02 magician-vg -wi-ao---- <43.97g
-
6.查看vg信息
[root@centos7-magician ~]# vgs|grep -v "centos" VG #PV #LV #SN Attr VSize VFree magician-vg 3 1 0 wz--n- 59.95g 15.98g
11.软件包管理与服务管理
软件包管理
-
目标
- Linux有几种安装软件的方式--了解
CentOS系统安装软件的常见方法--掌握
软件包管理相关的命令:yum,rpm--必须掌握
会配置yum源--必须掌握
以后多行配置就用cat
- Linux有几种安装软件的方式--了解
-
CentOS软件包格式
*.rpm
*.tar.gz
-
CentOS安装软件几种方式
- 在线安装:
yum命令(无法指定安装路径) - 离线安装:
rpm包(无法指定安装路径)
二进制包
源码包编译
- 在线安装:
-
用户/软件/配置文件/进程的关系
用户 --> 命令 --> 配置文件 --> 运行中 --> 写日志
运行用户
日志路径
运行参数
rpm包管理命令
-
命令格式
rpm [选项] 软件包
-
重要选项
-i
安装
-v
显示详细信息
-h
进度条
-e
卸载
-ql
查看这个软件包所有的文件的安装路径
-qc
查看这个软件包配置文件的安装路径 -
rpm包安装Nginx
-
第一步:下载rpm包
yum install wget -y
wget https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.2-1.el7.ngx.x86_64.rpm
-
第二步:安装
rpm -ivh nginx-1.20.2-1.el7.ngx.x86_64.rpm
-
第三步:查看安装包所有的文件
精简重要文件及目录
[root@centos7-magician~]#
rpm -ql nginx
...
/var/log/nginx
/usr/sbin/nginx
/etc/nginx/nginx.conf
/usr/share/nginx/html/index.html
/usr/lib/systemd/system/nginx.service
...
-
第四步:只查看安装包的配置文件
[root@centos7-magician~]#
rpm -qc nginx
...
/etc/nginx/nginx.conf
...
-
第五步:启动
iptables -F
systemctl start nginx
-
第六步:访问测试
http://10.0.0.100/
-
-
删除软件
-
有残留但安全
rpm -e nginx
-
危险 你确定你知道你要干什么吗?
rm -rf $(rpm -ql nginx)
rpm -ql nginx|sed -r 's#(.*)#rm -rf \1#g'
rpm -ql nginx|awk '{print "rm -rf "$0}'
-
yum在线安装
-
为什么要用
yum
yum解决了需要自己去找rpm包的麻烦,把大部分软件包都放到软件仓库里
yum可以
自动解决
软件依赖问题,相关的依赖会自动下载并安装 -
相关概念
- yum命令
yum仓库
软件依赖包 - yum源:
base
源
epel
源
第三方
源
- yum命令
-
yum命令
yum search
yum install
yum remove
yum makecache
yum clean all
yum list
yum provides
配置base源
-
源文件目录:
[root@centos7-magician~]# cd /etc/yum.repos.d/ [root@centos7-magician/etc/yum.repos.d]# ll total 32 -rw-r--r--. 1 root root 1664 Nov 23 2018 CentOS-Base.repo -rw-r--r--. 1 root root 1309 Nov 23 2018 CentOS-CR.repo -rw-r--r--. 1 root root 649 Nov 23 2018 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 314 Nov 23 2018 CentOS-fasttrack.repo -rw-r--r--. 1 root root 630 Nov 23 2018 CentOS-Media.repo -rw-r--r--. 1 root root 1331 Nov 23 2018 CentOS-Sources.repo -rw-r--r--. 1 root root 5701 Nov 23 2018 CentOS-Vault.repo
-
配置base源:
访问地址
https://developer.aliyun.com/mirror/
-
保存命令
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
-
删除aliyuncs内容
sed -i '/aliyuncs/d' /etc/yum.repos.d/CentOS-Base.repo
-
生成缓存
yum makecache
配置epel源:
官方地址
https://developer.aliyun.com/mirror/epel
-
配置源
curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
或者
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
-
生成缓存
yum makecache
配置nginx官方源(第三方源):
-
官方地址
https://nginx.org/en/linux_packages.html#RHEL
-
配置源
cat > /etc/yum.repos.d/nginx.repo << 'EOF' [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF
-
生成缓存
yum makecache
-
列出所有版本
yum list nginx --showduplicates
-
安装Nginx
yum install nginx -y
-
查看配置
[root@centos7-magician~]#
rpm -qc nginx
/etc/logrotate.d/nginx
/etc/nginx/conf.d/default.conf
/etc/nginx/fastcgi_params
/etc/nginx/mime.types
/etc/nginx/nginx.conf
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
-
启动
iptables -F
systemctl start nginx
-
卸载
yum remove nginx -y
二进制软件包安装
-
什么是二进制软件包
简单来讲,就是这个软件的所有的文件都打包放到了一个压缩包里,
直接解压配置环境变量
就可以使用好处是
所有的文件都在一个目录里
-
实验-
rpm
包安装mongodb[root@centos7-magician~]#
rpm -ql mongodb-org-server-7.0.3-1.el7
/etc/mongod.conf #配置文件
/usr/bin/mongod #启动命令
/usr/lib/systemd/system/mongod.service #启动文件
/var/log/mongodb/mongod.log #日志
-
启动文件
[root@centos7-magician~]#
mongod --version
db version v7.0.3
Build Info: {
"version": "7.0.3",
"gitVersion": "b96efb7e0cf6134d5938de8a94c37cec3f22cff4",
"openSSLVersion": "OpenSSL 1.0.1e-fips 11 Feb 2013",
"modules": [],
"allocator": "tcmalloc",
"environment": {
"distmod": "rhel70",
"distarch": "x86_64",
"target_arch": "x86_64"
}
}
-
实验-
二进制
包安装mongodb
tar zxf mongodb-linux-x86_64-rhel70-7.0.3.tgz -C /opt/
解压opt
mv mongodb-linux-x86_64-rhel70-7.0.3 mongodb-7.0.3
改名
ln -s mongodb-7.0.3 mongodb
创建软链接
mkdir -p /opt/mongodb/{data,log,pid,conf}
创建对应文件cat >/opt/mongodb/conf/mongodb.conf << 'EOF' systemLog: destination: file logAppend: true path: /opt/mongodb/log/mongodb.log storage: dbPath: /opt/mongodb/data/ directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 0.5 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true pidFilePath: /opt/mongodb/pid/mongod.pid net: port: 27017 bindIp: 127.0.0.1 EOF
- 写配置文件
echo "PATH=$PATH:/opt/mongodb/bin/" >> /etc/profile
添加命令路径到环境变量
source /etc/profile
重新加载环境变量
mongod -f /opt/mongodb/conf/mongodb.conf
启动
tree /opt/mongodb -L 2
查看目录文件
- 实验-二进制包安装jdk
tar zxf jdk-8u221-linux-x64.tar.gz -C /opt/
ln -s /opt/jdk1.8.0_221 /opt/jdk
echo "PATH=$PATH:/opt/jdk/bin/" >> /etc/profile
source /etc/profile
java -version
源码编译安装
-
什么是源码编译
我们使用的命令其实都是由代码写出来的,一般都是C语言写的
写好的代码并不能直接Linux使用,必须使用编译器进行源码编译,而编译后的产物就是二进制命令
-
源码编译的步骤
下载源码包
源码参数配置
编译构建
安装
-
实验-源码编译Nginx
-
下载源码包
tar zxf nginx-1.24.0.tar.gz
-
安装c语言编译器
yum install gcc make openssl-devel pcre-devel -y
-
添加用户
groupadd www -g 888
useradd www -u 888 -g 888 -M -s /sbin/nologin
id www
-
配置编译参数
./configure \ --prefix=/opt/nginx \ --user=www \ --group=www \ --with-http_ssl_module \ --with-pcre
-
开始编译
make
-
安装
make install
-
启动
/opt/nginx/sbin/nginx
-
-
实验-源码编译redis
wget -O redis-5.0.14.tar.gz http://download.redis.io/releases/redis-5.0.14.tar.gz
tar zxf redis-5.0.14.tar.gz
cd redis-5.0.14
make
make install
redis-cli -v
-
总结
-
安装方式
- rpm
- yum
- 二进制
- 源码
-
常用命令
-
rpm命令:
rpm -ivh
rpm -qc
rpm -e
-
yum命令:
yum install
yum makecache
yum remove
-
-
二进制流程:
解压
配置环境变量
修改配置文件
启动
-
源码编译流程:
tar *.tar.gz
./configure
make
make install
-
服务管理
-
重点:
服务启动管理命令--必须掌握
服务启动管理配置--理解+抄+改
用户、进程、配置文件、启动命令之间的关系--必须理解
-
systemd介绍
1.为什么需要编写systemd服务配置
- 如果我们是
二进制
或源码编译安装
的软件,默认是没有systemd配置文件
的
所以如果我们想让二进制或源码编译安装的软件可以使用systemctl
启动,就必须自己编写这个启动配置
nginx
redis
mongodb
- 如果我们是
-
注意
整个配置都不需要背,模板拿来抄,会改就行
如果这个程序有rpm包,那么先用rpm或yum安装,然后把启动配置抄过来
但是,你要理解这个配置里的每一行的含义,注意!不是背,是理解!!!
-
源码编译Nginx回顾
https://nginx.org/download/nginx-1.24.0.tar.gz
https://nginx.org/en/linux_packages.html#RHEL
https://nginx.org/packages/centos/7/x86_64/RPMS/
yum install gcc make openssl-devel pcre-devel -y
tar zxf nginx-1.24.0.tar.gz
cd nginx-1.24.0
groupadd www -g 888
useradd www -u 888 -g 888 -M -s /sbin/nologin
./configure --prefix=/opt/nginx-1.24 --user=www --group=www --with-http_ssl_module --with-pcre
make
make install
ln -s /opt/nginx-1.24 /opt/nginx
-
编写systemd启动配置的前提知识
-
第一个知识点:nginx的相关管理命令
nginx -t
#检查配置文件语法是否正确,正确的标准一定是有且只有两行,一个ok一个successful
nginx
#启动命令
nginx -s stop
#停止命令
nginx -s reload
#重新加载配置
nginx -c nginx.conf
#使用指定的配置文件启动nginx
kill $(cat /var/run/nginx.pid)
#停止命令 -
第二个知识点:systemd和systemctl的关系
systemd是服务
systemctl是用来管理systemd服务的命令
-
第三个知识点:systemctl的管理命令
systemctl daemon-reload
改了配置文件不重启要生效就用此命令
systemctl start 服务名
systemctl stop 服务名
systemctl restart 服务名
systemctl status 服务名
systemctl enable 服务名
开机自启
systemctl is-enabled 服务名
systemctl disable 服务名
systemctl is-active 服务名
-
第四个知识点:自己写的服务启动配置路径
/usr/lib/systemd/system/服务名.service
-
第五个知识点:Pid作用
每个运行中的程序都有一个进程号,这个进程号就是pid
pid文件只有运行的时候才会产生,程序停止后会自动删除
将Pid保存到文件里有两个作用,第一是证明这个程序正在运行。第二是用来结束进程。
-
编写nginx的systemd启动配置
思路:
使用rpm或yum安装官方源的nginx,然后拿到启动配置之后,学习怎么修改
再深入学习systemd配置的编写
-
第一步:使用yum安装Nginx
-
第二步:使用
systemctl status nginx
查看官方nginx启动配置在哪里 -
第三步:借鉴官方的配置
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking #子进程模式
PIDFile= #程序运行的进程号文件
ExecStart= #启动nginx的命令
ExecReload= #重载nginx的命令
ExecStop= #停止nginx的命令
[Install]
WantedBy=multi-user.target
-
第四步:修改并写入
cat > /usr/lib/systemd/system/nginx.service << 'EOF' [Unit] Description=nginx - high performance web server Documentation=http://nginx.org/en/docs/ After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking PIDFile=/opt/nginx/logs/nginx.pid ExecStart=/opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf ExecReload=/opt/nginx/sbin/nginx -s reload ExecStop=/opt/nginx/sbin/nginx -s stop [Install] WantedBy=multi-user.target EOF
-
第五步:systemd重新加载配置
systemctl daemon-reload
编写redis的systemd启动配置
-
redis相关命令:
redis-server redis.conf
#启动命令
redis-cli shutdown
#关闭命令 -
redis配置文件:
mkdir -p /opt/redis/{conf,logs,pid}
cat > /opt/redis/conf/redis.conf <<EOF
daemonize yes
bind 127.0.0.1
port 6379
pidfile /opt/redis/pid/redis.pid
logfile /opt/redis/logs/redis.log
EOF
-
第一步:查看yum安装的redis的systemd启动文件
cat /usr/lib/systemd/system/redis.service
-
第二步:修改成我们的要求
cat > /usr/lib/systemd/system/redis.service << 'EOF' [Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] Type=forking ExecStart=/usr/local/bin/redis-server /opt/redis/conf/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown [Install] WantedBy=multi-user.target EOF
systemd文件格式说明
-
systemd unit文件通常是由三部分组成的
[Unit] #一般定义的是通用选项,比如描述信息,依赖关系等
[Service] #特定服务的类型,具体的启动关闭重启选项都在此部分配置
[Install] #定义由开机自启和不开机自启命令时实现的选项
-
Unit
段常用说明:Description #描述信息
Documentation #说明文档的在线地址
After #定义启动顺序,表示当前配置的服务应该晚与哪些服务之后启动
Wants #依赖其他的服务
-
Service
段常用说明:Type #定义服务类型
forking #需要父进程启动子进程的服务类型为forking
PIDFile #定义PID文件路径
ExecStart #指定启动服务命令绝对路径
ExecReload #指定重新加载服务的配置文件的命令绝对路径
ExecStop #指定停止服务命令绝对路径
ExecStartPre #在启动之前运行的命令
ExecStartPost #在启动之后运行的命令
User #启动用户
Group #启动用户组
-
Install
段常用说明:WantedBy #哪些服务需要被依赖
-
Linux用户运行模式
0
关机
1
2
3
多用户命令模式
4
5
多用户图形界面模式
6
重启- 切换命令:
init N
- 切换命令:
-
总之只需要修改中文部分
cat > /usr/lib/systemd/system/别忘改了.service << 'EOF' [Unit] After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking ExecStart=启动命令 ExecStop=停止命令 [Install] WantedBy=multi-user.target EOF
总结配置步骤
-
第零步:删除所有的默认源,配置base,epel,nginx源(练习)
-
第一步:编译安装
gcc make openssl-devel pcre-devel -y
./configure --prefix=/opt/nginx-1.24 --user=www --group=www --with-http_ssl_module --with-pcre
-
第二步:收集原生程序的启动和关闭命令
nginx -c nginx.conf
nginx -s stop
nginx -s reload
-
第三步:先手动再终端里测试一下启动命令是否好使
-
第四步:把systemd模板拿过来进行替换修改
cat > /usr/lib/systemd/system/别忘改了.service << 'EOF' [Unit] After=network-online.target remote-fs.target nss-lookup.target Wants=network-online.target [Service] Type=forking ExecStart=启动命令 ExecStop=停止命令 [Install] WantedBy=multi-user.target EOF
-
第五步:systemd重新加载配置
-
第六步:使用systemctl启动测试
12.进程管理
-
重点:
用户、启动命令、配置文件、进程、pid的关系--必须理解
如何查看进程的各种信息--必须掌握
最常用的三个命令:ps、top、lsof、kill杀手家族--必须掌握
-
不需要记所有的选项,只记最常用的组合
但是,要知道,这些命令能做到什么效果
ps查看系统进程状态
-
压测工具
yum install stress -y
-
stress --cpu 1
stress --vm 4 --vm-bytes 128M
stress --io 2 --hdd 4
-
ps常用参数
-
UNIX风格
a
#显示包含所有终端中的进程
u
#此选项使ps列出您拥有的所有进程(与ps相同的EUID),或与a选项一起使用时列出所有进程。
x
#显示进程所有者的信息
f
#显示进程树
o
#属性,显示定制的信息
k
#属性,对属性进行排序,属性前加-表示倒叙
--sort
#同上 -
使用标准语法查看系统上的每个进程
-e
#显示所有进程
-f
#显示完整格式程序信息
-p
#显示pid的进程
-C
#查找指定进程名
-q
#指定id
-u
#根据用户名或uid查找进程
-o
#输出指定列
-
-
查看所有进程--
99%情况使用
-
第一种风格UNIX:
ps aux
-
第二种风格标准:
ps -ef
-
-
案例演示
-
1.查看进程的父子关系
ps auxf
-
2.查看进程的特定属性
ps axo pid,%cpu,%mem,command
-
3.按CPU利用率排序
ps axo pid,%cpu,%mem,command k %cpu
-
4.按内存使用倒序排序
ps axo pid,%cpu,%mem,command k -%mem
ps aux|sort -rk 4
-
5.列出指定用户名和或用户ID的进程
ps -fu www
ps -ef|grep "^www"
-
6.查看指定进程ID对应的进程
ps -fq $(cat /opt/nginx/logs/nginx.pid)
ps -ef|grep "1000"
-
7.查找指定父进程ID下的所有的子进程
ps -f --ppid PID
ps
-ef|awk '$3==1{print $0}'
-
8.按照tty显示所属进程
ps -ft pts/1
ps -ef|grep "pts/1"
-
9.根据进程名查找所属PID
ps -C nginx -o pid=
ps -ef|grep "[n]ginx"|awk '{print $2}'
-
10.根据PID查找运行的命令
ps -C nginx -o cmd=
ps -q 8447 -o cmd=
-
-
ps能干啥:ps -ef|ps aux
PID
PPID
CPU
MEM
进程名
进程用户
定制显示字段
pstree 以树状图查看进程状态
-
命令作用:
以树状图显示父进程和子进程的关系
-
命令格式:
pstree [选项] [pid|user]
-
常用参数:
-p
显示PID
-u
显示用户切换
-H pid
高亮显示指定进程 -
查找并安装:
yum provides pstree
yum install psmisc
-
案例演示:
-
0.打印进程关系以及pid
pstree -p
-
1.查看指定pid的进程关系
pstree -p pid号
-
2.查看magician用户的进程关系
pstree -p magician
-
3.显示运行用户
pstree -pu
-
pidof 查看指定名称进程
-
命令作用:
显示指定程序的pid
-
举例:
pidof nginx
top查看当前的进程状态
-
命令作用:
展示进程动态的实时数据
-
常用参数:
-d
#指定刷新时间,默认3秒
-n
#刷新多少次后退出
-p
#指定pid -
常用内置快捷键:
-
帮助
h/?
#查看帮助
q/esc
#退出帮助 -
排序:
P
#按CPU使用百分比排序输出
M
#按内存使用百分比排序输出 -
显示
1
#数字1,显示所有CPU核心的负载
m
#显示内存内存信息,进度条形式
t
#显示CPU负载信息,进度条形式 -
退出
q
#退出top命令
-
lsof 查看进程打开文件
-
应用场景
找出文件或目录正在被哪个进程使用
找出某个进程正在使用哪些文件
查看网络连接状态
找回误删除的文件
-
常用参数:
-c
#显示指定程序名所打开的文件
-d
#显示打开这个文件的进程名
-i
#显示符合条件的进程
-p
#显示指定进程pid所打开的文件
-u
#显示指定用户UID的进程
+d
#列出目录下被打开的文件
+D
#递归累出目录下被打开的文件 -
状态解释:
COMMAND 进程的名称
PID 进程标识符
USER 进程所有者
FD 文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
TYPE 文件类型,如DIR、REG等
DEVICE 指定磁盘的名称
SIZE 文件的大小
NODE 索引节点(文件在磁盘上的标识)
NAME 打开文件的确切名称
-
练习
-
查看正在使用此文件的进程
lsof /opt/nginx/logs/access.log
-
查看指定pid号的进程打开的文件
pidof nginx
lsof -p PID
-
查看指定程序打开的文件
lsof -c nginx
-
查看指定用户打开的文件
lsof -u 888
lsof -u magician
-
查看
指定目录
下被打开的文件
lsof +d /opt/nginx/logs
-
查看
目录及子目录
下的文件占用
lsof +D /opt/nginx/
-
-
模拟找回误删除文件
前提:被误删的文件还有进程在使用,并且这个进程不能重启或退出。
-
1.新开一个终端使用tail查看nginx的访问日志,这里只是方便演示效果,不tail也可以恢复,只要nginx进程没有重启
-
2.然后在另一个终端重看日志的进程信息
-
3.此时我们模拟误删除了日志文件
-
4.然后我们再次查看相关进程会发现日志文件后多了一个(deleted)字样,等得出PID以及文件描述符
-
5.然后我们直接进入/proc/pid查看一下
-
6.通过查看可以发现,名称为4的链接就是我们删除后的文件
-
kill家族进程管理命令
-
kill家族
kill
狙击枪,精准,必须用pid
杀
pkill
手榴弹,大规模杀,不精准,可以根据进程名删除
killall
同pkill -
进程控制信号
信号名称 数字编号 信号含义
HUP
1 无需关闭进程并且让其重新加载配置文件
TERM
15 终止正在运行的进程,不特别指定数字信号的话,默认
就是15 -
Nginx官方的进程管理
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /var/run/nginx.pid)" ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /var/run/nginx.pid)"
-
注意:
- kill 不加参数默认是-15,强制删除是-9,但最好不要-9,因为很有可能导致内存中的数据丢失。
- -15是正常关闭,-9是强制关闭,进程来不及做关闭的善后操作就被灭了,可能导致留在内存的数据还未持久化就被删除了。
进程后台管理
-
前台进程和后台进程
前台进程就是运行在当前的终端,并且运行中的信息都会输出到屏幕上,会一直占用终端的使用。如果当前终端关闭了,则进程就自动退出了.
而后台进程则可以在终端的后台继续运行,但是并不会占用当前的终端使用。即使当前终端关闭了,进程也不会退出。
-
&,jobs,bg,fg -- 了解即可
命令作用:
&
#把未启动的进程放在后台执行,前台关了还是会停掉
jobs
#查看后台进程
ctrl + z
#将运行中的进程放在后台.但是暂停
bg
#将暂停的进程放在后台继续运行
fg
#将后台进程调回到前台 -
screen -- 重点推荐
快捷键操作:
screen -S 终端名称
#新建一个指定名称的终端
Ctrl + a + d
#切换到前台,但是保持后台运行的进程
screen -ls
#查看已经放在后台的进程名称列表
screen -r 名称或ID号
#进入指定名称的后台程序 -
tmux
也可满足上方要求
系统平均负载
-
命令
- [root@centos7-magician~]#
uptime
13:54:51 up 22:24, 1 user, load average:0.00, 0.01, 0.05
- [root@centos7-magician~]#
top
top - 13:54:57 up 22:24, 1 user, load average:0.00, 0.01, 0.05
- [root@centos7-magician~]#
-
负载三组数字解释
三组数字代表了不同时间段系统的负载情况
数字越高,表示系统负载压力越大
0.00, 0.01, 0.05
1分钟 5分钟 15分钟
-
什么是系统负载
系统负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。
简单来说就是可以被分配给CPU处理的活动进程数。
注意,平均负载指的并不是系统CPU使用率。
说人话,就是当前系统忙不忙,忙到啥程度
-
如何判断系统当前负载是否正常
核数 负载 说明 1 1 这表示所有程序都能处理的过来 1 2 有一半的进程需要等待调度 2 1 有一半的CPU资源是空闲的 2 2 这表示所有的CPU都被使用了 2 4 有一半的进程需要等待调度 4 4 这表示所有的CPU都被使用了
-
主观判断:负载数值不超过CPU核数
业务需求: 不得不运行超载的业务,但是如果只是短时间的,可以接受
趋势判断:系统在变好还是再变坏
-
-
可以使用stress压测CPU
-
stress --cpu 1
-
top
-
13.命令汇总
- tar
- cd
- mkdir
- ln
- cat
- ll
- ps -ef
- rm
- useradd
- groupadd
- cp
- mv
- systemctl
- grep
- sed
- awk
- vim
- echo
- yum
- rpm
- chown
- sort
- uniq
- tail
- head
- tree
- mount
- umount
- wc
- df -h
- find
- chmod
- free -h
- top
- fdisk
- usermod
- shutdown
- reboot
- init 0
- file
- which
- pwd
- whoami
- w
- id
- mkfs.xfs
- blkid
- stat
- lsattr
- chattr
- ip
- hostname
- su
- sudo
- visudo
- source
- bash
- history
- wget
- curl
- uptime
- date
- crontab
- umask
- time
- kill
- pkill
- killall
- seq
- man
- more
- less
- ping
- passwd
- unzip
- du
- dd
- alias
- clear
- cut
练习题(提高记忆)
普通文本命令相关
-
1.使用cat将以下文本写入到文件eth0.txt里,不解析变量
powershell#eth0 TYPE=Ethernet NAME=eTh0 DEVICE=[Eth0] ONBOOT="yes" IPADDR=$(hostname -I) EOF #eth1 PREFIX=24 GATEWAY=10.0.0.254 DNS1=10.0.0.254 DNS2=223.5.5.5
-
2.使用echo在屏幕上输出以下菜单
1)install nginx 2)install php 3)install mysql 4)quit\Q
-
3.显示eth0.txt的前3行
-
4.显示eth0.txt的后3行
-
5.如何实时查看/var/log/message的内容最新变化
-
6.使用命令过滤出包含eth0的行
-
7.使用命令排除包含#的行
-
8.忽略大小写查找包含eth的行
-
9.请描述>和>>的区别
-
10.请描述echo单引号,双引号,不加引号的区别
-
11.请描述cat > file1.txt << EOF和cat > file1.txt <<'EOF'的区别
-
12.请描述cat > file1.txt << EOF和cat >> file1.txt << EOF的区别
-
13.将/etc/hostname的内容读取并写入到/opt/hostname下
-
14.使用cat查看文件时有什么注意事项
vim编辑器快捷键锻炼
-
1.打开VIM并输入以下内容
powershell#eth0
TYPE=Ethernet
NAME=eTh0
DEVICE=[Eth0]
ONBOOT="yes"
IPADDR=$(hostname -I)
EOF
#eth1
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
DNS2=223.5.5.5
-
2.打印行号
-
3.定位到并删除EOF所在的行
-
4.定位到DNS2所在的行并将=后面内容替换为10.0.0.254
-
5.将PREFIX=24修改为PREFIX=16
-
6.将ONBOOT行复制到第一行
-
7.将DEVICE所在行剪切到倒数第二行
-
8.在GATEWAY所在行下面另起一行空行
-
9.在第一行上新插入一行内容:Linux1NB
-
10.在最后一行后新添加一行内容:magicianNB
-
11.搜索关键词eth
-
12.取消关键词高亮显示
-
13.将所有eth0(不区分大小写)修改为eth1
-
14.删除IPADDR所在行小括号里所有的内容
-
15.将IPADDR所在行修改为IPADDR=$("yes")
-
16.将所有#开头的行移动到末行
-
17.将ONBOOT="yes"修改为ONBOOT="ONBOOT"
-
18.将DEVICE=[Eth0]修改为DEVICE=[GATEWAY]
-
19.删除#开头的所有行
-
20.保存退出
重要目录及配置作业
-
1.请描述以下目录的作用
/boot
/home
/etc
/opt
/root
/var
/tmp
-
2.请写出以下配置文件的绝对路径
eth1网卡配置:/etc/sysconfig/network-scripts/ifcfg-eth1
DNS本地解析配置:/etc/hosts
主机名配置:/etc/hostname
磁盘开机挂载配置:/etc/fstab
开机自启动配置:/etc/rc.local
系统全局环境变量配置:/etc/profile
用户个人环境变量配置:~/.bashrc ~/.bash_profile
Linux内核参数配置:/etc/sysctl.conf
系统message日志文件:/var/log/message
-
3.请给以下网卡配置每一行加上中文注释
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.0.0.100
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
-
4.Linux如何知道一个命令去哪些目录下查找?
echo $PATH
-
5./etc/profile和~/.bashrc的区别是什么?
/etc/profile 对所有用户都生效
~/.bashrc 只对当前用户生效
-
6.请将/opt/redis/bin加入到系统全局变量下
echo "PATH=$PATH:/opt/redis/bin" >> /etc/profile
-
7./usr/bin和/usr/local/bin目录有什么区别?
/usr/bin 系统自带的基础命令
/usr/local/bin 用户自己安装的软件的命令
-
8.如何修改主机名?文件和命令是什么?
-
9.如何只对某个用户设置环境变量?
-
10./etc/fstab文件的作用是什么?
-
11.使用 echo 命令查看当前的 $PATH 环境变量,并解释其含义。
-
12.实现在Linux上请求www.ikun.com时访问的是192.168.3.31
-
举例:
ping www.ikun.com --> 192.168.3.31
-
echo "192.168.3.31 www.ikun.com" >> /etc/hosts
-
-
13.DHCP动态获取IP地址和静态IP的区别是什么?
-
14.如果你安装了某个软件,但是执行的时候系统提示找不到这个命令,可能的原因是什么、如何解决
原因:自己安装的命令不在PATH能识别的路径下
解决方法1:把命令移动到PATH能识别的目录下
解决方法2:在当前PATH基础上追加自定义的命令的目录路径
-
15.如何实现登陆重新连接的时候在屏幕上输出以下内容
1)清空屏幕
2)打印 "welcome come to myworld!"
3)输出当前PATH路径信息
- 注意:
- 开机自启动 --> rc.local
登录显示 --> ~/.bashrc
- 开机自启动 --> rc.local
- 注意:
-
16.给虚拟机新添加一个网卡,给出新添加的网卡的配置文件绝对路径
/etc/sysconfig/network-scripts/ifcfg-eth1
linux文件压缩与文件查找练习
-
创建测试环境:
- mkdir /opt/dir{1...4} -p
touch -d "2023-10-28 01:00" /opt/dir1/111.txt
touch -d "2023-10-29 01:00" /opt/dir1/112.txt
touch -d "2023-10-30 01:00" /opt/dir1/113.txt
touch -d "2023-11-01 01:00" /opt/dir1/114.txt
touch -d "2023-11-02 01:00" /opt/dir1/115.txt
touch -d "2023-11-03 01:00" /opt/dir1/116.txt
touch -d "2023-11-04 01:00" /opt/dir2/222.txt
touch -d "2023-11-05 01:00" /opt/dir2/333.txt
touch -d "2023-11-06 01:00" /opt/dir2/444.txt
touch -d "2023-11-07 01:00" /opt/dir2/555.txt
touch -d "2023-11-08 01:00" /opt/dir2/666.txt
touch -d "2023-11-09 01:00" /opt/dir2/777.txt
touch -d "2023-11-10 01:00" /opt/dir2/888.txt - dd if=/dev/zero of=/opt/dir1/111.data bs=1K count=100
dd if=/dev/zero of=/opt/dir2/222.data bs=1K count=300
dd if=/dev/zero of=/opt/dir2/555.data bs=1K count=500
dd if=/dev/zero of=/opt/dir3/333.data bs=1M count=10
dd if=/dev/zero of=/opt/dir4/444.data bs=1M count=100 - echo "DB_NAME=magician" >> /opt/dir4/444.conf
echo "DB_PASSWD=123456" >> /opt/dir4/444.conf
echo "www.baidu.com" >> /opt/dir2/222.html
echo "www.google.com" >> /opt/dir3/333.html
- mkdir /opt/dir{1...4} -p
-
文件压缩
- 1.打包/etc目录并保存成etc.tar.gz
- 2.打包/etc/passwd文件和/etc/hosts文件并保存成all.tar.gz
- 3.打包链接文件的真实文件
- 4.打包etc目录,但是排除掉/etc/hosts文件
- 5.打包etc目录,但是排除掉/etc/hosts,/etc/rc.local,/etc/services文件
- 6.查看etc.tar.gz压缩包的内容但不解压数据
- 7.将etc.tar.gz解压文件到/opt/目录
-
文件查找部分
- 1.找出/opt目录下所有以txt结尾的文件
- 2.找出/opt目录下所有以txt结尾的文件但是排除掉文件名包含222的文件
- 3.找出/opt/目录下所有的conf文件
- 4.找出/opt目录下大于500K的文件
- 5.找出/opt目录下大于10M的文件
- 6.找出/opt目录下大于200K但是小于50M的文件
- 7.找出/opt目录下前3天的文件
- 8.找出/opt目录下最近2天的文件
- 9.找出/opt/dir2目录下以jpg结尾的文件
- 10.找出/opt目录下所有的data文件并显示详细信息
- 11.找出/opt目录下大于1M的文件并删除
- 12.找出/opt目录下所有conf后缀的文件,找出文件内容包含DB_PASSWD的文件名
- 13.找出/opt目录下所有html后缀的文件,但文件内容不包含google的文件名
- 14.找出/opt目录下所有conf后缀的文件并打包压缩到/mnt/目录下conf_back.tar.gz
- 15.找出/etc目录下文件内容包含DNS1的文件
grep+正则表达式课后练习题
问题:现在有文本如下,意思解释如下
姓名:Steve Blenheim:电话:238-923-7366:住址:95 Latham Lane, Easton, PA 83755:生日:11/12/56:工资:20300
文本正文:
Betty Boop:245-836-8357:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Jennifer Cowan:548-834-2348:583 Laurel Ave., Kingsville, TX 83745:10/1/35:58900
Jon DeLoach:408-253-3122:123 Park St., San Jose, CA 04086:7/25/53:85100
Karen Evich:284-758-2857:23 Edgecliff Place, Lincoln, NB 92086:7/25/53:85100
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Karen Evich:284-758-2867:23 Edgecliff Place, Lincoln, NB 92743:11/3/35:58200
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Fred Fardbarkle:674-843-1385:20 Parak Lane, DeLuth, MN 23850:4/12/23:780900
Lori Gortz:327-832-5728:3465 Mirlo Street, Peabody, MA 34756:10/2/65:35200
Paco Gutierrez:835-365-1284:454 Easy Street, Decatur, IL 75732:2/28/53:123500
Ephram Hardy:293-259-5395:235 CarltonLane, Joliet, IL 73858:8/12/20:56700
James Ikeda:834-938-8376:23445 Aster Ave., Allentown, NJ 83745:12/1/38:45000
Barbara Kertz:385-573-8326:832 Ponce Drive, Gary, IN 83756:12/1/46:268500
Lesley Kirstin:408-456-1234:4 Harvard Square, Boston, MA 02133:4/22/62:52600
William Kopf:846-836-2837:6937 Ware Road, Milton, PA 93756:9/21/46:43500
Sir Lancelot:837-835-8257:474 Camelot Boulevard, Bath, WY 28356:5/13/69:24500
Jesse Neal:408-233-8971:45 Rose Terrace, San Francisco, CA 92303:2/3/36:25000
Zippy Pinhead:834-823-8319:2356 Bizarro Ave., Farmount, IL 84357:1/1/67:89500
Arthur Putie:923-835-8745:23 Wimp Lane, Kensington, DL 38758:8/31/69:126000
Popeye Sailor:156-454-3322:945 Bluto Street, Anywhere, USA 29358:3/19/35:22350
Jose Santiago:385-898-8357:38 Fife Way, Abilene, TX 39673:1/5/58:95600
Tommy Savage:408-724-0140:1222 Oxbow Court, Sunnyvale, CA 94087:5/19/66:34200
Yukio Takeshida:387-827-1095:13 Uno Lane, Ashville, NC 23556:7/1/29:57000
Vinh Tranh:438-910-7449:8235 Maple Street, Wilmington, VM 29085:9/23/63:68900
已将上面文本内容写入job.txt文件中
-
1.显示所有包含San的行
-
2.显示所有以J开始的人名所在的行
-
3.显示所有以700结尾的行
-
4.显示所有不包括834的行
-
5.显示所有生日在December的行
-
6.显示所有电话号码的第一组数字为408的行
-
7.显示所有这样的行:它包含一个大写字母,后跟四个小写字母,一个逗号,一个空格,和一个大写字母
-
8.显示工资为六位数的行,并在前面加行号
-
9.只显示电话号码
-
10.只显示工资并按照从大到小排序
awk日志分析
-
已知有一个很大的日志文件,其每行日志信息大约如下:
[ "2021-04-14 00:00:00", #访问时间 "47.103.144.36:59931", #IP:端口 "apiv2-rds.3yakj.com", #域名地址 "POST", #请求方法 GET POST 200, #响应状态码200 301 302 404 500 502 503 "\/?service=App.PublicClass.financeNotify", #请求参数 58, #数据包大小 null, #null "GuzzleHttp\/6.5.5 curl\/7.64.0 PHP\/7.2.34", #浏览器客户端 "HTTP\/1.1", #请求协议 23 #响应时间 ]
- 各字段含义已备注
-
题目如下:
-
第1题.在特定时间段,把访问最多的接口查找出来,按次数多少排序。
例:service=App.Liveshow.hotAward 其中一种接口,具体几种不知。
-
第一步:取时间范围
awk '/2021-04-14 00:00:00/,/2021-04-14 01:00:00/{print $0}' 2021-04-14.log >> log1.txt
-
第二步:取接口地址
awk -F'[?"]' '{print $11}' log1.txt |sort|uniq -c|sort -rn|head -10
awk -F'[?"]' '{LOG[$11]++}END{for(URL in LOG) print LOG[URL],URL}' log1.txt |sort -rn|head -10
-
-
第2题:统计某一时间段访问不重复的IP数量
awk -F'[:"]' '{print $6}' log1.txt|sort|uniq -c|sort -rn|head -10
awk -F'[:"]' '{LOG[$6]++}END{for(IP in LOG) print LOG[IP],IP}' log1.txt |sort -rn|head -10
-
第3题:统计所有接口的调用次数并显示出现次数最多的前二十的URL
-
第4题.统计报错的接口
-
第一步:取出非200的日志
awk -F',' '$5!=200{print $0}' 2021-04-14.log > log2.txt
-
第二步:
awk -F'[?",]+' '{print $11}' log2.txt|sort|uniq -c|sort -rn|head -10
-
变换:
awk -F'[?",]+' '{print $6,$8}' log2.txt|sort|uniq -c|sort -rn|head -10
-
-
第5题.统计HTTP响应状态码
awk -F',' '{print $5}' 2021-04-14.log|sort|uniq -c|sort -rn|head -10
-
第6题:统计服务器并发量
awk '/2021-04-14 00:00:00/,/2021-04-14 00:00:01/{print $0}' 2021-04-14.log|wc -l
-
第7题:比如 xxx.xxx.xxx.xxx 访问了 service=App.User.Userinfo 多少次 其他IP 访问这个接口多少次 做时间段 排序
awk -F'[:"?]+' '{print $6,$14}' 2021-04-14.log |sort|uniq -c|sort -rn|head -10
-
-
以上题目仅供参考,答案可能错误。