• linux 三剑客 使用总结 grep sed awk


    ###

    下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。

    我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。

    在说这三个命令前我们要插入一个小插曲就是“正则表达式”。

    ###

    一、正则表达式

    所谓的正则表达式我个人理解就是正规的表示方法。他是用简单的方法来实现强大的功能,所以深受计算机爱好者的使用。

    三剑客与正则表达式是什么关系呢?

    我们可以这样理解,三剑客就是普通的命令,有的把他们叫做工具,在我看来都一样。而正则表达式就好比一个模版。三剑客能读懂这个模版。就这么简单。注意只有三剑客才能读懂这个模版哦!

    现在他们的关系和功能都搞懂了,接下来我们就来认识下他们怎么结合的。正则表达式是一个模版,这个模版是由一些普通字符和一些元字符组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义。

    下面说一些常用的:

    ^    匹配行首 表示以某个字符开头
    $    匹配行尾 表示以某个字符结尾
    ^$   空行的意思
    .    匹配任意单个字符
    *    字符* 匹配0或多个此字符
    \    屏蔽一个元字符的特殊含义
    []   匹配中括号内的字符 表示过滤括号内的字符
    .*   代表任意多个字符
    lele\{n\}    用来匹配前面lele出现次数。n为次数  统计前面lele出现的次数
    lele\{n,\}    含义同上,但次数最少为n
    lele\{n,m\}   义同上,但lele出现次数在n与m之间

    三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

    ###

    准备一个文件,练习一下下面的命令,最好是一个Nginx日志这样的日志文件,毕竟日志查询是重头,

    ###

    二、grep

    文本过滤(模式:pattern)工具,grep, egrep

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


    举例子:

    1、查找文件内容包含root的行数

    cat access.log | grep root -n

    2、查找文件内容不包含root的行

     cat access.log | grep root -nv  # v是 reverse 颠倒的意思

    3、查找以s开头的行

     cat access.log | grep ^s

    4、查找以n结尾的行

    cat access.log | grep n$

    5,查找以n结尾的行的行数

    cat access.log | grep n$ -c  这是返回的一个统计数字

    ###

    三、sed

    sed是一种流编辑器,它一次处理一行内容。

    处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

    然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。

    这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

    sed [option]... 'script' inputfile

    选项

    -n 不输出模式空间内容到屏幕,即不自动打印
    -e 多点编辑
    -f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
    -r 支持使用扩展正则表达式
    -i 直接编辑文件
    -i.bak 备份文件并原处编辑

    script 地址定界

    不给地址:对全文进行处理
    单地址:
    #: 指定的行,$:最后一行
    /pattern/:被此处模式所能够匹配到的每一行
    地址范围:
    #,#
    #,+#
    /pat1/,/pat2/
    `#,/pat1/
    ~:步进
    1~2 奇数行
    2~2 偶数行


    编辑命令:

    d 删除模式空间匹配的行,并立即启用下一轮循环
    p 打印当前模式空间内容,追加到默认输出之后
    a [\]text1 在指定行后面追加文本,支持使用\n实现多行追加
    i [\]text 在行前面插入文本
    c [\]text 替换行为单行或多行文本
    w /path/somefile 保存模式匹配的行至指定文件
    r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
    = 为模式空间中的行打印行号
    ! 模式空间中匹配行取反处理
    s///:查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
    g 行内全局替换
    p 显示替换成功的行
    w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中


    举例子:

    1、打印出文件第二行

     cat test.txt | sed -n 2p

    2、打印出2-5行的内容

    cat test.txt | sed -n 2,5p

    3、将文件中的root全部替换为abc

     sed -i s/root/adb/g test.txt

    -i 直接修改读取的文件内容,而不是输出到终端。  如果不加,就会把替换的内容,输出出来,
    s :取代,可以直接进行取代的工作。

    g: 是全局的意思。其中#是格式符,他也可以是@或者别的/。

    Sed替换格式是:sed -i ‘s/要替换的内容/替换成的内容/g' 文件名。

    ###

    四、awk

    报告生成器,格式化文本输出,有多种版本:New awk(nawk),GNU awk( gawk)

    awk [options] 'program' file…

    program:pattern{action statements;..}

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

    选项:

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

    分割符、域和记录

    awk执行时,由分隔符分隔的字段(域)标记1,1,2..n称为域标识,n称为域标识,0为所有域。
    省略action,则默认执行 print $0 的操作。

    变量

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

    注意:以上都是内置变量,在引用时不需要前面加$,每新建一个变量,都需要加个-v,与变量名之间有无空格都可以,变量可以在引用之后再声明,但那一行的输出会输出空行。

    printf命令

    printf “FORMAT” , item1, item2, ... 不会自动换行,FORMAT中需要分别为后面每个item指定格式符。

    格式符
    格式符 item表现形式
    %c 显示字符的ASCII码
    %d, %i 显示十进制整数
    %e, %E 显示科学计数法数值
    %f 显示为浮点数
    %g, %G 以科学计数法或浮点形式显示数值
    %s 显示字符串
    %u 无符号整数
    %% 显示%自身
    修饰符
    格式符 item表现形式
    #[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
    - 左对齐(默认右对齐) %-15s
    + 显示数值的正负符号 %+d
    操作符

    算术操作符:x+y, x-y, x*y, x/y, x^y, x%y
    -x: 转换为负数
    +x: 转换为数值
    比较操作符:==, !=, >, >=, <, <=
    模式匹配符:~:左边是否和右边匹配包含 !~:是否不匹配
    逻辑操作符:与&&,或||,非!
    函数调用:function_name(argu1, argu2, ...)
    条件表达式(三目表达式):selector?if-true-expression:if-false-expression

    PATTERN:根据pattern条件,过滤匹配的行,再做处理

    如果未指定:空模式,匹配每一行
    /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
    relational expression: 关系表达式,结果为“真”才会被处理
    line ranges:行范围 startline,endline:/pat1/,/pat2/不支持直接给出数字格式
    BEGIN/END模式

    awk控制语句

    { statements;… } 组合语句
    if(condition) {statements;…}
    if(condition) {statements;…} else {statements;…}
    while(conditon) {statments;…}
    do {statements;…} while(condition)
    for(expr1;expr2;expr3) {statements;…}
    break
    continue
    delete array[index]
    delete array
    exit
    awk [-F|-v] '行数筛选{XXX;XXX;printf “”,XXX,XXX}'

    举例子:

    1、打印文件第一列:

     awk -F : '{print $1}' access.log

     awk -F : '{print $1}' access.log

    这里的分隔符是冒号 ,然后print打印第一列

    3,这是打印netstat的命令结果的第六行,并且去重展示,

    netstat -atp |awk '{print $6}' | uniq

    4,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,

    netstat -atp |awk '{print $6}' | uniq -c

    5,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,,统计完了,还可以排序

    netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

    6,这是打印netstat的命令结果的第六行,并且去重展示,而且统计每一项的数量,相当于是分组统计,,统计完了,还可以排序,还可以只要前两个,

    netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn| head -2

    ####

    实战

    Linux通过日志文件统计IP访问次数排序,取前n条 

    文件

    日志内容如下:

    1.119.144.106 - - [03/Jan/2019:12:47:50 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:50 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:51 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:52 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:53 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.001" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    1.119.144.106 - - [03/Jan/2019:12:47:53 +0800] image.aa.com "GET /image/public/index.php/index/uploads/handle HTTP/1.1 0.000" 500 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" -
    123.125.71.82 - - [03/Jan/2019:12:47:57 +0800] image.aa.com "GET /Uploads/150827/55dee28ce9dbf.jpg HTTP/1.1 0.211" 200 509831 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
    220.181.108.169 - - [03/Jan/2019:12:48:03 +0800] image.aa.com "GET /Uploads/160622/576a046300906.jpg HTTP/1.1 1.567" 200 49965 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
    115.239.212.137 - - [03/Jan/2019:12:48:15 +0800] image.aa.com "GET /image/public/uploads/170109/587398dc20d79.JPG HTTP/1.1 0.362" 200 985944 "-" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1" -
    123.125.71.114 - - [03/Jan/2019:12:48:31 +0800] image.aa.com "GET /Uploads/170505/590c2d515b50a.jpg HTTP/1.1 1.406" 200 25317 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
    220.243.135.80 - - [03/Jan/2019:12:48:38 +0800] image.aa.com "GET /image/public/uploads/171129/5a1ec9255a89e.jpg HTTP/1.1 0.108" 200 39174 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
    220.243.135.143 - - [03/Jan/2019:12:48:38 +0800] image.aa.com "GET /Uploads/170804/5984129b7b4fb.jpg HTTP/1.1 0.172" 200 33351 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
    220.243.135.140 - - [03/Jan/2019:12:48:49 +0800] image.aa.com "GET /Uploads/161222/585b9f24c4a99.JPG HTTP/1.1 0.223" 200 381442 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
    112.80.254.51 - - [03/Jan/2019:12:48:52 +0800] image.aa.com "GET /Uploads/170806/5985f7ac2fb94.jpg HTTP/1.1 0.179" 200 72244 "-" "Mozilla/5.0 (Windows NT 5.1; rv:8.0.1) Gecko/20100101 Firefox/8.0.1" -
    123.125.71.109 - - [03/Jan/2019:12:48:57 +0800] image.aa.com "GET /Uploads/170516/591ac3201f954.jpg HTTP/1.1 3.026" 200 76574 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" -
    220.243.136.128 - - [03/Jan/2019:12:49:24 +0800] image.aa.com "GET /image/public/uploads/170330/58dc7a95a5a70.jpg HTTP/1.1 0.065" 200 59287 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -
    220.243.135.128 - - [03/Jan/2019:12:49:24 +0800] image.aa.com "GET /image/public/uploads/170321/58d0c185e5668.jpg HTTP/1.1 0.073" 200 102566 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36" -

    第一列是IP地址,现在我想根据IP统计它的数量,就可以写一个shell命令如下:

    cat logs/xxx.log | awk '{print $(1)}' | sort | uniq -c | sort -k 1 -n -r|head -10

    解释一下上面的命令,

    cat logs/xxx.log就是输出要统计的日志。

    awk后面跟一个指令,awk '{print $(1)}'就是打印出日志内容的第几列。$1就是第一列

    扩展:$(NF)是总列数,那么如果根据倒数第二列统计,就是$(NF-1)。

    sort就是对内容进行排序,默认是自然顺序排序。

    uniq指令用于排重,而是只适用于相邻两行相同的情况。所以一般结合sort使用。即先sort排序再排重。

    uniq -u是只显示唯一的记录行。uniq -c是显示有重复记录的情况。

    sort -k 1 -n -r这个指令,参看下面sort指令参数的详细说明

    sort选项与参数:

    -f :忽略大小写的差异,例如 A 与 a 视为编码相同;
    -b :忽略最前面的空格符部分;
    -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
    -n :使用『纯数字』进行排序(默认是以文字型态来排序的);
    -r :反向排序;
    -u :就是 uniq ,相同的数据中,仅出现一行代表;
    -t :分隔符,默认是用 [tab] 键来分隔;
    -k :以哪个区间 (field) 来进行排序的意思

    所以 sort -k 1 -n -r 指令的意思就是对第一列按照纯数字逆序排序。

    这个纯数字是哪里来的呢?是uniq -c来的,原来剩下一列就是IP了,当执行uniq -c指令时,它会统计重复记录的次数并把这次数显示在第一列。所以现在有两列了,第一列是重复次数,第二列是IP。所以这里是按照重复次数排序。

    head -10这个不用说了吧,显示前10行。


    ####

  • 相关阅读:
    io学习
    asp.net文件上传进度条研究
    asp.net页面中的Console.WriteLine结果如何查看
    谨慎跟随初始目的不被关联问题带偏
    android 按钮特效 波纹 Android button effects ripple
    安卓工作室 日志设置
    安卓工作室 文件浏览器 android studio File browser
    一个新的Android Studio 2.3.3可以在稳定的频道中使用。A new Android Studio 2.3.3 is available in the stable channel.
    新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial
    码云,git使用 教程-便签
  • 原文地址:https://www.cnblogs.com/andy0816/p/15631572.html
Copyright © 2020-2023  润新知