美文网首页
shell编程- 四剑客

shell编程- 四剑客

作者: linux_龍 | 来源:发表于2019-10-03 15:01 被阅读0次

    1.四剑客

    四剑客 功能 擅长
    find 查找文件
    grep 过滤 进行过滤 测试正则(加上颜色) 过滤速度最快
    sed 过滤 替换 修改文件内容 取行
    awk 过滤 取列 取行 统计分析 awk数组

    2.正则表达式

    • 基础正则
    • 扩展 正则
    • perl正则
    基础 含义
    ^ 以..开头
    $ 以..结尾
    ^$ 排除空行
    . 任意一个字符
    * 出现0次或0次以上
    .* 任意一个字符出现 0次或0次以上
    [] 匹配中括号里面的内容
    [^] 排除中括号里的内容
    + 出现一次或多次
    |
    () 括号里的内容相当于是一个整体
    前一个字符出现0次或1次

    注意事项:

    • 一行一行过滤
    • 注意字符集:export LANG=C 或UTF-8
    • [^$] 大部分正则符号在[]中 原有的特殊含义
    perl正则 : 领宽断言 匹配位置
    匹配左边 前面 lookahead (?=xxx)
    匹配右边 后面 lookbehind (?<=xxx)

    3.四剑客之find

    • find 查找文件
      find相关面试题类型
    1. 请使用shell脚本,找出/oldboy以.txt结尾的 修改时间小于7天大 小大于100k 2. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 把这些文件删除 3. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 复制/移动 到/tmp目录 4. 请使用shell脚本,找出/oldboy以.log结尾的 修改时间小于7天大 小大于100k 打包压缩存放在/backup

    find参数

    参数 含义
    - maxdepth 最大深度 最多查找几层目录
    - type 类型 f普通文件 d目录
    - name 执行名字 支持通配符 * {} -name '*.log'
    - iname 查找的时候不区分大小写
    - size +10k -10G -10M
    -mtime 修改时间 +7 7天之前
    -mmin 修改时间 +7 7分钟之前的内容 搭建网站 查找出那个是上传目录 find /www -type f -mmin -5
    -exec find找出的文件 交给exec处理
    -o 或者
    -a 并且find命令默认就是-a
    取反
    -pront find找出每个文件的时候 结尾加上空(null)符号 与、 xargs -o
    -inum 指定文件的inode号码 一般删除 包含特殊符号、乱码的文件

    解密与xargs区别

    解密 与xargs区别 传递
    cmd1|cmd2 一般命令与|配合使用 传递字符
    xargs find与|xargs一起使用 传递的是文件名(参数)

    find核心功能

    • 参数
    • find查找文件
    • 面试题find与命令配合rm/sed/ls-l
    • find与移动或复制
    • find与打包压缩 tar/zip gzip (一般与mysqldump)

    4.四剑客-grep

    • 过滤
    参数 功能
    -A 把grep找出的内容及接下来的几行显示出来
    -B 把grep找出的内容及前几行显示出来
    -C 把grep找出的内容及上下各几行显示出来
    -E 让grep支持扩展正则
    -i 忽略大小写
    -v 取反 排除
    -n 显示行号
    -o 显示过程 显示每次grep没一次匹配到的过程
    -R 递归过滤 一般与-l一起使用
    -l 只显示文件名 不显示文件内容
    -c 只显示行数
    -w 精确匹配 按照单词进行过滤
    -p 匹配位置 领宽断言

    5.四剑客 -sed

    • sed stream editor 流编辑器 认为我们文件 像水流 源源不断通过sed处理
    • 应用
      -- 增删改查
      -- 把文件中的回车替换为空格
      sed参数
    参数 功能
    -n 取消默认输出
    -r 支持扩展正则
    -i --inplace 修改文件内容
    -i.bak 先把oldboy.txt文件改名为 oldboy.txt.bak 然后修改bak内容 生成oldboy.txt

    sed 执行过程

    • 读取文件内容
    • 进行判断(是否满足条件)
      -- 满足 执行对应的命令 增删改查
      -- 不满足 ---判断是否有-n参数


      image.png

    sed增删改查 查找(条件)

    格式 作用
    -n '1p' 显示第一行
    -n '1p,5p' 显示第一行到第五行
    -n '/oldboy/p' 显示包含oldboy的行
    -n '/101/,/105/' 显示从包含101的行开始到包含105的结束
    -n '$p' 显示最后一行
    -n '1~2p' 从第一行开始 每次增加2 第一行 第三行 第五行

    sed增删改查之增加

    命令 作用
    i 在指定行前面插入行
    a 在指定行后面追加
    c 把指定行整体替换为 要求的内容

    sed增删改查之删除

    • d(delete)

    • 删除文件中的空行 或只有空格的行

    • egrep -nv '^ *$' 加文件名称

    • sed '/^ *$/d' 加上文件名称

    • awk '!/^ *$/' 加上文件名称

    • sed -n '/^ *$/!p' 加上文件名称

    sed增删改查之替换

    • 基本格式
    • 后向引用
      's#找谁#替换为什么#g' substitute
      's@@@g' global 全局替换 不加上默认替换每一行第一行内容

    sed命令模式空间与保持空间(扩展)

    名词 含义 特点
    模式空间 sed默认把数据读取到这里 sed命令(增删改查)默认处理这里的数据 1.sed处理完1行后 内容会被删除、清空 2.命令或显示(p) 都是显示模式空间
    保持空间 默认是空的 ,只有特定的命令才能操作(h;H;g;G;x) 1.这里面的数据会持续保留 知道sed处理完文件

    模式空间与保持空间的命令

    • H 把模式空间的内容 追加到 保持空间中 (会自动加上一个回车符号)
    • x 交换模式空间与保持空间内容

    操作模式空间

    • N 把下一行追加到模式空间中

    1.把文件中的所有回车替换为空格

    方法一:
    [root@m01 /oldboy]# seq 5 | sed -n 'H;$x;s#\n# #gp'
     1 2 3 4 5
    
    方法二:
    [root@m01 /oldboy]# seq 5 | sed -n 'N;N;N;N;s#\n# #gp'
    1 2 3 4 5
    
    image.png

    sed 命令格式 执行流程

    image.png

    5四剑客-awk

    • awk
    • 过滤
    • 分析 统计

    awk参数
    -F 字段分隔符 列
    -v 创建或修改awk可以使用变量 shell脚本变量 传递给 awk 使用

    awk运算
    [root@m01 /oldboy]# awk 'BEGIN{print 1/3}'
    0.333333
    

    awk执行过程

    image.png
    awk取行
    [root@m01 /oldboy]# awk 'NR==3' /etc/passwd
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    awk符号 shell中[]
    == -eq 等于
    != -ne 不等于
    > -gt 大于
    >= -ge 大于等于
    < -lt 小于
    <= -le 小于等于

    1.取出/etc/passwd 第二行到第五行

    多个条件

    取第二行到第五行
    [root@m01 /oldboy]# awk 'NR>=2 && NR<=5{print $0}' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    

    2.取出 ifconfig 命令结果中 >=1 && <=255 数字

    ifconfig |awk -vRS='[^0-9]+'  '{print }' |awk '$0>=1 && $0<=255' 
    

    3.对齐每一列内容

    [root@m01 /oldboy]# awk -vFS=: '{print $1,$3,$NF}' /etc/passwd |column -t
    root             0     /bin/bash
    bin              1     /sbin/nologin
    daemon           2     /sbin/nologin
    adm              3     /sbin/nologin
    lp               4     /sbin/nologin
    sync             5     /bin/sync
    shutdown         6     /sbin/shutdown
    halt             7     /sbin/halt
    mail             8     /sbin/nologin
    operator         11    /sbin/nologin
    games            12    /sbin/nologin
    ftp              14    /sbin/nologin
    

    awk内置变量

    变量 含义
    FS 字段分隔符 列
    $数字 取某一列
    $0 一行的内容 整行
    NF 每一行中有多少列
    $NF 最后一列
    $(NF-2) 倒数第三列
    • OFS 输出字段分隔符 awk显示每一列的时候 每一列之间的分隔符号 默认是空格

    • NR 记录号 行号

    • RS 记录分隔符 awk每一行的结束标记 默认是回车

    • ORS 输出记录分隔符 awk显示每一行的时候 诶一行的结束标记(默认是回车)

    awk过滤(条件)

    • 比较表达式 > < == >= <=
      使用正则
    • 范围
      -特殊 BEGIN{} END{}
      awk比较表达式

    1.过滤出 /etc/passwd中 第3列 大于等于1 小于等于1000的行

    [root@m01 ~]# awk -F: '$3>=1 && $3<=1000' /etc/passwd |head
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin 
    

    2.取出磁盘使用率低于50%的分区

    第一种方法:
    [root@m01 ~]# df -h |awk -F'[ %]+' '$5>=0 && $5<=50{print $5}' 
    10
    0
    0
    3
    0
    0
    

    awk使用正则
    ^ 以XXX开头的行 某一列的开头
    $ 以XXX结尾的行 某一列的结尾

    • awk使用正则符号~
      -- 匹配包含 $3~/[1-3]/
      -- awk !~ 不匹配

    3.过滤出 /etc/passwd中第3列是以数字1-3开头的

    [root@m01 ~]# awk -F: '$3~/^[1-3]/' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    

    **awk中的特殊条件BEGIN{} 和ENG{}

    • BEGIN{} BEGIN{}里面的内容会在awk读取文件之前执行
      -- 1.修改或创建awk内置变量 (可用-v实现)
      -- 2.进行计算
      -- 3.进行测试
      -- 4.显示表头
    • END{} END{}里面的内容会在awk读取文件之后执行
      -- awk执行的进行计算 最后在END{}显示最终结果
      计算 1+ ++20总和
    [root@m01 /server/files]# seq 20 |awk '{i=i+$1}END{print i}'
    210
    
    • i=i+1 i++ 统计次数 一共有多少次
    • i=i+$n(n是数字) i+$n 累加(求和)总数

    awk表示范围

    • awk 'NR==1,NR==5' /etc/passwd
    • awk '/2015:11:02/,/2015:11;05/'

    双分支判断

    • 如果磁盘使用率大于70% 提示not enough 挂载点名称 否则 提示磁盘 OK
    #!/bin/bash
    df -h |awk -F'[ %]+' '{
    if($5>=`70) print "not enough",$NF;else print "disk is ok";
    }'
    
    [root@m01 /server/scripts]# sh cipan.sh
    not enough on
    disk is ok
    disk is ok
    disk is ok
    disk is ok
    disk is ok
    disk is ok
    disk is ok
    
    • shell中的循环
      -- for 变量 in 内容
      -- do
      -- cmd(命令)
      -- done
    • awk中的循环
      -- awk数组
      -- for(i=1;i<+10;i++)

    案列

    • 统计每个学生的总成绩和平均成绩

    相关文章

      网友评论

          本文标题:shell编程- 四剑客

          本文链接:https://www.haomeiwen.com/subject/nywkuctx.html