Linux | 三剑客

139 阅读2分钟

Linux | 三剑客

sed流编辑器

对文件,数据流进行加工处理。sed有一个模式空间,读取每一行然后按照规则进行模式匹配

  • 参数

    -n   取消默认输出,也就是不符合规则的不会输出
    -i   将结果写入文件,改变文件内容
    
  • 内置命令

    a   文件追加   1a表示在第一行后追加内容
    d   删除匹配的内容
    i   插入      4i 表示在第四行插入内容
    g   全局匹配
    p   打印匹配结果
    
  • 实例

    输出:
        sed -n "2,3p" test  // 输出test文件的2,3行
        sed -n '/^#/!d' < ifile     // 显示ifile文件中的所有注释行
        sed '/^[[:space:]]*#/d;/^[[:space:]]*$/d' filename
        // 先删除所有以#开头的行(注释行),再删除所有空行,剩下的就是非注释行了
    删除:
        sed -i  "/ganme/d" test // 匹配test文件中有game的行,然后删除
        sed "5, $d" test    // 删除第五行之后的所有行
    替换:
        sed -e  "s/my/I/gp" test    // 替换test文件的My为I,g表示全部替换,p表示打印
    插入:
        sed "4i hello" test  sed "2a hello" test    // 插入文件内容
        sed "a hello" test  // 每一行之后
        
    ifconfig eth0 | sed "2p" -n | sed "s/^.*inet//" | sed "s/net.*$//" 
    相当于
    ifconfig eth0 | sed -e "2s/^.*inet//" -n -e "2s/net.*$//" -n
    ​
    ^.*inet 表示以inet开头的前面任何字符    $表示结尾
    

awk命令

用于格式化文本内容,对文本进行复杂处理。

  • awk 可选参数 模式 {action}动作print file

  • 内置变量

    NF 表示 域/列号  $NF 表示最后一列
    NR 表示行号
    FNR 多个文件处理,每个文件行号从1开始
    ​
    FS 表示输入分隔符,默认是空格
    OFS 表示输出分隔符,默认也是空格
    ​
    RS 输入时记录分割符,默认为回车键
    ORS 输出域/记录分割符,默认为空格/回车
    ​
    ARGC 参数个数
    ARGV 参数数组  ARGV[0] 为 awk;   ARGV[1] 为文件名
    
  • 参数

    -F  指定分隔符
    -v  修改变量
    
  • 模式

    BEGIN模式 和 END模式
    
  • 实例

    awk -F "#" -v OFS="----" 'NR==3,NR==6{print NR,$1,$NF}' file
    // 表示输入分隔符是#,输出分隔符是---,3-6行数据
    ​
    awk -v name="zxw" 'BEGIN{print "my name is",name} {print FNR,$0,$NF} END{print "awk结束了"}' file1 file2
    // 表示在输出内容前输出 my name is zxw FNR表示两个文件行号从1开始
    ​
    awk '/game/{print NR,$0}' file  // 找到game出现的行