• 【Linux】linux中文本操作利器grep,awk,sed


    grep命令


     grep(global search regular expression)是一种强大的文本搜索工具,它可以使用正则表达式搜索文本,并把匹配的行打印出来。平时搜索文本中内容的时候是非常方便的。

     格式:

     grep [option] pattern filename

     主要选项:

    • -A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。
    • -o 只输出文件中匹配到的部分。
    • -v 反转查找。
    • -i 忽略字符大小写的差别。
    • -E 使用扩展正则表达式。
    • -c 计算匹配到的列数。
    • -n 列出匹配到的行号。
    • -s 不显示错误信息。

     案例:

      在passwd文件中找到包含root的行

    [root@localhost rabbitmq-c]# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

    列出行号

    [root@localhost rabbitmq-c]# grep -n root /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    10:operator:x:11:0:operator:/root:/sbin/nologin

    多个文件中搜索

    [root@localhost rabbitmq-c]# grep -n root /etc/passwd /etc/shadow
    /etc/passwd:1:root:x:0:0:root:/root:/bin/bash
    /etc/passwd:10:operator:x:11:0:operator:/root:/sbin/nologin
    /etc/shadow:1:root:$6$xlxl/3ch$XPvzGYnvC.jk5y7NvQcbNO/8RZ6pLCFvFi79ceS7fXbffKEHG1tfRw

    s参数忽略错误提示

    [root@localhost rabbitmq-c]# grep -ns root /etc/*
    /etc/aliases:12:postmaster:     root
    /etc/aliases:15:bin:            root
    /etc/aliases:16:daemon:         root
    /etc/aliases:17:adm:            root

    统计匹配倒的行数

    [root@localhost rabbitmq-c]# grep -nsc root /etc/passwd
    2

    大C参数匹配结果的前2行和后2行

    [root@localhost rabbitmq-c]# grep -nsC 2  root /etc/passwd
    1:root:x:0:0:root:/root:/bin/bash
    2-bin:x:1:1:bin:/bin:/sbin/nologin
    3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
    --
    8-halt:x:7:0:halt:/sbin:/sbin/halt
    9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10:operator:x:11:0:operator:/root:/sbin/nologin
    11-games:x:12:100:games:/usr/games:/sbin/nologin
    12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

     满足多个关键字

    [root@localhost ~]# ls /usr/local/mysql/data/oa_2018/ | grep -E "yunwei_log|workflow_order"
    workflow_order.ibd
    yunwei_log.ibd

    sed命令


    linux中的sed是一种流处理编辑器,它是文本处理中非常中的工具。它可以对文本进行增加,删除,替换的处理。

           处理时需要一个文本或者管道输入,然后读取当前处理的行存储在模式空间(pattern space)也就是一个临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件本身的内容并没有改变,除非将结果重定向存储输出。

    sed操作过程:

        sed有个文本选定的过程,就是用正则选定文本,选定了可以处理的行之后,才会正真的调用sed命令去操作。

    sed命令格式:分两种

        命令行格式:

        sed [options] 'command' file(s) 

        脚本格式:

        sed [options] -f scriptfile file(s)

    选项[options]:

      -n或--quiet或——silent:仅显示script处理后的结果;

      -e<script>或--expression=<script>:以选项中的指定的script来处理输入的文本文件;

    命令(command): 行定位(正则)+ sed命令。

           p  打印模板块的行。
           P (大写) 打印模板块的第一行。

    sed用法实例

    示例1. p参数打印文件

    [root@localhost ~]# sed 'p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    ......

    每一行都打印了两遍,因为sed命令原理是读入一行打印一行,这里加上p参数又打印了一行。

    加上n参数就会打印相关的行,所以就不会显示重复的行。

    [root@localhost ~]# sed -n 'p' /etc/passwd
    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
    .......

    一般-p参数都会和n一起使用。

    sed行定位(选择要处理的行,可以通过正则匹配)

         定位一行: x;(x代表行号)    /pattern/ (正则)

    [root@localhost oa]# sed -n '5p' passwd
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    [root@localhost oa]# nl passwd | sed -n '5p'    也可以用nl命令打印出行号
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

     通过正则打印包含关键字的行,下面就是打印包含mysql的行。

    [root@localhost oa]# sed -n '/mysql/p' passwd
    mysql:x:1001:1001::/home/mysql:/bin/bash

     定位几行:x,y; (x y都是行号,表示一个区间,x行到y行)      /pattern/,x; (正则表示法,x和y都可以用正则表示)

     打印5行到15行。

    [root@localhost oa]# nl passwd | sed -n '5,15p'
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin

     用正则来取范围

    [root@localhost oa]# nl passwd | sed -n '/lp/,/dbus/p'
         5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
         6  sync:x:5:0:sync:/sbin:/bin/sync
         7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
         8  halt:x:7:0:halt:/sbin:/sbin/halt
         9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
        10  operator:x:11:0:operator:/root:/sbin/nologin
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        12  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        13  nobody:x:99:99:Nobody:/:/sbin/nologin
        14  avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
        15  dbus:x:81:81:System message bus:/:/sbin/nologin

      取反操作,比如不显示5-15行

    [root@localhost oa]# nl passwd | sed -n '5,15!p'
         1  root:x:0:0:root:/root:/bin/bash
         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               这里5到15行就没选择
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        17  abrt:x:173:173::/etc/abrt:/sbin/nologin
        18  unbound:x:998:996:Unbound DNS resolver:/etc/unbound:/sbin/nologin
        19  usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
    .........

     定位间隔几行:first ~ step (first代表起始行号,step代表间隔几行,步长是多少)。

    [root@localhost oa]# nl passwd | sed -n '1~5p'    下面是从第一行开始每间隔5行输出一行
         1  root:x:0:0:root:/root:/bin/bash
         6  sync:x:5:0:sync:/sbin:/bin/sync
        11  games:x:12:100:games:/usr/games:/sbin/nologin
        16  polkitd:x:999:998:User for polkitd:/:/sbin/nologin
        21  apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
        26  rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
        31  rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
        36  gnome-initial-setup:x:992:990::/run/gnome-initial-setup/:/sbin/nologin
        41  oprofile:x:16:16:Special user account to be used by OProfile:/var/lib/oprofile:/sbin/nologin
        46  mysql:x:1001:1001::/home/mysql:/bin/bash

    awk命令


    awk是一个数据处理工具。可以编程,处理能力更为强大。

    awk处理方式:awk一次处理一行内容,也是行处理方式,和sed命令不同,awk可以对每行切片处理,比如说可以对每行的第一个单词输出,如果用sed处理那么就要用到替换功能,比较麻烦。

    awk格式:

       命令行格式:

       awk [options]  'command' file(s)

       脚本格式:

       awk -f awk-script-file file(s)

    格式:

        基本格式:

        command:pattern { awk操作命令(这里可以编程,awk也有内置函数) } ;         pattern :正则表达式;逻辑判断式;

       扩展格式:

    awk内置参数:

      $0:表示整个当前行。

      $1:每行第一个字段。

      $2:每行第二的字段。 其它的以此类推。

      分隔符:options:-F field-separator (默认为空格)。 例如: awk -F ‘:’ '{print $3}' /etc/passwd   就会把每行用:分割,然后取出第三个被分割后的字段。

      NR(行):每行的记录号。

      NF(列):字段数量变量。

    FILENAME:正在处理的文件名。

    示例1:

    打印第一列和第三列

    [root@localhost python]#  awk -F  ':' '{print $1,$3}' /etc/passwd     $1和$3直接的逗号,是用来显示出来的时候两列之间会有空格,起分割的作用,逗号也可以用双引号代替" "
    root 0
    bin 1
    daemon 2

    可以每列加上说明参数,制表的表示显示出来。

    [root@localhost python]#  awk -F  ':' '{print  "user:"$1"	 ""uid:"$3}' /etc/passwd
    user:root        uid:0
    user:bin         uid:1
    user:daemon      uid:2
    user:adm         uid:3

     打印出每行行号和列数

    [root@localhost python]#  awk -F  ':' '{print  NR,NF}' /etc/passwd
    1 7                  前面数字表示当前的行号,后面代表当前行有多少列
    2 7
    3 7

     也可以使用printf()函数 这个函数和php里printf()函数差不多,可以输出格式化的字符串。

    [root@localhost ~]# awk -F  ':' '{printf("Line:%s Col:%s
    ",NR,NF)}' /etc/passwd
    Line:1 Col:7
    Line:2 Col:7
    Line:3 Col:7
    Line:4 Col:7
    Line:5 Col:7
    Line:6 Col:7
    Line:7 Col:7
    Line:8 Col:7
    Line:9 Col:7

    awk条件判断:

    awk内置可以条件判断语句,比如显示passwd文件中用户ID大于100的行号和用户。

    [root@localhost ~]# awk -F  ':' '{if ($3 > 100) print "Line :" NR,"USER:" $1 }' /etc/passwd
    Line :14 USER:avahi-autoipd
    Line :16 USER:polkitd
    Line :17 USER:abrt
    Line :18 USER:unbound
    Line :19 USER:usbmuxd
    Line :22 USER:colord
    Line :24 USER:saslauth
    Line :25 USER:libstoragemgmt
    Line :27 USER:rtkit

    awk逻辑判断式:

       ~   ,    ! ~ (波浪线取反)  :代表匹配正则表达式  , 不匹配正则表达式

      == ,   != , <  , >         : 判断逻辑表达式

    示例:

    匹配第一列以m开头的行

    [root@localhost ~]# awk -F ':' '$1~/^m.*/{print $1}' /etc/passwd
    mail
    mysql

    匹配第一列不是以m开头的行

    [root@localhost ~]# awk -F ':' '$1!~/^m.*/{print $1}' /etc/passwd
    root
    bin
    daemon
    adm

    用户ID大于200的行号和用户

    [root@localhost ~]# awk -F ':' '$3>200{print $1 $3}' /etc/passwd
    polkitd999
    unbound998
    colord997
    saslauth996
    libstoragemgmt995

    awk扩展格式BEGIN和END:

      BEGIN {print  "start" } pattern { commands } END { print "end" }

      上面命令行的意思是在awk读取行之前先执行BEGAIN 模块中的内容,然后在执行commands (这里可以循环操作)内容,最后在执行END 模块中内容。

      下面看几个案例就容易懂了。

      案例:

      制表显示/etc/passwd文件每行的行号,每行的列数,对应行的用户名。

    [root@localhost ~]# awk -F ':' 'BEGIN{print "Line  Col User "}{print NR,NF,$1}END{print "-----over-----"}' /etc/passwd
    Line  Col User
    1 7 root
    2 7 bin
    3 7 daemon
    4 7 adm
    5 7 lp
    6 7 sync
    7 7 shutdown
    8 7 halt
    9 7 mail
    10 7 operator
    -----over-----

    awk逻辑处理:

    案例:

     求出目录中所有文件大小总和并打印出来

    [root@localhost rabbitmq-c]# ll | awk 'BEHIN{size=0}{size+=$5}END{print "size is " size/1024/1024"M"}'  在begin时候初始化size变量为0
    size is 1.61688M

    统计/etc/passwd账号总人数

    [root@localhost rabbitmq-c]# awk -F ':' 'BEGIN{count=0}$1!~/^$/{count++}END{print "count = "count}' /etc/passwd    求文件行数但是不包括空行
    count = 53

    统计用户id大于100的用户

    [root@localhost rabbitmq-c]# awk -F ':' 'BEGIN{num=0}{if ($3 > 100) name[num++]=$1}END{for (i=0;i<num;i++) print i,name[i]}' /etc/passwd   这里用到了数组 for循环
    0 avahi-autoipd
    1 polkitd
    2 abrt
    3 unbound
    4 usbmuxd
    5 colord
    6 saslauth

     统计网络中conneted和listen状态的数量

    [root@localhost rabbitmq-c]# netstat -anp | awk '$6~/CONNECTED|LISTEN/{sum[$6]++}END{for (i in sum)print i,sum[i]}'
    LISTEN 18
    CONNECTED 244
  • 相关阅读:
    .Net 4.0新特性之Dynamic 动态类型(转载)
    三种提高Google Analytics效率的方法(转载)
    PowerBuilder 12使.NET的应用开发更快捷
    .Net 之匿名类(AnonymousType)(转载)
    ASP.NET MVC学习笔记一(转载)
    js动态获取虚拟目录名称 相当于服务端ResolveUrl("")方法(转载)
    CSS 备忘(转载)
    ASP.NET4与VS2010开发Ajax Library特征(转载)
    POJ1988 Cube Stacking
    HDU3694 Fermat Point in Quadrangle
  • 原文地址:https://www.cnblogs.com/songgj/p/8907800.html
Copyright © 2020-2023  润新知