美文网首页三剑客LinuxLinux
Linux三剑客 grep+awk+sed

Linux三剑客 grep+awk+sed

作者: InsaneLoafer | 来源:发表于2021-08-04 12:06 被阅读0次

    Linux三剑客介绍

    • grep
      • global search regular expression(RE) and print out the line
      • 基于正则表达式查找满足条件的行
    • awk
      • 名字来源于三个作者的名字简称
      • 根据定位到的数据行处理其中的分段
    • sed
      • stream editor
      • 根据定位到的数据行修改数据

    Linux三剑客的价值

    • 三剑客
      • grep 数据查找定位
      • awk 数据切片
      • sed 数据修改
    • 类比SQL
      • grep= select * from table like '%xx'
      • awk=select field from table
      • sed=update table set field=new where field=old

    grep

    • grep pattern file
    • grep -i pattern file 忽略大小写
    • grep -v pattern file 不显示匹配的行
    • grep -o pattern file 把每个匹配的内容用独立的行显示
    • grep -E pattern file 使用扩展正则表达式
    • grep -A -B -C pattern file 打印命中数据的上下文
    • grep pattern -r dir/ 递归搜索

    BRE基本正则表达式

    • ^ 开头 $ 结尾
    • [a-z] [0-9] 区间,如果开头带有^表示不能匹配区间内的元素
    • * 0个或多个
    • . 表示任意字符

    ERE扩展正则表达式

    • 基本正则表达式(BRE)基础上的扩展
    • ? 非贪婪匹配
    • + 一个或者多个
    • () 分组
    • {} 范围约束
    • | 匹配多个表达式的任何一个

    ERE开启方法

    image.png

    awk

    • 介绍
      • Awk是linux下的一个命令,同时也是一种语言解析引擎
      • Awk具备完整的编程特性。比如执行命令,网络请求等
      • 精通awk,是一个linux工作者的必备技能语法
    • awk 'pattern{action}'

    awk pattern语法

    • awk理论上可以代替grep
    • awk 'pattern{action}'
    • awk 'BEGIN{}END{}' 开始和结束
    • awk '/Running/' 正则匹配
    • awk '/aa/,/bb/' 区间选择
    • awk '$2~/xxx/' 字段匹配
    • awk 'NR==2' 取第二行
    • awk 'NR>1' 去掉第一行

    awk内置变量

    • FS字段分隔符
    • OFS输出数据的字段分隔符
    • RS记录分隔符
    • ORS输出字段的行分隔符
    • NF字段数
    • NR记录数

    awk的字段数据处理

    • -F 参数指定字段分隔符
    • BEGIN{FS="_"} 也可以表示分隔符
    • $0 代表当前的记录
    • $1代表第一个字段
    • $N 代表第N个字段
    • $NF代表最后一个字段
    • $(NF-1) 代表倒数第二个字段

    awk字段分割

    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk -F/ '{print $1,$2,$3,$4}'
    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/"}{print $1,$2,$3,$4}'
    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="/ | -"}{print $1,$2,$3,$4}'
    
    image.png
    • 修改OFS和ORS让$0重新计算
    echo $PATH | awk 'BEGIN{FS=":";OFS=" | "}{$1=$1;print $0}'
    echo $PATH | awk 'BEGIN{RS=":";ORS="^"}{print $0}'
    
    image.png

    awk行处理

    • 把单行分拆为多行
    echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
    echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0}'
    echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
    
    image.png
    • 多行组合为单行
    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{ORS=":"}{print $0}'
    
    image.png

    数据计算

    echo '1,10
    2,20
    3,30' | awk 'BEGIN{a=0;FS=","}{a+=$2}END{print a/NR}'
    
    image.png

    awk的词典结构

    • 提取包含”9”但是并不包含”study”的记录
    awk -F, '
    /9/{if(member[$1]!=1) d[$1]=$0}
    /study/{member[$1 ]=1; delete d[$1]}
    END{for(k in d) print d[k]}
    'file
    

    sed

    • sed [addr ]X[options]
    • -e 表达式
    • sed -n '2p' 打印第二行
    • sed 's#hello#world#' 修改
    • -i 直接修改源文件
    • -E 扩展表达式
    • --debug 调试

    pattern

    • 20 30,35行数与行数范围
    • /pattern/ 正则匹配
    • //,// 正则匹配的区间,第一个表示开始命中,第二个表示结束命中,类似开闸放水

    act1011

    • d删除
    • p打印,通畅结合-n参数:sed -n '2p'
    • 查找替换::s/REGEXP/REPLACEMENT/[FLAGS]
    • 分组匹配与字段提取:sed 's#([0-9]*)|([a-z]*)#\1\2#'

    sed使用

    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed 's#/#----#g'
    echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | sed -n '/^\ /bin/,/sbin/p'
    sed -i '.bak' -e " -e "
    

    三剑客实战

    • 日志数据检索
      • 找出log中的404 500的报错考察严谨性
      • 找出500错误时候的上下文考察grep高级用法
        -日志数据统计
      • 找出访问量最高的ip统计分析
    • 数据文件修改
      • 找出访问量最高的页面地址借助于sed的统计分析

    相关文章

      网友评论

        本文标题:Linux三剑客 grep+awk+sed

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