Linux基础笔记分享(超详细~)

文章目录

  • Linux基础
    • 1.基础概念
    • 2.基础命令
      • 命令行快捷键
        • 自动补全: tab
        • 移动光标
        • 快速删除
        • 翻看历史命令
        • 终止程序
        • 退出登录
        • 清屏
      • 查看命令帮助
      • alias命令别名-快捷键
      • pwd-类似于地图
      • cd-类似于传送术
      • mkdir-类似于合成装备
      • touch-创建文件
      • ls-类似于查看装备
      • tree-打印目录层级结构
      • cp-复制命令
      • mv-移动命令
      • rm-删除命令
    • 3.文本处理相关命令
      • head-查看文本头N行
      • tail-查看文本后N行
      • echo-回显命令
      • 重定向符号 > >>
      • cat-查看文件
      • grep-过滤文本内容
      • wc-查看文件行数
      • VIM-文本编辑器
        • VIM-普通模式
          • 移动快捷键
          • 复制行快捷键
          • 剪切行快捷键
          • 替换光标所在的字符
          • 删除快捷键
          • 选中块模式
          • 进入编辑模式
          • 撤销
          • 快进
          • 退出编辑模式
          • 快速加减
        • vim-命令行模式
    • 4.Linux重要目录及配置
      • 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重要配置文件汇总
      • 4.2usr目录下重要文件及目录
        • 编译安装软件默认的目录/usr/local/bin
        • 存放系统的基础命令 /usr/bin
        • 存放系统的特权命令 /usr/sbin
      • 4.3/var/log目录
      • 4.4/proc下的重要路径知识
      • 4.5系统环境变量配置文件
    • 5.Linux文件属性及软链接
      • Linux文件类型
      • Linux软链接
      • Linux文件存储inode和block(了解)
      • Linux打包压缩
        • Linux和Windows常见压缩包格式
        • Linux下常见打包压缩命令
      • find文件查找
    • 6.Linux用户管理
      • Linux管理用户命令
        • useradd添加用户命令
        • userdel删除用户命令
        • usermod和groupmod修改用户命令
      • Linux管理用户组命令
      • passwd修改用户密码
      • 查看用户信息
      • su和su - 的区别
      • sudo 普通用户权限提升
        • sudo配置使用
        • sudo多用户多角色多权限命令配置
    • 7.Linux权限管理
      • Linux权限命令
        • chmod修改文件或目录权限
        • chown更改文件或目录的所属用户及用户组
      • Linux文件及目录权限详解
        • 文件和目录的权限区别
        • 特殊权限
        • 特殊属性
        • 查看文件属性命令
        • 默认权限掩码umask
    • 8.正则表达式与三剑客grep,sed,awk
      • 什么是通配符
      • shell命令行特殊符号
      • 正则表达式
      • 三剑客命令之grep过滤文本内容
        • grep配合正则表达式大量练习题
        • 工作需求实战
      • 三剑客命令之sed操作
        • sed查找练习
        • sed增加练习
        • sed删除练习
        • sed替换练习
          • 行替换
          • 列替换
        • 实战练习题
        • sed总结
      • 三剑客命令之awk操作
        • awk输出列
        • -F 或 FS改变默认输入切割分隔符:
        • OFS 自定义默认输出分隔符
        • 比较匹配
        • awk配合正则匹配
        • 范围匹配
        • 扩展-数组
    • 9.定时任务
        • 定时任务时间表达练习
        • 定时任务配置管理
        • 定时任务实战练习
        • 定时任务调试
    • 10.磁盘管理与lvm逻辑卷管理
      • 磁盘管理
        • Linux下查看磁盘分区情况-fdisk
        • Linux磁盘格式化分区-mkfs
        • Linux磁盘挂载 mount/umount
        • 开机自动挂载
        • 磁盘查看相关的命令
        • dd命令生成文件
        • 添加硬盘步骤总结
      • lvm逻辑卷管理
        • 添加磁盘
        • 安装LVM软件
        • 创建PV
        • 创建VG
        • 创建LV
        • 格式化LV
        • 创建目录并挂载
        • LVM扩容实验
        • LVM资源回收实验
    • 11.软件包管理与服务管理
      • 软件包管理
        • rpm包管理命令
        • yum在线安装
        • 配置base源
        • 配置epel源:
        • 配置nginx官方源(第三方源):
        • 二进制软件包安装
        • 源码编译安装
      • 服务管理
        • 编写nginx的systemd启动配置
        • 编写redis的systemd启动配置
        • systemd文件格式说明
        • 总结配置步骤
    • 12.进程管理
        • ps查看系统进程状态
        • pstree 以树状图查看进程状态
        • pidof 查看指定名称进程
        • top查看当前的进程状态
        • lsof 查看进程打开文件
        • kill家族进程管理命令
        • 进程后台管理
        • 系统平均负载
    • 13.命令汇总
    • 练习题(提高记忆)
        • 普通文本命令相关
        • vim编辑器快捷键锻炼
        • 重要目录及配置作业
        • linux文件压缩与文件查找练习
        • grep+正则表达式课后练习题
        • awk日志分析

Linux基础

1.基础概念

  • 为什么要学Linux?

    • 开源 稳定 生态丰富
    • 免费!!!!!!
  • 常见发行版

    • CeontOS
    • Ubuntu
    • Debian
    • RedHat
    • Suse
    • 麒麟 V10
    • 统信
  • Linux系统 = Linux内核+GNU系统软件

  • 命令提示符的含义

    [root@centos7-magician ~]#
    
      [当前的用户身份@主机名 当前所在目录]用户身份
    
  • 命令行注意事项

    • 使用方法:
      • 命令 选项 执行的目标
    • 注意:
      • 命令和选项和执行目标之间都有空格
  • Linux目录和Windows目录的区别

    • Linux下一切以根目录/开始,所有目录在/目录下面
  • 什么是绝对路径

    • 绝对路径:
      绝对路径就是以/为起点,完整的目录路径。

    • 注意:
      只有第一个/表示根目录,剩下的/都仅仅表示目录的层级关系

    • 举例:

    /opt/data1/data2
    

    /目录下有个opt目录,opt目录下又有个data1目录,data1目录下有个data2目录

  • 什么是相对路径

    • 相对路径:
      就是以当前所在目录为起点,表示相对于其他目录的路径。

    • 注意:
      相对路径不用从/开始写,只需要从当前目录下开始写就行

    • 举例:
      当前在/opt/data1/下,进入data2(在当前目录下)下的data3只需要执行

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 取消已经设置过的别名

    [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

[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 递归创建目录

    • 如果目录已存在,不提示错误信息,也不会做任何操作
    • 如果目录不存在,自动创建
  • 举例

mkdir -p data1/data2/data3/data4/data5/data6 
mkdir data1/data2/data3/data4/data5/data6 -p
  • 注意
    • 如果要创建的目录已经存在并且mkdir没有接-p,则会提示文件已存在
    [root@centos7-100 ~]# mkdir magician
    mkdir: cannot create directory ‘magician’: File exists
    
    • 如果创建多层目录并且mkdir没有接-p,则需要每一层目录都存在
    [root@centos7-100 network-scripts]# mkdir data1/data2/data3
    mkdir: cannot create directory ‘data1/data2’: No such file or directory
    

touch-创建文件

  • 命令作用

    • 用来创建空文件
    • 用来修改文件或目录的最后修改时间
  • 命令格式
    touch [选项] 文件

  • 关键选项
    -d 修改文件最后修改时间

  • 举例

    touch magician.txt
    touch -d "00:00" magician.txt
    
  • 注意

    • -d 后面的时间单引号,双引号,不加引号都是可以的
    • 如果对一个已经存在的文件执行touch,但是不接-d选项,效果是修改这个文件最后修改的时间

ls-类似于查看装备

  • 命令作用
    显示文件或目录的信息

  • 命令格式
    ls [-选项] 目标文件或目录

  • 常用选项
    -l 显示详细信息
    -h 把文件大小转换成人类可读的格式
    -d 只显示目录本身的详细信息,而不是目录下面的文件信息
    -t 按照文件最后修改时间进行排序,最新的在最前面
    -r 按照倒叙排序
    -a 把所有文件都显示出来,包含隐藏文件

  • 详细信息解释

    drwxr-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
      • 文件或目录名
  • 常见选项组合
    -lh
    -la
    -lrth

  • 举例

    [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 显示层级关系的同时显示文件大小
  • 示例

    magician@magician-virtual-machine:~$ tree -L 1   #只显示一层
    .
    ├── Desktop
    ├── Documents
    ├── Downloads
    ├── Music
    ├── Pictures
    ├── Public
    ├── Templates
    ├── test.sh
    ├── Videos
    ├── VMwareTools-10.3.21-14772444.tar.gz
    └── 太酷啦.txt8 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]  太酷啦.txt8 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 可以直接移动目录

  • 思考
    目录和文件不能在同一个层级下同名

   [root@localhost ~]# mv data2 /optmv:是否覆盖"/opt/data2"? ymv: 无法以非目录来覆盖目录"/opt/data2"

rm-删除命令

  • 命令作用
    删除文件或目录

  • 常用选项
    -r 递归删除
    -f 强制删除

  • 保命技能

    • -rf少用
    • 可以用mv代替rm,移动文件到垃圾桶/tmp
    • 当你想使用rm -rf的时候,先问自己几个问题:
      • 1.我为什么要删这个文件
      • 2.删了之后会有什么影响?
      • 3.删了之后是否可以恢复?
  • 执行之前,先冷静3秒

  • 思考

    [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
    
  • 练习

    [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└── file14 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:在屏幕上输出内容并支持特殊符号

      [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:转义

      [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:打印菜单

      [root@centos7-100 ~]# echo -e "please input num:\n1.install\n2.uninstall"
      please input num:
      1.install
      2.uninstall
      
    • 例子4:单双引号的区别

      #设置一个变量
      [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”

      • 输出效果:

      [root@centos7-100 ~]#echo "'$magician'" '"$magician"'
      'linux1' "$magician"
      
    • 例子6:单双加转义

      • 转义双引号"
      [root@centos7-100 ~]# echo "'$magician\"" '$magician'
      'linux1" $magician
      
      • 转义\

        [root@centos7-100 ~]# echo "'$magician\""\\ '$magician'
        'linux1"\ $magician
        
      • 例子6:生成序列

        echo {1..10}
        echo {a..z}
        seq 1 10
        

重定向符号 > >>

  • 命令解释

    • >输入重定向,效果会覆盖

    • >>追加输入重定向,效果会在最后另起一行追加

  • 注意:没有输入的情况

    • > 文件名
      如果文件不存在,则会创建空文件。
      如果文件存在,则会清空

    • >> 文件名
      如果文件不存在,则会创建空文件。
      如果文件存在,什么都不会改变

  • 举例

    • 例子1:写入内容到文件里

      • echo 123 > file1.txt

        • 例子2:追加$abc内容文件里
    • echo '$abc' >> file1.txt

    • 例子3:清空文件

      • > file1.txt

cat-查看文件

  • 命令作用

    • 查看文件内容
    • 写入多行内容到文件里
  • 常用选项
    -n 显示行号
    -A 显示文件编码符号,windows和Unix是不一样的
    EOF 写入多行文本

  • 重点掌握!cat写入多行文本

    • 注意:
      EOF可以自定义,只要起始和终止一样就行

    • 技巧:先在notepad++上写好,再复制到xshell里

    • 格式:

      • cat > 文件名 << 起始符
        文本
        文本
        文本
        ....
        终止符
        
    • 举例1:将多行文本写入文件

      • cat > file1.txt << EOF
        111
        222
        333
        EOF
        
    • 举例2:EOF单引号 --> 不解析变量
      magician=“linux1”

      • 会先解析$magician,在写入文件

      • cat > file1.txt << EOF	
        1
        2
        3
        $magician
        EOF
        
      • 不会先解析$magician,所见即所得

      • cat > file2.txt << 'EOF' 
        1
        2
        3
        $magician
        EOF
        
    • 举例3:追加多行文本写入

      • cat > file1.txt << EOF	
        1
        2
        3
        EOFcat >> file1.txt << EOF	
        a
        b
        c
        EOF
        
    • 举例4:优化网卡配置文件

      • cp /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:查看文件

    • cat /etc/passwd
      
    • 例子2:查看文件并显示行号
      cat -n /etc/passwd

    • 例子3:不同系统编码不一样

      • [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 检查

        • 第二种解决方法:

        • yum 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行

    • #测试数据
      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

  • 拓展-目前了解即可

    • 正则表达式符号
      ^	以什么开头
      $	以什么结尾
      .	表示任意1个字符
      *	前面的字符任意数量
      .*  任意多个字符
      
  • 练习:

    • 样本:

    • cat > file1.txt << EOF
      abcABC123
      #abc123ABC
      abc123ABCABCabc123
      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 文件名

    • [root@localhost ~]# wc -l .bashrc
      12 .bashrc
      [root@localhost ~]# wc .bashrc12  30 176 .bashrc

VIM-文本编辑器

  • VIM介绍
    编辑器之神,上古神器

    • vim是vi的增强版
    • yum install vim -y
  • 如何让一个计算机新手打出一串随机数
    答:打开VIM,然后让他退出

  • VIM工作模式

    • 普通模式-快捷键模式

      • VIM绝大部分的快捷键都在普通模式下生效
      • 在普通模式下,字母和字符都是快捷键
    • 编辑模式

      • 字符和字母才是原来的意思
    • 命令行模式

      • 输入一些指令,比如保存和退出,搜索关键词,设置行号等
VIM-普通模式
  • 首先备份一份网卡文件

    • cd /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不要直接打开大文件,否则内存会爆掉

总结最常用的:

echo 1 > file1.txtcat > file1.txt << EOF
123
456
789
EOFgrep "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重要目录及配置

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

  • 配置文件

    • [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
[root@centos7-magician ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 10.0.0.254
  • 此文件内容受网卡配置文件所影响,会随着网卡配置文件改变而改变
主机名配置/etc/hostname
[root@centos7-magician ~]# cat /etc/hostname 
centos7-magician
  • 修改主机名使用命令
    hostnamectl set-hostname centos-magician
    • 此命令会同步修改/etc/hostname文件的内容
本地DNS解析文件/etc/hosts
  • 自己电脑上的DNS缓存

  • [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
  • 目录作用

    • 新增加的磁盘开机自动挂载配置

    • [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(了解)
  • [root@centos-magician ~]# cat /etc/redhat-release 
    CentOS Linux release 7.6.1810 (Core)
    
开机自启动目录 /etc/rc.d/rc.local(比较老的方法了,默认情况下未激活,需赋予执行权限,可用下方4.5 系统环境变量配置 文件替代)
  • 作用:设置开机自启动脚本或软件

  • 编写脚本

    • cat > /opt/time.sh << EOF
      #!/bin/bash
      echo "start time --->" $(date) >> /opt/time.log
      EOF
      chmod +x /opt/time.sh
      
  • 配置开机自启动

    • echo "/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

    • [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\]]\\$ "加到环境配置文件中即可生效
  • 总结

    • 全局环境变量对所有用户都生效
    • 这些环境变量读取是有优先级顺序
      • /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:文件创建软连接

    • [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:软链接文件读写测试

    • [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:相对路径实验

    • [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(了解)

  • 文件属性-不要背,了解即可

    • [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 drwxr-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,但是如果想保留目录原来的结构不需要h
    8)指定要解压到哪个目录使用-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执行动作

      • find . -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执行动作

      • find . -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
  • |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"
  • 总结:

    • tar 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用户管理

  • !!!重要提示: 99%的场景只需要以下几条命令!!!

    • 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角色定义
    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里还会有记录

    • 报错:

      • [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就是专门给不允许登陆的用户配置的

    • 报错:

      • [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
    命令:

    • [root@centos7-magician ~]# groupadd xiaoren -g 3306
      [root@centos7-magician ~]# tail -1 /etc/group
      xiaoren:x:3306:
      
    • [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位

    • 不能包含系统保留关键词

    • 不能太简单

    • 不能和老密码一样,不能和老密码相似

  • 示例

    • [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命令来临时提升权限
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>
          
      • 第四步:测试特权命令执行

        • [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

7.Linux权限管理

  • 重点!!!
    99%的情况默认即可

    • 默认文件是 644 rw-r--r--
    • 默认目录是 755 rwxr-xr-x
  • 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 其他用户 可列出目录下文件名 可进入目录 显示正常
  • 总结:
    目录能正常工作的最低权限是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来设置
    • 注意:
      • 在设置suidsgid权限时,文件的拥有者,文件所在的组必须先设置相应的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值

    [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

    • 单双引号
      '' 所见即所得,不解析特殊符号和变量
      "" 可以解析特殊符号和变量

正则表达式

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

  • 提取完整的链接地址
    http://www.xxx.com/xx/xx/
    https://www.xxx.com/xx/xx/

    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.
      testtttsss000123566666asbclkkkalllli 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 第一列
  • 不纯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
    • 第八步:如果不想重启,可以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概念PVVGLV–必须掌握
    LVM创建流程–必须掌握

  • 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~]# pvsPV         VG     Fmt  Attr PSize   PFree/dev/sda2  centos lvm2 a--  <19.00g    0 
      
  • 创建pv

    • [root@centos7-magician ~]# pvcreate /dev/sdb /dev/sdcPhysical 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 ~]# vgsVG     #PV #LV #SN Attr   VSize   VFreecentos   1   2   0 wz--n- <19.00g    0 
      
  • 创建vg

    • [root@centos7-magician ~]# vgcreate -s 16M magician-vg /dev/sdb /dev/sdcVolume 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-vgLogical volume "magician-lv01" created.
      
  • 再次查看lv信息

    • [root@centos7-magician ~]# lvs|grep -v "centos"LV         VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertmagician-lv01 magician-vg -wi-a-----  15.98g   
      
  • 创建lv使用剩余所有的vg空间

    • [root@centos7-magician ~]# lvcreate -l 100%FREE -n magician-lv02 magician-vgLogical volume "magician-lv02" created.
      
  • 再次查看lv信息

    • [root@centos7-magician ~]# lvs|grep -v "centos"LV         VG       Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convertmagician-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   VFreemagician-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/sddPhysical volume "/dev/sdd" successfully created.
      
  • 4.扩容vg

    • [root@centos7-magician ~]# vgextend magician-vg /dev/sddVolume 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 Convertmagician-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-lv02Size 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 Convertmagician-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   VFreemagician-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 Convertmagician-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   VFreemagician-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]: yLogical 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 Convertmagician-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
  • 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 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.logstorage:dbPath: /opt/mongodb/data/directoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 0.5directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: trueprocessManagement:fork: truepidFilePath: /opt/mongodb/pid/mongod.pidnet:port: 27017bindIp: 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
  • 负载三组数字解释
    三组数字代表了不同时间段系统的负载情况
    数字越高,表示系统负载压力越大

    • 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里,不解析变量

    • #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并输入以下内容

    #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
  • 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
  • 文件压缩

    • 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

  • 以上题目仅供参考,答案可能错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392629.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 习题(一)

1、在HarmonyOS系统架构中&#xff0c;以下哪项属于应用层? A&#xff09;AI子系统 B&#xff09;U框架 C&#xff09;电话 D&#xff09;内核 答案&#xff1a;C 解析&#xff1a; 2、在HarmonyOS系统架构中&#xff0c;以下哪项提供统一的外设访问能力和驱动的开发管理框架…

sqli-labs靶场练习(1、5-8关)

自己搭建环境啊喂...http://127.0.0.1/sqli-labs-php7-master/ 第一关 1.单引号判断是否存在注入点 /?id1 2.查询列数 ?id1 order by 3-- ?id1 order by 4-- 由此可判断有3列 3.查询用户名和密码分别在哪列 ?id-1 union select 1,2,3 -- 4.查询数据库名称为security ?…

81.SAP ME - SAP SMGW Getway Monitor

目录 1.起因 2.SMGW Displaying Logged On Clients Displaying Remote Gateways Display and Control Existing Connections Deleting a Connection Displaying Gateway Release Information Displaying Parameters and Attributes of the Gateway Change Gateway Pa…

js中的ajax【Axios,XMLHttpRequest,Promise,async】回调函数地狱等问题

目录 前置知识 1.什么是异步请求&#xff1f; 2.什么是回调函数 3.如何查看网页的异步请求&#xff08;XHR&#xff09;&#xff1f; 4.什么是ajax jquery的ajax&#xff0c;xhr&#xff0c;axios关系 正文---几种请求之间的关系 axios Axios的诞生 Axios的介绍 定义…

Idea绿色下载安装教程-最新,2024版本通用-附下载链接

插件链接&#xff1a; 脚本 Idea下载安装完成后 进入激活码输入页面&#xff0c;然后关闭IDEA 按照下面流程进行激活 1. 按照以下步骤&#xff0c;亲测可用&#xff0c;记得一定要先关闭idea 2. 选择对应软件 3.选择bin、目录对应选项 5.激活 6.成功

ROS2 Humble 学习【openEuler】

ROS2 Humble 学习 1 介绍1.1 概述1.2 ROS2 详细介绍1.3 openEuler 安装 ROS2 Humble1.4 ROS2 系统架构 2 ROS2 基础2.1 节点编写、编译、运行【简单示例】节点编写节点编译 g节点运行节点编译 make节点编译 CMakeLists.txtCMake依赖查找流程Python 依赖查找流程 2.2 节点交互、…

LeetCode | 441 | 排列硬币 | 二分查找

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 今天分享的是LeetCode中一道标签为简单的算法题&#xff0c;本质是一道数学题 文章目录 1.题目描述2.题解2.1 公式解法2.2 暴力解法2.3 二分查找 LeetCode链接&#…

【51单片机仿真】基于51单片机设计的钟表定时闹钟系统仿真源码设计文档演示视频——完整资料下载

演示视频 设计内容 &#xff08;1&#xff09;使用 DS1302 结合字符型 LCD12864 显示器设计一个简易的定时闹钟 LCD 时钟。程序执行后 LCD 显示“00&#xff1a;00&#xff1a;00” &#xff08;2&#xff09;K1—设置现在的时间&#xff0c;年闪烁&#xff0c;再按 K1 键月闪…

15.75.【C语言】表达式求值

目录 一.整型提升 1.定义 2. 一.整型提升 1.定义 C语言中整型算术运算总是至少以缺省&#xff08;默认&#xff09;整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升 2.整型提…

njs、nginx JavaScript、在nginx上写JavaScript、nginx支持js

njs、nginx JavaScript、在nginx上写JavaScript、nginx支持js 现在是 2024-08-05 &#xff0c;在一个月前&#xff0c;我逛nginx官网&#xff0c;还没有这个模块的介绍。看njs官网&#xff0c;在四年前已经创建这个项目。不知道是不是近期才把这个项目纳入。以前不知道这模块&…

C# 构建观测者模式(或者为订阅者模型)

前言&#xff1a; 观测者模型的基本理念&#xff0c;就是&#xff0c;我有一个公共的事件&#xff0c;定义好他的事件的触发、数据接口。然后&#xff0c;通过增加订阅者&#xff08;实例&#xff09;来订阅这个事件的&#xff0c;或者说观察这个事件。如果事件发生&#xff0…

未授权访问漏洞系列详解⑥!

JBoss未授权访问漏洞 JBoss是一个基于J2EE的开放源代码应用服务器&#xff0c;代码遵循LGPL许可&#xff0c;可以在任何商业应用中免费使用;JBoss也是一个管理EJB的容器和服务器&#xff0c;支持EJB1.1、EJB 2.0和EJB3规范。,默认情况下访问 http://ip:8080/jmx-console 就可以…

【Java数据结构】---初始数据结构

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 从今天开始我们就要学习Java…

Altium designer学习笔记03 -原理图绘制

原理图绘制 1. 原理图页大小设置2.原理图格点的设置3. 原理图模板的应用4. 元件的放置5.元件属性的编辑6.元件的选择、移动、旋转、镜像6.1 元件的选择6.2 元件的移动6.3 元件的旋转6.3 元件的镜像 7.元件的复制/剪切/粘贴8.元件的排列与对齐9.绘制导线的导线属性设置10.放置网…

实时数仓分层架构详解

首先&#xff0c;我们从数据仓库说起。 数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员提出了商业数据仓库的概念。数据仓库概念的提出&#xff0c;是为了解决和数据流相关的各种问题&#xff0c;特别是多重数据复制带来的高成本问题。 数据仓库之父Bill …

简单反射型XSS的复现

xss反射型攻击&#xff1a; 1.最简单的漏洞复现&#xff1a; 这里我们有一个最简单的网页&#xff1a;由于地址不存在&#xff0c;所以图片加载不出来。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta…

skynet 连接redis

文章目录 概述main.luaagent.luaredis.lua 小结 概述 之前写过skynet 入门篇&#xff0c;还有skynet实操篇&#xff1b;这2篇&#xff0c;主要写了skynet如何使用&#xff0c;还有些skynet的调用流程之类。 其实&#xff0c;看过skynet的demo之后&#xff0c;发现skynet中没有…

Simulink模型开发中的一些自动化方法

随着Simulink模型的产品化开发进程&#xff0c;许多模型开发人员会关心模型的建模自动化问题。比如如何对模型中的元素进行批量查找和修改&#xff1b;如何构建自己的建模规则对模型进行检查&#xff1b;如何实现测试自动化等。在这些使用场景中我们都需要了解一些Simulink函数…

谈谈冯诺依曼体系

我们都知道冯诺依曼体系这张图最为代表性&#xff0c;而接下来我们就来浅谈一下各部分之间的作用~ 输入设备&#xff1a;键盘&#xff0c;磁盘&#xff0c;网卡&#xff0c;话筒等等 输出设备&#xff1a;磁盘&#xff0c;网卡&#xff0c;声卡&#xff0c;显示屏等等 这些硬件…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…