jck28-桔子-桔子的学习笔记:linux三剑客

===================================

  • grep根据内容检索文件

    • grep keyword -i -r /home/jck28xxxx 检索某个文件加下匹配关键字的文档路径和内容行,-i忽略大小写
    • grep keyword -i file_name 检索某个文件匹配关键字的内容行,-i忽略大小写
    • grep keyword -v file_name 检索某个文件不匹配关键字的内容,-v invert反转,显示不匹配的内容行
    • grep keyword -A2 file_name 检索某个文件匹配关键字的内容行以及下2行,“-A”+数字
    • grep keyword -B1 file_name 检索某个文件匹配关键字的内容行以及前1行,“-B”+数字
    • grep keyword -C1 file_name 检索某个文件匹配关键字的内容行以及前后各1行,“-C”+数字

官方文档: https://www.gnu.org/software/grep/manual/grep.html

==================================

  • awk语法十分复杂,但是总体是’pattern {action}'结构

    • 语法大概介绍

      • 字段分隔符 FS:默认值是空格,当你输入的内容中包含空格,按照默认的FS,可以读取为多个字段;
      • 输出数据的字段分隔符 OFS:默认为空格
      • 记录分隔符 RS:默认值是新行,也就是你的输入内容多行,默认会被读取为多个记录;
      • 输出字段的行分隔符 ORS: 默认也是新行,调用print输出会把多个记录按照一行一行的形式输出,当然你可以自定义为其他的符号;
      • 行数/记录数 NR:已经读出的记录数;
    • Detail语法介绍

      • 字段与字段数 $1 $2 … $NF NF
      • $0 代表当前的记录
      • $1 代表第一个字段
      • $N 代表第 N 个字段
      • $NF 代表最后一个字段
      • $(NF-1) 代表倒数第二个字段
      • 开始和结束 awk ‘BEGIN{}END{}’
      • 正则匹配整行匹配 awk ‘/Running/’
      • 字段匹配 awk ‘$2~/xxx/’
      • 行数表达式取第二行 awk ‘NR==2’
      • 去掉第一行 awk ‘NR>1’
      • 区间选择
        awk ‘/aa/,/bb/’
        awk ‘/1/,NR==2’
    • 根据语法解读不同的代码段

      • 代码段1
        echo '1
        2
        3’ | awk ‘BEGIN{ORS=“:”}{$1=$1;print $0}’
        1:2:3:
        解读NOTE: echo语句内容三行,按照默认的RS行,读取为多个记录,ORS输出记录被重新定义为“:”,调用输出语句时候,输出就出现在一行里面;

      • 代码段2
        echo '1,10
        2,20
        3,30’ | awk ‘BEGIN{total=0;FS=“,”}{total+=$2}END{print total/NR}’
        20码
        解读NOTE: echo语句中多行,被解读为多条记录,每一行都有空格,可以解读为多个字段,$2读取第二个字段,total为第二个字段的和,NR是已经读取的记录数,此段为求平均值;

      • 代码段3
        echo 'a, 1, 10
        a, 2, 20
        a, 3, 30
        b, 1, 5
        b, 2, 6
        b, 3, 7’ | awk '{data[$1]+=$3}
        END{for(k in data) print k,data[k]}’
        a, 60
        b, 18
        解读NOTE:
        统计多家机构的营业额

      • 代码段4
        echo 'a, 1, 10
        a, 2, 20
        a, 3, 30
        b, 1, 5
        b, 2, 6
        b, 3, 7’ | awk '{data[$1]+=$3;count[$1]+=1;}
        END{for(k in data) print k,data[k]/count[k]}’
        a, 20
        b, 6
        解读NOTE:
        统计多家机构的营业额平均值

官方文档:https://www.gnu.org/software/gawk/manual/gawk.html

======================

  • sed的语法结构 [addr]X[options], 跟awd有点接近,sed的特别之处是可以修改文本,用的最多的就是查找替换
    • pattern表达式语法介绍
      • -e 表达式
      • sed -n ‘2p’ 打印第二行
      • sed ‘s#hello#world#’ 修改
      • -i 直接修改源文件
      • -E 扩展表达式
      • –debug 调试
      • 行数与行数范围 20 30,35
      • 正则匹配 /pattern/
      • 区间匹配 //,//
    • action表达式语法介绍
      • 打印,通常结合-n 参数:sed -n ‘2p’
      • s 查找替换:s/REGEXP/REPLACEMENT/[FLAGS]
      • d 删除,删除前两行 sed ‘1,2d’
      • a 追加
      • c 改变
      • i 插入内容到匹配行之前
      • e 执行命令
      • 分组匹配与字段提取:sed ‘s#([0-9]*)|([a-z]*)#\1 \2#’
    • 部分代码段解读
      • 打印特定行 sed -n 2p
      • 删除最后一行 sed $d
      • echo a:b:c | sed 's/:/123&/' ==>输出结果:a123:b:c
      • echo a:b:c | sed 's/:/&123/' ==>输出结果:a:123b:c
      • echo a:b:c | sed 's#:#|#g' ==>输出结果:a|b|c
        • NOTE:
          s 表示替换
          s 后面的追加字符可以为任意字符
          g 表示全局匹配
          & 表示匹配内容
      • echo 0 1 2 3 4 | sed -E 's#([1-3]) ([1-3]) ([1-3])#\3 \2 \1#' ==>输出结果: 0 3 2 1 4
        • NOTE:
          使用()对数据进行分组
          使用\1 \2 反向引用分组,&代表符合匹配的完整结果,\1代表分组后的第一个分组,\2是第二个分组
      • sed '/pattern/i addContent' file_name ==>i 插入内容到匹配行之前
      • -i直接修改源文件,对文件内容进行查找替换 sed -i ‘s#orignal#target#g’ file_name
      • 不修改源文件,查找替换后输出结果,不改源文件 sed ‘s#orignal#target#g’ file_name

官方文档: https://www.gnu.org/software/sed/manual/sed.html