• 文本命令之三剑客初探


    1.1 sed
    流式编辑器,主要擅长对文件的编辑操作,我们可以实现定制好编辑文件的指令,然后让sed自动完成对文件的整体编辑.
    sed与vim的区别
    (1)sed可以把处理文件的规则事先写好,然后用同一套规则编辑多个文件,vim只能手动一个一个编辑.
    (2)sed处理文件,一次只能处理一行,即同一时间内存中只有文件的一行内容,无论文件内容多大,都不会对内存造成过大的压力,vim是一次把文件内容全部读取到内存再编辑,会占用过大的内存资源.

    用法:
    sed 选项 '规则' 文件路径

    选项:
    -n取消默认输出(只输出规则处理的结果,把默认输出的结果取消不输出)
    -r支持扩展正则表达式
    -i直接编辑文件(包括规则处理的结果和默认输出的结果)

     

    规则:定位+命令


    定位方式:
      (1)行定位
      1代表定位到第一行

      1,3代表从第一行到第三行

      1;3代表第一行和第三行

      不写定位代表定位所有行

     

      (2)正则表达式定位

      /egon/包含egon的行

      /^egon/以egon开头的行

      /egon$/以egon结尾的行

     

      (3)数字+正则表达式定位

      '1,5p'代表打印1到5行

      '1p;5p'代表打印第一行和第五行

      '1,/egon/p'代表打印从第一行到首次匹配到egon的行


    命令:

      d 删除
      p 打印

      i 在指定行的上一行插入新的信息,如:

        数字格式: '3ioldboy' 在第三行的上一行插入oldboy
        字符格式: '/egon/ioldboy' 在egon所在行的上一行插入oldboy
      a 在指定行的下一行附加新的信息,如:
        数字格式: '3aoldboy' 在第三行的下一行附加oldboy
        字符格式: '/egon/aoldboy' 在egon所在行的下一行附加oldboy

      注意:如果一条命令需要在不同的行插入不同的信息,必须使用-e参数.例如sed -e '3aoldboy' -e '/a/aoldboy' filename


      s###g  全局替换
      s###gi 全局替换并且不区分大小写
      命令可以用;号连接多条,如
      1d;3d;5d代表删除1,3,5行.
      '1p;2s#bin#xxx#gp'代表打印第一行,把第二行的bin替换成xxx并打印.


    用法示例:
    (1)p和d的用法

    [root@localhost ~]# sed '' a.txt    定位所有行
    egon1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon

    [root@localhost ~]# sed -n '' a.txt  定位所有行,并且取消默认输出
    [root@localhost ~]#

    [root@localhost ~]# sed -n '1,/xxx/p' a.txt   只打印1到xxx行,其他内容不输出到屏幕
    egon1111
    22222egon
    3333egon33333
    4444xxx44444

    [root@localhost ~]# sed '1,/xxx/d' a.txt     删除1到xxx行
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon

    [root@localhost ~]# sed '1d;3d;5d' a.txt    删除第一行,第三行,第五行
    22222egon
    4444xxx44444
    6666egon6666egon666egon

    (2)s///g 全局替换
    [root@localhost ~]# sed 's/egon/BIGEGON/g' a.txt   把所有行的所有egon都替换BIGEGON
    BIGEGON1111
    22222BIGEGON
    3333BIGEGON33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666BIGEGON6666BIGEGON666BIGEGON

    [root@localhost ~]# sed '/^egon/s/egon/GAGAGA/g' a.txt  以egon开头的行中的egon换成GAGAGA
    GAGAGA1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon

    [root@localhost ~]# sed '6s/egon/BIGEGON/' a.txt 只把第六行的egon换成BIGEGON,因为没加g,所以只替换第六行的第一个egon,不是全部替换.
    egon1111
    22222egon
    3333egon33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666BIGEGON6666egon666egon
     
    [root@localhost ~]# sed '1,3s/egon/BIGEGON/g' a.txt  把1到3行的egon换成BIGEGON
    BIGEGON1111
    22222BIGEGON
    3333BIGEGON33333
    4444xxx44444
    5555xxx55555xxxx555xxx
    6666egon6666egon666egon

    ###加上-i选项,直接修改文件,通常会在调试完毕确保没有问题后再加-i选项
     

    1.2 awk

    awk主要用于处理有格式的文本,例如/etc/passwd

    用法:
    awk 选项 '规则' 文件路径

    选项:
     -F:指定分隔符
    awk -F ": " 指定以:为分隔符
    awk -F "[/:]" 指定以/ : 为分隔符
    awk -F "[/:]+"指定以"/ : "为分隔符,并且如果"/ :" 之间没有字符,那么就把"/ :" 看做一个整体分隔符,如果"/" " : " 中间有字符,则要分开看做一列.

    规则:定位+命令

    定位方式:
      按数字
      NR==2 取第二行
      NR==2,NR==4或者NR>=2&&NR<=4 取第二行到第四行
      NR==2||NR==4或者NR==2;NR==4    取第二行和第四行

      按字符
      '/egon/'                                              取字符egon所在行
      '/egon/,/oldboy/'                                 取egon到oldboy所在行
      '/egon/;/oldboy/'或者/egon/||/oldboy/ 取egon和oldboy所在行

      按某一列来取行
      '$2~/egon/'                     找出第二列是egon的行
      '$2~/egon/{print $1}'      找出第二列是egon行,并打印第一列信息
      $2=="egon"                   找出第二列是egon的行

    命令:
      print 输出打印
      '{print $1}' 表示输出第一列内容
      '{print $NF}' 表示输出倒数第一列内容
      '{print $(NF-1)}' 表示输出倒数第二列内容

    ###总结: awk 命令中$符号的用法
    $1 $2 $3: 表示取第几列
    $NF: 取最后一列
    $(NF-n): n是数字,表示取倒数第n+1列
    $0: 表示取所有列
    $NR:取第一列
    取两列或者多列内容时,默认输出的信息是连在一起的,可以在'/a/{print $2,$3}' 中加个","号 输出的信息中间就会出现空格 也可以在'/a/{print $2":"3}'中加双引号,表示两列输出的内容中间会以 : 分隔


    用法示例:
    [root@localhost ~]# cat a.txt
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@localhost ~]# awk -F: '/^root/{print $1,$3}' a.txt   以root开头的行,并打印第一列和第三列
    root 0
    [root@localhost ~]# awk -F: '$1 ~ /^d/{print $1,$3}' a.txt  找到第一列以字符d开头的行,并打印第一列和第三列
    daemon 2
    [root@localhost ~]# awk -F: '$1 !~ /^d/{print $1,$3}' a.txt   取反
    root 0
    bin 1
    adm 3
    lp 4
    [root@localhost ~]# awk -F: 'NR>3{print $1}' a.txt  找到大于第三行的内容,并打印第一列
    adm
    lp
    [root@localhost ~]# awk -F: '$1 == "lp"{print $0}' a.txt   找到第一列是lp的字符,打印这一行所有内容
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin



    1.3 grep

    过滤

    用法: grep 选项 "过滤规则" 文件

    选项:

      -E :支持扩展的正则表达式。
      -i :忽略大小写(ignore case)。
      -v :反过来(invert),只打印没有匹配的,而匹配的反而不打印。
      -n :显示行号
      -c :显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
      -o :只显示被模式匹配到的字符串。
      -r  :   可以过滤目录,递归过滤
      -l  :   文件中包含过滤的内容时,就会返回文件的路径信息,一般配合-r一起使用.例如:grep -rl 'egon' /etc/ 表示把/etc/下的所有包含"egon"信息的文件路径显示出来

      
    [root@web01 ~]# ps aux |grep 'vim'
    root 9825 0.0 0.5 151692 5212 pts/1 S+ 12:05 0:00 vim a.txt
    root 10190 0.0 0.0 112724 988 pts/0 R+ 12:30 0:00 grep --color=auto vim
    [root@web01 ~]# ps aux |grep '[v]im'
    root 9825 0.0 0.5 151692 5212 pts/1 S+ 12:05 0:00 vim a.txt
    [root@web01 ~]#
    [root@web01 ~]# kill -9 9825



  • 相关阅读:
    Java 中的定时任务(一)
    超实用 Git 使用方式介绍
    TCP 建立连接为什么要握 3 次手?
    OSI、TCP、IP、UDP 这些都是啥??
    Java 中线程安全问题
    PlantUML——3.Graphviz的安装
    PlantUML——2.中文乱码及解决
    PlantUML——1.Hello
    maven实战系列
    NGUI优化之Drawcall
  • 原文地址:https://www.cnblogs.com/allenzhu128/p/13864489.html
Copyright © 2020-2023  润新知