zoukankan      html  css  js  c++  java
  • 运维脚本格式,三剑客

    一:脚本
    shell的功能
    *命令行的解释功能
    *启动程序
    *输入输出重定向
    *管道连接
    *文件名置换(echo /")
    *变量维护
    *环境控制
    *shell编程


    1.数字比较运算
    -eq 等于
    -gt 大于
    -lt 小于
    -ge 大于或等于
    -le 小于或等于
    -ne 不等于

    2.简单测试安装nginx
    #!/bin/bash
    yum -y install wget gcc pcre-devel zlib-devel
    wget http://nginx.org/download/nginx-1.20.1.tar.gz
    tar -xf nginx-1.20.1.tar.gz
    cd nginx-1.20.1
    ./configure --prefix=/usr/local/nginx
    make -j 1
    make install
    可利用率不高

    3.转义字符(常用)
    \a 发出警告声
    \n 换行且光标移至行首
    \t 插入tab
    \b 删除前一个字符


    4.read命令
    默认接受键盘的输入,回车符代表输入结束
    read命令选项
    -p 打印信息
    -t 限定时间
    -s 不回显
    -n 输入字符个数

    5.变量
    本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile, .bashrc文件中
    全局变量:所有用户都可以使用,保存在/etc/profile,/etc/bashrc文件中
    用户自定义变量:用户自定义,比如脚本中的变量

    定义变量:
    变量格式:命名只能使用英文,数字,下划线。首个字符不能以数字开头
    中间不能有空格,可以使用下划线
    不能使用标点符号
    不能使用bash里的关键字
    注意:字符串要用单引号或双引号引起来

    全局变量:export


    6.数组
    数组可以让用户一次性赋予多个值,需要读取的时候只需要调用一下
    方法1:
    array0[0]='tom'
    array0[1]='jarry'
    array0[2]='natasha'
    方法2:
    #array2=(tom jack alice)
    #array3=('cat /etc/passwd')
    #array4=('cat /var/ftp/Shell/for')

    定义关联数组
    申明关联数组变量


    7.if判断
    shell中的五大运算


    1)数学运算
    -eq 等于
    -gt 大于
    -lt 小于
    -ge 大于或等于
    -le 小于或等于
    -ne 不等于


    2)字符串比较运算
    运算符解释,注意字符串一定别忘了使用引号引起来
    == 等于
    != 不等于
    -n 检查字符串的长度是否大于0
    -z 检查字符串的长度是否为0


    3)文件比较与检查
    -d 检查文件是否存在且为目录
    -e 检查文件是否存在
    -f 检查文件是否存在且为文件
    -r 检查文件是否存在且可读
    -s 检查文件是否存在且不为空
    -w 检查文件是否存在且可写
    -x 检查文件是否存在且可执行
    -o 检查文件是否存在且被当前用户拥有
    -G 检查文件是否存在且默认组为当前组
    file1 -nt file2 检查file1是否比file2新
    file1 -ot file2 检查file1是否比file2旧


    4)逻辑运算
    逻辑与运算 &&
    逻辑或运算 ||
    逻辑非运算 |


    5)赋值运算
    = 赋值运算符

    if语法一:
    格式:
    if [ 条件 ];
      then
    fi
    例子:
    #!/bin/bash
    if [ ! -d /tmp/abc ];then !是取反的意思
            mkdir -v /tmp/abc
            echo "123"
            echo "create /tmp/abc OK!!!"
    fi


    if语法二:
    if-then-else
    格式:
    if [ 条件 ]
    then
    执行1
           else
    执行2
    fi

    例子:
    #!/bin/bash
    if [ $USER == 'root' ]
        then
                echo "管理员,你好"
                else
    echo "对不起,你没有权限"
    fi


    if语法三:
    if-then-elif
    格式:
    if [ 条件1 ]
    then
    执行1
    elif [ 条件2 ]
    then
    执行2
    .......
    else
    执行3
    fi
    例子1:(嵌套):(嵌套)
    #!/bin/bash
    if [ $1 -eq $2 ]
        then
               echo "$1=$2"
    else
        if [ $1 -gt $2 ]
                then
                       echo "$1>$2"
                else
                       echo "$1<$2"
        fi
    fi

    例子2:(多步if)
    #!/bin/bash
    if [ $1 -gt $2 ]
       then
              echo "$1>$2"
    elif [ $1 -eq $2 ]
              then
                      echo "$1=$2"
          else [ $1 -lt $2 ]
                      echo "$1<$2"
    fi

    例子3:
    用[[ ... ]]测试结构比用[ ... ]更能防止脚本里的许多逻辑错误。比如说,&&,||,<和>操作符能在一个[[]]测试里通过,但在[]结构会发生错误。
    for i in aa1 aa2 aa3 oo cc
    do
    if [[ $i == a* ]];then
             echo "$i"
    else
             echo "不匹配"
    fi
    done


    for循环语句
    #1直接赋值
    for i in 1 2 3 4 5 6 7 8 9

    #2使用命令赋值
    for i in ·seq 1 9·

    #3赋值是一个字符串
    for i in baism\'s is cool, baism\'s is nice
       do
              echo "输出:$i"
    done


    语法格式一:
    for i in 数据1 数据2 数据3
    do
    执行条件
    done
    例子:
    #!/bin/bash
    for i in `seq 1 9`
       do
            echo $i
    done

    语法格式二:
    "C格式语法"
    for ((变量;条件;自增减运算))
    do
    代码块
    done
    例子:
    #!/bin/bash
    for (( a=0,b=9;a<10;a++,b-- ))
       do
              echo $a $b
    done

    "多变量"
    for (( n=10,m=0;n>0,m<10;n--,m++ ))
         do
                echo -e "$n\t$m"
    done


    循环控制语句
    1)sleep N 脚本执行到该步休眠几秒
    #!/bin/bash
    echo "倒计时:"
    for i in `seq 9 -1 1`
      do
              echo -n -e "\b$i"
              sleep 1
    done

    时间取值:date +"%F %H:%M:%S"

    一直循环
    #!/bin/bash
    for ((;;))
        do
                ping -c 2 $1 &>/dev/null
    if [ $? -eq 0 ]
        then
                 echo "`date +"%F %H:%M:%S"` : $1 is UP"
    else
                 echo "`date +"%F %H:%M:%S"` : $1 is DOWN"
    fi
    sleep 5
    done

    3)continue跳过循环中的某次循环
    #!/bin/bash
    for ((i=1;i<10;i++))
        do
           if [ $i -eq 5 ]
                then
                continue
           else
             echo $i
           fi
    done

    4)break跳出循环继续执行后续代码
    #!/bin/bash
    for i in `seq 1 9`
        do
                echo $i
         if [ $i -eq 5 ]
                then
                break
         fi
    done

    break终止本循环
    #!/bin/bash
    for ((;;))
        do
               read -p "char: " ch
        if [ $ch == "Q" ]
               then
               break
        else
               echo "你输入的字符是:$ch"
         fi
    done


    5)while循环
    格式:
    while [ 条件 ]
    do
    执行
    done

    例子:
    #!/bin/bash
    read -p "money: " money
    read -p "car: " car_num
    read -p "house: " house

    while [ $money -lt 1000000 ] || [ $car_num -lt 1 ] || [ $house -lt 1 ]
    do
           echo "不行"
           read -p "money: " money
           read -p "car: " car_num
           read -p "house: " house
    done

           echo "OK!"

    6)while循环控制与语句嵌套
    #1,嵌套 if for while
    #2,循环控制sleep break continue
    #!/bin/bash
    i=0
    while [ $i -lt 10 ]
             do
                  i=$((i+1))
             if [ $i -eq 5 ];then
                  continue
              fi
                   if [ $i -eq 10 ];then
                          break
                   else
                          echo $i
                   fi
    done

    #!/bin/bash
    case $1 in
    [0-9])
              echo "match number."
    ;;
    [a-z])
               echo "match letter."
    ;;
    '-h'|'--help')
               echo "help"
    ;;
    *)
               echo "Input error!"
               exit
    esac
    模式支持的正则有:*、?、[ ]、[.-.]、|

    debug的调试
    debug方法
    sh -x 显示脚本执行的过程,解决80-95%
    set命令设置开始debug和结束debug的位置 显示脚本支持过程,解决复杂脚本故障
    # sh -x 开始debug,从这里开始显示脚本详细执行过程
    # sh +x 结束debug,从这里开始结束显示脚本详细执行过程


    运维三剑客
    命令 特点 场景
    1.grep 过滤 grep命令过滤速度是最快的
    2.sed 替换,修改文件内容,取行 如果替换或者修改内容,取出某个范围的内容(早上10点到11点)
    3.awk 取列 取列,对比>= <= != > < 统计,计算(awk数组 )

    一:grep

    选项 含义
    -E ==egrep 支持扩展正则
    -A 了解,after-A5 匹配你要的内容并且显示接下来的5行
    -B 了解,before-B 匹配你要的内容并且显示接上面的5行
    -C 了解,context 上下-C5匹配你要的内容并且上下5行
    -c 统计出现了多少行,类似wc -l
    -v 取反,排除(行)
    -n 显示行号
    -i 忽略大小写
    -w 精确匹配

    匹配一些有规律的东西:手机号,身份证号,匹配日志
    正则表达式
    使用一些符号表达重复出现,大小写,开头/结尾含义

    应用场景
    正则表达式 Linux python golang等
    应用场景 过滤有规律的内容,日志

    正则注意事项:
    1.所有的符号都必须是英文
    2.正则通过grep来学习,grep加上单引号
    3.给grep egrep 加上颜色 alias grep='grep --color=auto' alias egrep='egrep --color=auto'
    4.注意系统字符集:en_US.UTF-8(大部分情况90%没问题),如果出现问题就修改字符集为C export LANG=C
    5.快速掌握正则,需要配合grep -o 参数学习

    正则符号
    基础正则 ^ $ ^$ . * .* [a-z] [^abc]
    扩展正则 + | {} ?()

    正则VS通配符
    分类 目标用途 支持的命令=
    正则 高级语言,进行过滤(匹配字符) grep,sed,awk,find,rename(ubuntu),expr
    通配符 匹配文件(文件名)*.txt *.log Linux大部分命令都支持

    基础正则
    grep -A [文件名字]
    [root@node1 ~]# cat -n -A file.txt
    1 I no linux.$
    2 my blog jugikhk ugh , kijp ball and chess!$
    3 $
    4 I like nall!$
    5 my log is http://guh.kig.com$
    6 curl qq is http://qq.teten.com$

    1) ^ 以...开头的行
    [root@node1 ~]# grep '^my' file.txt
    my blog jugikhk ugh , kijp ball and chess!
    my log is http://guh.kig.com
    my god, i am not but HFJYJYGU!

    2) $ 以...结尾的行
    [root@node1 ~]# grep 'com$' file.txt
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com

    3) ^$ 空行(这一行没有任何内容) 一般都是排除文件空行所用
    [root@node1 ~]# grep -v '^$' file.txt -v 选项用来实现反选匹配
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com
    not qq is 56565656
    my god, i am not but HFJYJYGU!
    gh fsh edfc f de

    4). 表示任意一个字
    注意: .不匹配空行
    [root@node1 ~]# grep '.' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com
    not qq is 56565656
    my god, i am not but HFJYJYGU!
    gh fsh edfc f de

    5)\ 转义字符,去除原有特殊含义
    匹配出文件中以‘.’结尾的行
    [root@node1 ~]# grep '.$' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com
    not qq is 56565656
    my god, i am not but HFJYJYGU!
    gh fsh edfc f de
    [root@node1 ~]# grep '\.$' file.txt
    I no linux.

    转义字符:
    \n 回车换行
    \t tab键

    6)* 前一个字符连续出现0次或0次以上
    连续出现:0(出现一次)00(出现两次)00000(出现五次) file(字母出现了六次)
    [root@node1 ~]# grep '0*' file.txt

    7).* 表示所有内容,任何内容,任意内容
    整体记忆 .*表示所有即可(包括空行)
    了解:.任意一个字符+*前一个字符连续出现0次或0次以上
    [root@node1 ~]# grep '^.*t' file.txt
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com
    not qq is 56565656
    my god, i am not but HFJYJYGU!
    正则特色:正则表达式的贪婪性,.*表示所有或*连续出现的时候,匹配到最后一个

    8) [] [abc] 1次匹配1个字符,匹配任何一个字符(a或b或c)
    [root@node1 ~]# grep '[a-b]' file.txt
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my god, i am not but HFJYJYGU!

    匹配字母大小写加数字
    [root@node1 ~]# grep '[a-Z0-9]' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my log is http://guh.kig.com
    curl qq is http://qq.teten.com
    not qq is 56565656
    my god, i am not but HFJYJYGU!
    gh fsh edfc f de

    排除文件中含有空行或#号的行
    # egrep -v '^$|#' file.txt

    匹配符 说明
    . 匹配除回车以外的任意字符
    () 字符串分组
    [] 定义字符类,匹配括号中的一个字符
    [^] 表示否定括号中出现字符类中的字符,取反
    \ 转义字符
    | 或者

    限定符 说明
    * 某个字符之后加*号表示该字符不出现或多次出现
    ? 与星号相似,表示该字符出现一次或不出现
    + 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
    {n,m} 某个字符之后出现,表示该字符最少n次,最多m次
    {m} 正好出现了m次

    特殊字符 说明
    [:alnum:] 匹配任意字母字符0-9 a-z A-Z
    [:alpha:] 匹配人以字母,大写或小写
    [:digit:] 数字 0-9
    [:graph:] 非空字符(非空格控制字符)
    [:lower:] 小写字符a-z
    [:upper:] 大写字符A-Z
    [:cntrl:] 控制字符
    [:print:] 非空字符(包括空格)
    [:punct:] 标点符号
    [:blank:] 空格和TAB字符
    [:xdigit:] 16进制数字
    [:space:] 所有空白字符(新行,空格,制表符)
    例子:egrep "^ro[[:alnum:]]" /etc/passwd

    二:sed命令
    1.特点及格式
    sed 流编辑器,sed把处理的内容(文件)可以一直处理到文件末尾
    sed 格式
    命令 选项 (s)sed命令功能(g)修饰符 参数(文件)
    sed -r 's#file#oldgirl#g'支持扩展正则 file.txt
    -n 显示行数

    2.sed核心功能(增删改查)
    1)
    s 替换
    p 显示print
    d 删除delete
    cai 增加c/a/i

    2)sed执行过程
    找谁:你要找谁
    干啥:增删改查
    [root@node1 ~]# sed -n '2p' file.txt #-n(选项)显示行数 '2'指第二行 'p'显示出来(sed功能)
    my blog jugikhk ugh , kijp ball and chess!

    3)sed-查找p
    查找格式
    '2p' 指定行查找
    '1,5p' 指定行号范围进行查找
    '/lidao/p' 类似于grep过滤,//里面可以写正则
    '/10:00/,/22:00/p' 表示范围的过滤
    [root@node1 ~]# sed -n '1,4p' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!

    I like nall!

    4)实际生产环境日志
    sed -n '/2021-11-19 10:/,/2021-11-19 16:36:22/p' app-shop-console.log 正式环境日志过滤范围

    5)sed-删除(只是不显示,并不是真的删除)
    d delete
    查找格式
    '2d' 指定行号进行查找
    '1,5d' 指定行号范围进行查找
    '/dfg/d' 类似于grep过滤,//里面可以写正则
    '/10:00/,/11:00/d' 表示范围的过滤
    1,/das/d 混合(了解)

    删除文件中的空行和包含#号的行
    [root@node1 ~]# sed -r '/^$|#/d' /etc/ssh/sshd_config
    [root@node1 ~]# sed -nr '/^$|#/!p' /etc/ssh/sshd_config

    6)sed-增加c/a/i
    命令 含义
    c replace替代这行的内容
    a append追加,向指定的行或每一行追加内容(行后面)>>
    i insert插入,向指定的行或每一行插入内容(行前面)
    [root@node1 ~]# cat file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    my log is http://guh.kig.com

    [root@node1 ~]# sed '3a996,ld996,ufo' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    I like nall!
    996,ld996,ufo
    my log is http://guh.kig.com

    [root@node1 ~]# sed '3i996,ld996,ufo' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    996,ld996,ufo
    I like nall!
    my log is http://guh.kig.com

    [root@node1 ~]# sed '3c996,ld996,ufo' file.txt
    I no linux.
    my blog jugikhk ugh , kijp ball and chess!
    996,ld996,ufo
    my log is http://guh.kig.com

    案例:
    向文件中追加多行内容
    方法1:
    [root@node1 ~]# cat >>config<<'EOF'
    > userDNS NO
    > GOUSPER YES
    > permitrootlogin no
    > GSSAPIAUTCATION no
    > EOF
    方法2:
    [root@node1 ~]# sed '$a userDNS NO\GOUSPER YES\permitrootlogin no\GSSAPIAUTCATION no' config

    7)sed-替换 s
    s sub substitute 替换
    替换格式
    s###g
    s///g
    [root@node1 ~]# cat config
    101 userDNS NO
    102 GOUSPER YES
    111 permitrootlogin no
    123 GSSAPIAUTCATION no
    [root@node1 ~]# sed 's/[0-9]//g' config 将开头的数字替换为空
    userDNS NO
    GOUSPER YES
    permitrootlogin no
    GSSAPIAUTCATION no

    后向引用,反向引用
    先保护,在使用
    [root@node1 ~]# echo 123456 | sed -r 's/(34)/<\1>/g' #先用()将34保护起来,\1就等于小括号里面的内容(\1=34),然后加上<>将34套上
    12<34>56

    [root@node1 ~]# echo file_lidao | sed -r 's/(^.*)_(.*)/\2_\1/g' #相当于()是打标记,按照顺序重新排列第一个()是\1 第二个()是\2
    lidao_file

    或者这样:
    [root@node1 ~]# echo file_lidao | sed -r 's/([a-z]+)_([a-z]+)/\2_\1/g'
    lidao_file

    截取IP
    [root@node1 ~]# ip a s ens33 | sed -n '/inet/p' | sed -n '1p' | sed -r 's#(^.*t )(.*)(/.*)#\2#g'
    截取数字
    [root@node1 ~]# stat /etc/hosts | sed -rn '4s#(^.*\(0)(.*)(/-.*)#0\2#gp'


    三:awk
    1.特点与应用场景
    awk
    一门语言,类似C语言
    过滤,计算,统计
    过滤,日志

    2.执行过程
    awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}' file
    说明:
    -F, 后面加分隔 如果有特殊符号/ * |等,就用''括起来 例子:awk -F '/'
    BEGIN{print "name"} 这是开头添加
    END{print "end of file"} 这是结尾添加
    {print $2} 这是以...分隔,然后根据顺序选取位置
    file 这是文件名

    3.行与列
    名词 awk叫法 说明
    行 记录record 每一行默认是通过回车分割
    列 字段,域field 每一列默认是通过空格分割
    awk中行和列结束标记都是可以修改的

    1)取行
    awk
    NR==1 取出某一行
    NR>=1&&NR<=5 取出1到5行
    符号 > < >= <= == !=
    [root@node1 ~]# awk 'NR>=1&&NR<=5' file.txt 取出文件中1-5行内容
    [root@node1 ~]# awk '/yy/' file.txt 取出文件中带'yy'这一行

    2)取列
    -F 指定分隔符 指定每一列结束标记(默认是空格,连续的空格,tab键)
    $数字 取出某一列,注意:在awk中($+内容)只有一个意思 表示取出某一列
    [root@node1 ~]# ll | awk '{print $1}'
    $0 表示整行的内容
    [root@node1 ~]# ll | awk 'NR==2 {print $0}' 取出第二行整行内容
    [root@node1 ~]# ll | awk '{print $5,$9}' | column -t 取出第5到第9列,column -t:取出的数值对齐
    [root@node1 ~]# awk -F ':' '{print $1,$NF}' /etc/passwd | column -t 取出第一列和最后一列
    [root@node1 ~]# awk -F ':' -vOFS==: '{print $NF,$2,$3,$4,$5,$1}' /etc/passwd 将最后一行和第一行互换,并且输出分割符 ':',如果指定多个分隔符,则用"[]"双引号隔开
    [root@node1 ~]# ip a s ens33 | awk -F "[ /]+" 'NR==3{print $3}' 指定多个分隔符,则用"[]"双引号隔开

    常用的awk条件
    内置变量 含义
    NR Number of Record行号
    NF Number of Field每行有多个字段(列) $NF表示最后一列
    FS -F 指定分隔符,可一个可两个,默认为空格,支持扩展正则
    OFS 输出字段分隔符

    3)awk模式匹配
    例子:awk -F "[ /]+" 'NR==3{print $3}'
    awk -F "[ /]+" NR==3{print $3}
    命令 选项 条件(动作),模式

    [root@node1 ~]# sed -n '/20\/Nov\/2021:17/,/20\/Nov\/2021:17/p' access.log | awk '{print $1}' | sort | uniq -c | more | awk '$1>=100'

    支持的模式:
    比较符号:> < >= <= == !=
    正则表达式
    //支持扩展正则
    awk可以精确到某一行,某一列中包含(不包含)的内容
    ~ 包含
    !~ 不包含
    [root@node1 ~]# awk -F ':' '$3~/^1/' /etc/passwd ':' '$3~/^1/' 以:为分隔符,第三列包含以1开头的行
    [root@node1 ~]# awk -F: '$3~/^1/{print $1,$3,$NF}' /etc/passwd 找出第三列以2开头的行并显示出第一列,第三列和最后一列
    [root@node1 ~]# awk -F: '$3~/^1|^2/{print $1,$3,$NF}' /etc/passwd 找出第三列以2开头或者以1开头的行并显示出第一列,第三列和最后一列
    范围表达式

    特殊条件:BEGIN和END
    模式 含义 应用场景
    BEGIN 里面的内容会在awk读物文件之前执行 1)进行简单统计,计算,不涉及读取文件
    2)用来处理文件之前,添加表头
    3)用来定义awk变量(很少用,可用-v实现)
    END 里面的内容会在awk读物文件之后执行 1)awk进行统计,一般过程:先进行计算,最后END里面输出结果
    2)awk使用数组,用来输出数组结果

    END{}统计计算
    统计方法
    i++ i=i+1 计数,统计次数
    sum=sum+??? sum+=? 求和,累加
    注意:i,sum都是变量

    #统计/etc/services 里面有多少空行
    [root@node1 ~]# awk '/^$/{i++}END{print i}' /etc/services
    #计算1+2...+100,求和
    [root@node1 ~]# seq 100 | awk '{sum=sum+$1}END{print sum}'

    4.awk数组
    统计日志:类似于
    统计次数:统计每个IP出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者IP出现次数
    累加求和:统计每个IP消耗的流量

    shell数组 awk
    形式 array[0]=shuzu0 array[1]=shuzu1 array[0]=shuzu0 array[1]=shuzu1
    使用 echo $(array[0]) $(array[1]) print array[0] array[1]
    批量输出数组内容 for i in ${array[*]}; for(i in array) awk数组专用循环,变量获取到的是数组的下标,数组内容是a[i]
    do print a[i]
    echo $i
    done
    例子:awk字母会被识别为变量,而数字不会,输出字母时要用双引号引起来
    [root@node1 ~]# awk 'BEGIN{a[0]="shuzu";a[1]=123456;print a[0],a[1]}'
    shuzu 123456
    [root@node1 ~]# awk 'BEGIN{a[0]="shuzu";a[1]=123456;for (i in a) print a[i]}'
    shuzu
    123456

    案例:
    处理一下文件内容,将域名取出并根据域名计数排序处理
    http://www.zhang.com/a/index.html
    http://www.zhang.com/b/index.html
    http://mp3.zhang.com/a/index.html
    http://wfo.zhang.com/a/index.html
    http://host.zhang.com/a/index.html
    http://port.zhang.com/a/index.html
    [root@node1 ~]# awk -F'[/.]+' '{print $2}' url.txt 以/.为分割,取出域名前缀
    www
    www
    mp3
    wfo
    host
    port
    [root@node1 ~]# awk -F"[/.]+" '{a[$2]++}END{for(i in a)print i,a[i]}' url.txt | sort -rnk2 ++代表统计 sort -rnk2多次到少的排列
    www 2
    wfo 1
    host 1
    mp3 1
    port 1
    说明:a[]++你要统计什么 []里面就是什么(某一列)
    统计access.log中ip出现次数 a[$1]++

    [root@node1 ~]# awk '$9~/[0-9][0-9][0-9]/{array[$9]++}END{for(i in array)print i,array[i]}' access.log | sort -rnk2
    说明:统计access.log的访问状态码,使用awk统计日志,尽量精确匹配


    6)for循环
    for i in 1 2 3
    do
    echo $i
    done

    shell编程c语言for循环 awk for循环
    for ((i=1;i<=10;i++)) for (i=1;i<=10;i++) awk for用来循环每个字段
    do print i
    echo $i
    done
    案例:1+100
    [root@node1 ~]# awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}'

    7)判断
    shell if判断(单分支) awk if
    if ["test" -eq 18];then if (条件)
    echo biye print biye
    fi

    (双分支)
    if ["test" -eq 18];then if (条件)
    echo biye print biye
    else else
    echo shangxue print shangxue

    判断磁盘空间
    [root@node1 ~]# df -h | awk -F "[ %]+" 'NR>1{if($5>5)print $1,$5,$NF,"不足"}'     说明:NR>1$5>5比较数值,一般设为80
    /dev/mapper/centos-root 8 / 不足
    /dev/sda1 19 /boot 不足

    [root@node1 ~]# echo kljuh kj | awk '{print length($1)}' 统计出字母数字,length($1)是awk函数,统计字符个数
    [root@node1 ~]# echo kigu hj pljo ljojo lihj | awk -F ' ' '{for (i=1;i<=NF;i++) if(length($i)<3)print $i}'
    hj
    说明:统计字符个数小于3的字符串


    参考视频:https://www.bilibili.com/video/BV1Kg411g7bC?p=41&spm_id_from=pageDriver

    awk '{split($4,array,"[");if(array[2]>="23/Nov/2021:00:00:00" && array[2]<="23/Nov/2021:23:59:59" ){print $0}}' xxxxx.xxxx.cn.log | awk '{print $1}'| sort -n | uniq -c | sort -rn | egrep -v "xx.xx.xx.x|x.xx.xx.xxx|x.xx.xxx.xxx" | awk '$1>20000 {print $1 $2}'

     sed -n '/23\/Nov\/2021/,/23\/Nov\/2021/p' gateway.cs08.cn.log | awk '{print $1}' | sort | uniq -c | more | awk '$1>=20000' |  egrep -v "47.99.212.2|8.210.231.103|192.168.130.115" 

  • 相关阅读:
    问题-[DelphiXE2]提示第三控件不存在
    问题-[DelphiXE2]编译程序体积大的问题
    问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?
    问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
    问题-[Delphi]通过Map文件查找内存地址出错代码所在行
    问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
    问题-[DelphiXE7]新建的安桌模拟器运行程序闪退
    问题-[Delphi]用LoadLibrary加载DLL时返回0的错误
    问题-[Access]“无法打开工作组信息文件中的表 'MSysAccounts'”的问题的解决方法
    教程-Delphi 调用控制面板设置功能
  • 原文地址:https://www.cnblogs.com/zgqbky/p/15597379.html
Copyright © 2011-2022 走看看