zoukankan      html  css  js  c++  java
  • linux三剑客grep、sed、awk

    linux三剑客grep、sed、awk一般都会配合正则表达式进行使用,正则表达式的常用元字符如下:

    普通正则

     扩展正则

    一、grep

    1、命令形式

    grep  [options]  pattern  [file]

    2、选项

    注:grep使用扩展正则的时候要用-E

    3、实战

    (1)查找文件中显示root的行号

       grep -n root test.txt

    (2)查看文件中不显示root的行号

       grep -nv root test.txt

     

    (3)查找以s开头的行

     grep ^s test.txt

     (4)查找以n结尾的行

    grep ^s test.txt

     

    二、sed

    sed是流编辑器,一次处理一行数据。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。

    1、命令形式

     sed [-hn..][-e<script>][-f<script FILE][FILE]

    -h:显示帮助

    -n:仅显示script处理后的结果

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

    -f<script>以选项中指定的script文件来处理输入的文本文件。 

    2、常用命令

    a:新增   sed -e '4a newline'   (在第4行后面新增一行newline)

    c:取代  sed -e '2,5c No 2-5 number'  (用c后面的内容‘No 2-5 number’取代2-5行的内容)

    d:删除 sed -e '2,5d' (删除2-5行的内容)

    i:插入 sed -e '2i newline'  (在第2行前面插入一行,内容为'newline')

    p:打印 sed -n 'root/p'   (两个/之间的内容代表正则,打印出匹配root的内容)

    s:取代  sed -e 's/old/new/g'   (用new取代old,g 表示全局取代,不加g只能替换每一行的第一个匹配的内容)

    3、实战

    (1)sed -e '4a newline'   (在第4行后面新增一行newline)

    未修改文件内容,直接修改文件内容需要加-i

     (2)sed -e '2i newline'  (在第2行前面插入一行,内容为'newline')

     (3)取代  sed -e 's/root/hello/g'   (用hello取代root,/g 表示全局取代,不加/g只能替换每一行的第一个匹配的内容)

    使用g的效果

    3、awk

    把文件文件逐行读入,并以空格为默认分隔符进行逐行切片,切开后的内容再进行后续处理。

     1、命令形式

    awk 'pattern+action' [file]

    2、常用参数

    3、实战 

    (1)打印/etc/password文件中有root信息的行,并打印出shell信息

    awk -F : '/root/{print $7}' /etc/password   (以':'进行域分隔,$7对应shell信息一列)

    awk中使用正则时,需要用/ /括起来

    (2)打印/etc/password文件的第二行内容

    awk  -F : 'NR==2{print $0}' /etc/password

    (3)使用Begin加入标题,并打印$1,$2

    awk -F : 'BEGIN {print "Begin,begin"} {print $1,$2} ' test.txt

     4、自定义分隔符

    $ echo '11 22|33|44|55'|awk 'BEGIN{RS="|"} {print $0}'

    4、linux三剑客实战

    log文件中内容的格式如下:

    223.104.7.59 - - [05/Dec/2018:00:00:01 +0000] "GET /topics/17112 HTTP/2.0" 200 9874 "https://www.googleapis.com/auth/chrome-content-suggestions" "Mozilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1" 0.040 0.040 .

    (1)找出log中的404 500的报错有多少条

    grep -E ' 404 | 500 ' nginx.log  |wc -l

    awk '/ 404 | 500 /' nginx.log |wc -l

    awk '$9~/404|500/' nginx.log  |wc -l  (将第9列与404和500进行匹配)

     (2)查找访问量最高的ip

    awk '{print $1}' nginx.log| sort |uniq -c|sort -nr|head -3 

    先打印出所有的ip;然后排序;然后删除重复的行,并在每一行旁边显示重复次数;按照数值大小倒序排序;取前3个

     grep -oE '^[0-9]*.[0-9]*.[0-9]*.[0-9]*' nginx.log |sort|uniq -c|sort -nr|head -3

    (3)将nginx.log中的/topics/数字修改成/topics/numbers

    sed 's#/topics/[0-9]*#/topics/numbers#g' nginx.log  (sg之间的分割符号不局限于用/,也可以用其他符号代替

     

     

    (4)将所有的ip地址横向打印

    awk '{print $1}' nginx.log | sed ':1;N;s/ /|/g;t1'

    N的作用是将下一行的内容追加到上一行(包含换行符)

    :1的作用是对命令的位置打标记

    t1的作用是跳转到标记处

  • 相关阅读:
    主线程和子线程的区别
    正则表达式 之 常用实例
    Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法
    .Net 与 Java 的服务接口相互调用
    C# 之 SqlConnection 类
    ADO.Net 之 数据库连接池(一)
    C# 之 DataReader 和 DataSet 的区别
    Asp.Net 之 缓存机制
    IIS 之 失败请求跟踪规则
    IIS 之 HTTP错误信息提示
  • 原文地址:https://www.cnblogs.com/crystal1126/p/14782225.html
Copyright © 2011-2022 走看看