zoukankan      html  css  js  c++  java
  • sed与awk

    sed 

    格式

    sed 选项 控制命令 文件或标准输入

    sed 流程: (循环打印)

    sed是将文件里的每一行读入模式空间进行操作,

    sed选项

    -r   支持正则表达
    -n  取消默认打印   清空当前模式空间,读入下一行
    -i   同步到文件里的内容  并生成备份文件
    -e  执行多条命令
    -f   引用sed脚本
    |bash  将输出的结果交给bash执行
    例:
    sed -n '9s#.*#echo hehe#'p passwd |bash
    hehe
    将passwd文件的第9行全部内容替换为echo hehe并交给bash执行

    sed命令

    sed命令  作用
    a 追加,在行后追加
    i 插入,在行前插入
    d 删除
    c 替换,很少使用,按行替换
    s 替换指定的字符串,后面跟g,g为s命令的全局替换标志
    p 输出指定的行,加-n取消默认打印
    w 另存文件  sed 'w 另存文件名' 文件名
    显示行号 '1=' 显示1行行号,'1,3='显示1-3行号
    l 显示文件内看不到的字符串,如$结束符
    y 转换字符
    q 退出sed
    r 读取指定文件到行后
    n 杜如下一行内容

    sed指定文件内容的执行范围

    sed '10' 命令  #匹配第10行

    '10,20'            #匹配10到20行

    '10,+20'          #匹配10到30行

    '1~2'              #从第一行开始以2为间隔,匹配结果为奇数行 1,3,5,7,9

    '2~2'              #从第二行开始以2为间隔.匹配结果为偶数行 2,4,6,8,10

    '10,$'             #从第10行到最后一行

    '/内容/'          #匹配到所有指定内容的行

    '/内容1/,/内容2/'   #匹配从内容1到内容2的所有的行

    '/内容,$/'       #匹配到内容到结尾的所有的行

    '10,/内容/'    #从第10行到匹配到内容的行

    '/内容/,10'    #从匹配到内容的行到底10行

    '/内容/,+20'  #从匹配到的内容的行开始之后的20行

    sed换行   teb 空格

    sed增删改查

    -a在行后增加

    [root@wk ~]# sed '1,3a hehe' passwd            #在1到3行的行后增加hehe
    root:x:0:0:root:/root:/bin/bash
    hehe
    bin:x:1:1:bin:/bin:/sbin/nologin
    hehe
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    hehe

    -i在行前增加

    sed '/root/i hehe' passwd                 #在内容为root的行前增加
    hehe
    root:x:0:0:root:/root:/bin/bash
    hehe
    operator:x:11:0:operator:/root:/sbin/nologin

    sed 'd' 文件 #删除文件的所有内容
    sed '1,10d' passwd    #删除passwd文件1到10行内容

    c替换只能替换正行

    sed '1,20c hehe' passwd                 #将从1到20行的内容全部替换为hehe   (1-20全部内容只替换为1个hehe)
    hehe
    jenkins:x:997:995:Jenkins Automation Server:/var/lib/jenkins:/bin/false

    s 替换匹配到的字符          s# # #

    sed -n 's#root#123#p' passwd         #将root替换为123 p打印出来 
    123:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/123:/sbin/nologin
    sed -i 's#root#123#g' passwd           
    #将文件passwd内的所有root替换为123 g全局替换,不加g只替换每行匹配到的第一个root 也可以把g写成数字指定替换每行的几个

    s的反向引用

    [root@wk ~]# cat 123 
    aaa bbb ccc ddd eee
    
    [root@wk ~]# sed -nr 's#a.* (.*) (.*) .*e#1 2#p' 123 
    ccc ddd
    s###里的一个() 对应一个1
    s#()()()()#1 2 3 4# 
    1 可以取出 对应第1个括号里的内容  以此类推

    &符号

    [root@wk ~]# sed -rn 's#a.* (.*) (.*) .*e#所有&内容#p' 123 
    所有aaa bbb ccc ddd eee内容
    &代表s#-##  匹配到的所有内容

    [root@wk ~]# sed -n 1,3p passwd          #查看1到3行
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

    sed显示行号打印出来   

    [root@wk ~]# sed -n '2,4{=;p}' passwd |xargs -n2
    2 bin:x:1:1:bin:/bin:/sbin/nologin
    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4 adm:x:3:4:adm:/var/adm:/sbin/nologin
     -n 不打印默认输出   2-4行 先=显示行号.在p打印内容{用大括号一起执行},最后交给xargs -n2 指定2个字段为一行 打印出来

    AWK 

    基本操作

    -F 指定 分隔符 

    [root@wk ~]# cat 1
    aa:bb,cc dd
    -F指定以冒号逗号和空格为分隔符打印4个字段
    [root@wk
    ~]# awk -F "[,: ]" '{print $1" "$2" "$3" "$4}' 1     aa bb cc dd

    print 打印

    [root@wk ~]# awk "{print}" 1
    aa:bb,cc dd

    NF  多少字段

    [root@wk ~]# awk -F":" '{print NF}' passwd 
    7
    1
    7
    [root@wk ~]# awk -F":" '{print $NF}' passwd 
    /bin/bash
    irgs
    /sbin/nologin
    /sbin/nologin

    NR 多少行

    [root@wk ~]# awk '{print NR,$0 }' passwd           #打印行号和内容
    1 root:x:0:0:root:/root:/bin/bash
    2 irgs
    3 n catn:x:1:1:bin:/bin:/sbin/nologin
    
    [root@wk ~]# awk 'NR>3 && NR<6''{print NR,$0}' passwd             #打印第4行到第5行 行号和内容
    4 daemon:x:2:2:daemon:/sbin:/sbin/nologin
    5 adm:x:3:4:adm:/var/adm:/sbin/nologin

    awk循环数组

    [root@wk ~]# cat 1
    www.baidu.com
    www.321.com
    www.523.com
    www.baidu.com
    www.baidu.com
    www.523.com
    www.523.com
    www.huawei.com
    www.baidu.com
    www.baidu.com
    www.523.com
    www.baidu.com
    www.523.com
    www.321.com
    www.523.com
    www.baidu.com
    www.523.com
    www.huawei.com
    www.hehe.com
    www.hehe.com
    [root@wk ~]# awk -F"." '{s[$2]=s[$2]+1}END{for(k in s) print s[k],k}' 1
    2 huawei
    7 523
    2 321
    2 hehe
    7 baidu

    s[$2]没有定义值所以s[$2]=0,因此s[$2]=s[$2]+1当$2出现1次对应的 s[$2] 做一次+1

    k in s 把 k赋值s  

    k=域名 =$2   后来的覆盖新的

    s[k] = s[$3]+1 

    [root@wk ~]# cat 12
    11 22 
    22 33
    33 44
    将第二列数值相加
    [root@wk ~]# cat 12
    11 22 
    22 33
    33 44
    [root@wk ~]# awk 'BEGIN{s=0}{s+=$2}END{print s}' 12
    99
  • 相关阅读:
    【独立开发人员er Cocos2d-x实战 001】csb文件导出和载入
    Best Time to Buy and Sell Stock I &amp;&amp; II &amp;&amp; III
    cocos2d-x项目101次相遇-安装和环境搭建 -xcode
    使用 C# 开发智能手机软件:推箱子(十二)
    javascript实现掉落弹出层------Day29
    Android中onTouch与onClick事件的关系
    CSDN编程挑战——《交替字符串》
    【NPR】非真实感渲染实验室
    CSS自己主动换行、强制不换行、强制断行、超出显示省略号
    在Ubuntu 14.04安装和使用Docker
  • 原文地址:https://www.cnblogs.com/ywrj/p/9613962.html
Copyright © 2011-2022 走看看