zoukankan      html  css  js  c++  java
  • SHELL用法八(Grep语句)

    1、SHELL编程Grep语句案例实战

    1)Find是Linux操作系统文件和目录的路径检索、查询工具,而Grep是Linux系统下文本文件内容检索或者匹配工具,Grep称为全局正则表达式检索工具,在企业中被广泛的采用。
    2)Grep工具的语法格式:
    grep -option(参数) ‘word’(关键词) file(文本文件);
     Option参数:
    -a(文本方式)
    -c(统计)
    -i(忽略大小写)
    -n(行号)
    -v(反选)
    -o(仅匹配)
    -w(词组)
    -A(匹配之后)
    -B(匹配之前)
    -C(匹配前后)
    3)Grep企业案例实战一,查找/etc/passwd文件中是否存在www用户信息,命令操作如下:
    grep root /etc/passwd
    grep "root" /etc/passwd
    grep -w "^root" /etc/passwd
    grep -i "root" /etc/passwd
    4)Grep企业案例实战二,ifconfig看到网卡信息,只查看IP地址所在行信息,命令操作如下:
    ifconfig|grep netmask
    ifconfig|grep -w inet
    ifconfig|grep -w 255
    ifconfig|grep -E "172|127"ifconfig|grep -E "([0-9]{1,3}.){3}[0-9]{1,3}"
    #创建三个文件,并且往文件中分别写入不同的代码;
    for i in `seq 1 3`;do touch jf$i.txt;echo jfedu jf$i >jf$i.txt;echo cat
    jf$i.txt;cat jf$i.txt;echo ----------;done
    5)通配符类型详解:
    *
    0个或者多个字符、数字;
    ?
    匹配任意一个字符;
    #
    表示注解;
    |
    管道符号;
    ;
    多个命令连续执行;
    &
    后台运行指令;
    !
    逻辑运算非;
    [ ]
    内容范围,匹配括号中内容;
    { }
    命令块,多个命令匹配。
    6)正则表达式详解:
    *
    前一个字符匹配0次或多次;
    .
    匹配除了换行符以外任意一个字符;.*
    代表任意字符;
    ^
    匹配行首,即以某个字符开头;
    $
    匹配行尾,即以某个字符结尾;
    (..)
    标记匹配字符;
    []
    匹配中括号里的任意指定字符,但只匹配一个字符;
    [^]
    匹配除中括号以外的任意一个字符;
    
    转义符,取消特殊含义;
    <
    锚定单词的开始;
    >
    锚定单词的结束;
    {n}
    匹配字符出现n次;
    {n,}
    匹配字符出现大于等于n次;
    {n,m}
    匹配字符至少出现n次,最多出现m次;
    w
    匹配文字和数字字符,不匹配符号;
    W
    w的反置形式,匹配一个或多个非单词字符,匹配
    符号;
    
    单词锁定符;
    s
    匹配任何空白字符;
    d
    匹配一个数字字符,等价于[0-9]。
    7)常用GREP工具企业演练案列:
    grep -c "test"
    jfedu.txt 统计test字符总行数;
    grep -i "TEST"
    jfedu.txt 不区分大小写查找TEST所有的行;
    grep -n "test"
    jfedu.txt 打印test的行及行号;grep -v "test"
    jfedu.txt 不打印test的行;
    grep "test[53]"
    jfedu.txt 以字符test开头,接5或者3的行;
    grep "^[^test]"
    jfedu.txt 显示输出行首不是test的行;
    grep "[Mm]ay"
    jfedu.txt
    匹配M或m开头的行;
    grep "K…D"
    jfedu.txt
    匹配K,三个任意字符,紧接D的行;
    grep "[A-Z][9]D"
    jfedu.txt
    匹配大写字母,紧跟9D的字符行;
    grep "T{2,}"
    jfedu.txt 打印字符T字符连续出现2次以上的行;
    grep "T{4,6}"
    jfedu.txt 打印字符T字符连续出现4次及6次的行;
    grep -n "^$"
    jfedu.txt
    打印空行的所在的行号;
    grep -vE "#|^$"
    jfedu.txt
    不匹配文件中的#和空行;
    grep
    --color -ra -E
    "db|config|sql" * 匹配包含db或者config或者
    sql的文件;
    grep
    --color -E "<([0-9]{1,3}.){3}([0-9]{1,3})>"
    jfedu.txt 匹配
    IPV4地址
    2、SHELL编程Awk语句案例实战
    Awk主要是用于对文本文件进行处理,通常是逐行处理,其语法参数格式为,AWK常用参数、变量、函数详解如下:
    awk  'pattern  + {action}'   file
    (1) AWK基本语法参数详解:
    单引号' '是为了和shell命令区分开;
    大括号{ }表示一个命令分组;
    pattern是一个过滤器,表示匹配pattern条件的行才进行Action处理; action是处理动作,常见动作为Print;
    使用#作为注释,pattern和action可以只有其一,但不能两者都没有。
    (2) AWK内置变量详解:
    FS 分隔符,默认是空格;
    OFS 输出分隔符;
    NR 当前行数,从1开始;
    NF 当前记录字段个数;
    $0 当前记录;
    $1~$n 当前记录第n个字段(列)。
    (3) AWK内置函数详解:
    gsub(r,s):在$0中用s代替r;
    index(s,t):返回s中t的第一个位置;
    length(s):s的长度;
    match(s,r):s是否匹配r;
    split(s,a,fs):在fs上将s分成序列a;
    substr(s,p):返回s从p开始的子串。
    (4) AWK常用操作符,运算符及判断符:
    ++ --
    增加与减少( 前置或后置);
    ^ **
    指数( 右结合性);
    ! + -
    非、一元(unary) 加号、一元减号;
    + - * / %
    加、减、乘、除、余数;
    < <= == != > >=
    数字比较; &&
    逻辑and;
    ||
    逻辑or;
    = += -= *= /= %= ^= **=
    赋值。
    (5) AWK与流程控制语句:
    if(condition) { } else { };
    while { };
    do{ }while(condition);
    for(init;condition;step){ };
    break/continue。
    常用AWK工具企业演练案列:
    (1) AWK打印硬盘设备名称,默认以空格为分割:
    df  -h|awk '{print $1}'
    (2) AWK以空格、冒号、 、分号为分割:
    awk -F '[ :	;]' '{print $1}'   jfedu.txt
    (3) AWK以冒号分割,打印第一列,同时将内容追加到/tmp/awk.log下:
    awk -F: '{print $1 >>"/tmp/awk.log"}' jfedu.txt
    (4) 打印jfedu.txt文件中的第3行至第5行,NR表示打印行,$0表示文本所有域:
    awk 'NR==3,NR==5 {print}'   jfedu.txt
    awk 'NR==3,NR==5 {print $0}'   jfedu.txt
    5) 打印jfedu.txt文件中的第3行至第5行的第一列与最后一列:
    awk 'NR==3,NR==5 {print $1,$NF}'   jfedu.txt
    6) 打印jfedu.txt文件中,长度大于80的行号:
    awk  'length($0)>80 {print NR}'     jfedu.txt
    7) AWK引用Shell变量,使用-v或者双引号+单引号即可:
    awk -v STR=hello '{print STR,$NF}'     jfedu.txt
    STR="hello";echo| awk '{print "'${STR}'";}'

     8) AWK以冒号切割,打印第一列同时只显示前5行:

    cat /etc/passwd|head -5|awk -F:   '{print $1}'
    awk -F: 'NR>=1&&NR<=5 {print $1}' /etc/passwd
    9) Awk指定文件jfedu.txt第一列的总和:
    cat jfedu.txt |awk '{sum+=$1}END{print sum}'
    10) AWK NR行号除以2余数为0则跳过该行,继续执行下一行,打印在屏幕:
    awk -F: 'NR%2==0 {next} {print NR,$1}' /etc/passwd
    11) AWK添加自定义字符:
    ifconfig eth0|grep "Bcast"|awk '{print "ip_"$2}'

     12) AWK与if组合实战,判断数字比较:

    echo 3 2 1 | awk '{ if(($1>$2)||($1>$3)) { print $2} else {print $1} }'

     13) AWK与数组组合实战,统计passwd文件用户数:

    awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i =
    0; i < NR; i++) print i, name[i]}' /etc/passwd

     14) awk分析Nginx访问日志的状态码404、502等错误信息页面,统计次数大于20的IP地址。

    awk '{if ($9~/502|499|500|503|404/) print $1,$9}' access.log|sort|uniq –c|sort –nr | awk '{if($1>20) print $2}'

     15) Awk统计服务器状态连接数:

    netstat -an | awk '/tcp/ {s[$NF]++} END {for(a in s) {print a,s[a]}}'
    netstat -an | awk '/tcp/ {print $NF}' | sort | uniq -c
  • 相关阅读:
    SP375 QTREE
    「2017 山东一轮集训 Day5」字符串 (后缀自动机, 拓扑排序)
    [SDOI2016]生成魔咒(后缀自动机)
    bzoj3252: 攻略(贪心)
    bzoj2961 共点圆 (CDQ分治, 凸包)
    [CTSC2012]熟悉的文章 (后缀自动机 单调队列)
    bzoj3622: 已经没有什么好害怕的了
    [SDOI2013]泉(容斥)
    [SHOI2012]信用卡凸包(计算几何)
    CF1139D Steps to One (莫比乌斯反演 期望dp)
  • 原文地址:https://www.cnblogs.com/nshgo/p/12157745.html
Copyright © 2011-2022 走看看