美文网首页linux tools生信linux
Shell三剑客grep、awk、sed

Shell三剑客grep、awk、sed

作者: 冬月廿拾 | 来源:发表于2019-06-30 21:40 被阅读106次

    https://blog.csdn.net/sj349781478/article/details/82930982

    grep、awk、sed大概介绍

    • grep 基于正则表达式查找满足条件的内容
    • awk 报告生成器,格式化文本输出
    • sed 修改数据

    grep

    grep [OPTIONS] PATTERN [FILE...]

    参数

    -o 仅显示匹配到的字符串
    -E 使用ERE,相当于egrep
    --color=auto 对匹配到的文本着色显示
    -v 显示不被pattern匹配到的行
    -i 忽略字符大小写
    -n 显示匹配的行号
    -c 统计匹配的行数
    -q 静默模式,不输出任何信息
    -A # after, 后#行
    -B # before, 前#行
    -C # context, 前后各#行
    -e 实现多个选项间的逻辑or关系
    grep –e ‘cat ’ -e ‘dog’ file
    -w 匹配整个单词
    -F 相当于fgrep,不支持正则表达式

    /  请无视

     /  echo 12345 | grep 2
    12345
     /  echo 12345 | grep -o 2
    2
     /  echo 12341234 | grep -oE '.*?3'
    123
    4123
    

    正则表达式

     /  echo hello world  hiiii| grep -oE "hello|hi"
    hello
    hi
    
    • [ ] 匹配在[ ] 中的任意一个字符
    /  echo asd | grep -E "[a]"
    asd
    
    • [^ ] 匹配内容不能有[ ] 中任意一个字符
     /  echo asd | grep -oE "[^a]"
    s
    d
    

    正则表达式相关: https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

    awk

    awk [options] 'program' file…

    1、program:pattern{action statements;..}

    • pattern部分决定动作语句何时触发及触发事件
      BEGIN,END
    • action statements对数据进行处理,放在{}内指明
      print, printf

    2、选项:

    • -F 指明输入时用到的字段分隔符
    • -v var=value 自定义变量

    3、分割符、域和记录

    • awk执行时,由分隔符分隔的字段(域)标记1,1,2..n称为域标识,n称为域标识,0为所有域。
    • 省略action,则默认执行 print $0 的操作。
    echo 7,8,9 | awk -F, '{print $2}'
    8
    8
    

    4、变量
    FS:输入字段分隔符(分割列);OFS:输出字段分隔符();RS:输入记录分隔符(分割行);ORS:输出记录分隔符;NF:字段数量;NR:记录号;
    NFR:各文件分别计数,记录号。FILENAME:当前文件名;ARGC:命令行的参数;ARGV:数组,保存的是命令行所给定的各参数。

     **** ps | awk '{print $0}'
      PID TTY           TIME CMD
    79791 ttys000    0:00.09 ssh 11***4@shell.***-***.com
    44956 ttys001    0:00.06 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server login -fp apple
    44958 ttys001    0:10.59 -zsh
    
    ****ps | awk '{print $2}'
    TTY
    ttys000
    ttys001
    ttys001
    
    - NF字段数
    ****  ps | awk '{print $NF}' #由前面可知一行有4列,所以这里等价于 $4
    CMD
    11***@shell.****-****.com
    apple
    
    ****ps | awk 'NR>1{print $(NF-1)}'
    ssh
    -fp
    
    • FS 分割列
    **** echo 2/3/4 | awk 'BEGIN{FS="/"}{print $1}'
    2   #以 / 做分割
    **** echo 2/3/4 | awk 'BEGIN{print $1}'
      #取不到,2/3/4被视为一个整体,没有分割
    
    • RS分割行
    **** echo 2/3/4 | awk 'BEGIN{RS="/"}{print $0}'  #以 / 作为行的分割标志
    2
    3
    4
    
    • ORS输出分隔符
    [*****@izuefockpz ~]$ echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
    /usr/local/bin
    /usr/bin
    /usr/local/sbin
    /usr/sbin
    
    [****@izuefockpz ~]$ echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk 'BEGIN{FS="\n";ORS=":"}{print $0}'
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
    

    4、awk控制语句

    • { statements;… } 组合语句
    • if(condition) {statements;…}
    • if(condition) {statements;…} else {statements;…}
    • while(conditon) {statments;…}
    • do {statements;…} while(condition)
    • for(expr1;expr2;expr3) {statements;…}

    sed

    sed [option]... 'script' inputfile
    1、选项
    -n 不输出模式空间内容到屏幕,即不自动打印
    -e 多点编辑
    -f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
    -r 支持使用扩展正则表达式
    -i 直接编辑文件
    -i.bak 备份文件并原处编辑
    2、script 地址定界
    不给地址:对全文进行处理
    单地址:
    #: 指定的行,$:最后一行
    /pattern/:被此处模式所能够匹配到的每一行
    地址范围:
    #,#
    #,+#
    /pat1/,/pat2/
    `#,/pat1/
    ~:步进
    1~2 奇数行
    2~2 偶数行
    3、编辑命令:
    d 删除模式空间匹配的行,并立即启用下一轮循环
    p 打印当前模式空间内容,追加到默认输出之后
    a []text1 在指定行后面追加文本,支持使用\n实现多行追加
    i []text 在行前面插入文本
    c []text 替换行为单行或多行文本
    w /path/somefile 保存模式匹配的行至指定文件
    r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
    = 为模式空间中的行打印行号
    ! 模式空间中匹配行取反处理
    s///:查找替换,支持使用其它分隔符,s@@@,s###

    **** echo hello world | sed 's#hello#AAAA#'
    AAAA world
    

    4、替换标记:
    g 行内全局替换
    p 显示替换成功的行
    w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中

    相关文章

      网友评论

        本文标题:Shell三剑客grep、awk、sed

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