zoukankan      html  css  js  c++  java
  • awk 循环过滤EPC脚本

    无处理中EPC过滤脚本
    #!/bin/bash
    
    if [ "$#" -lt 3 -o "$#" -gt 4 ];then
    #if [ "$#" -lt 3 ] || [ "$#" -gt 4 ];then
        echo -e "33[31;1mUSAGE UTF-8: $0 <邮件中的EPC巡检告警内容文件> [选择SN列,default=5]
     <导出的EPC列表文件>
     <过滤后要保存的文件名>033[0m"
        exit
    fi
    
    
    INPUT_FILE=$1
    #判断参数个数寻找对应文件
    if [ $# -eq 3 ];then
        INPUT_COLUMN=5
        TOTAL_DATA_FILE=$2
        OUTPUT_FILE=$3
        #源文件按照第六列降序排序,按照第五列去重
        sort -k 6 -r -k 5 -u ${INPUT_FILE} -o ${INPUT_FILE}
    elif [[ $# -eq 4  ]];then
        INPUT_COLUMN=$2
        TOTAL_DATA_FILE=$3
        OUTPUT_FILE=$4
    fi
    
    NOT_FOUND=0
    NOT_FOUND_FILE=${OUTPUT_FILE}.NotFound
    
    #查找前清空保存的文件
    > ${OUTPUT_FILE}
    
    for SN in $(awk '{print $'"$INPUT_COLUMN"'}' $INPUT_FILE)
    do
        # -F 定义分隔符 使用shell变量用 "'变量名'" 
        awk -F ',|"'  '/"'$SN'"/{ print $1,"=",$4,$6,$9 }'  $TOTAL_DATA_FILE >> $OUTPUT_FILE
        grep $SN ${TOTAL_DATA_FILE}   > /dev/null 2>&1
        if [ $? -ne 0 ];then 
             echo -e "33[31;1m$SN 33[0m" | tee -a $NOT_FOUND_FILE
             NOT_FOUND=$(($NOT_FOUND + 1))
        fi
    done
    
    #判断匹配数量
    search_count=`awk '{print $'"$INPUT_COLUMN"'}' $INPUT_FILE | wc -l`
    find_count=`cat ${OUTPUT_FILE}| wc -l`
    total_data_source=`cat ${TOTAL_DATA_FILE} | wc -l`
    
    
    if [ $search_count -eq $find_count ];then
        echo -e "33[32;1mAll searches found , Sum : ${search_count}    Please See ${OUTPUT_FILE} 33[0m"
    else
        echo -e "33[31;1mSearch Count:${search_count}; Found:${find_count} Please See ${OUTPUT_FILE}  NotFound:${NOT_FOUND} See ${NOT_FOUND_FILE}33[0m"
    fi
    echo -e "33[33;1m${TOTAL_DATA_FILE} Total data sources:${total_data_source}33[0m"
    
    
     

    有处理中搜索脚本

    #!/bin/bash
    
    if [ $# -lt 4  -o "$#" -gt 5 ];then
        echo -e "33[31;1mUSAGE UTF-8: $0 <邮件中的EPC巡检告警内容文件> [SN_COLUMN default=5]
     <控制台导出ECP列表文件> 
     <已提单的SN列表文件> 
     <过滤后要保存的新增SN文件名>033[0m"
        exit
    fi
    #定义输入文件
    INPUT_FILE=$1
    
    #判断参数个数寻找对应文件
    if [ $# -eq 4 ];then
        INPUT_COLUMN=5
        TOTAL_DATA_FILE=$2
        UNDER_REPAIR_FILE=$3
        OUTPUT_FILE=$4
        WARNING_TYPE_COLUMN=6
        #源文件第六列降序排列,按照第五列去重
        sort -k 6 -r -k 5 -u ${INPUT_FILE} -o ${INPUT_FILE}
        SNS=`awk '$8=="未处理" {print $'"$INPUT_COLUMN"'}' ${INPUT_FILE}`  #要查找的所有SN
    elif [ $# -eq 5  ];then
        INPUT_COLUMN=$2
        TOTAL_DATA_FILE=$3
        UNDER_REPAIR_FILE=$4
        OUTPUT_FILE=$5
        SNS=`awk '{print $'"$INPUT_COLUMN"'}' ${INPUT_FILE}`  #要查找的所有SN
    fi
    
    #初始化,清空目的文件,定义输出文件
    > ${OUTPUT_FILE}
    NOT_FOUND_FILE=${OUTPUT_FILE}.NotFound
    >${NOT_FOUND_FILE}
    already_exist=0
    NOT_FOUND=0
    
    
    #循环匹配找修理中和待报修的
    for SN in ${SNS}
    do
       # -F 定义分隔符 使用shell变量用 "'变量名'" 
       # 查找未报修的,已报修的文件中没有的才查找
       if [[ ! `grep $SN ${UNDER_REPAIR_FILE}` ]]; then
           WARNING_TYPE=`awk '/'"${SN}"'/{print $6}' ${INPUT_FILE}`
           awk -F ',|"'  '/"'$SN'"/{ print $1,"=",$4,"'${WARNING_TYPE}'",$6 }'  ${TOTAL_DATA_FILE} >> ${OUTPUT_FILE}
           
           #输出一下没有找到的!同时保存一份SN到文件
           grep $SN ${TOTAL_DATA_FILE}   > /dev/null 2>&1
           if [ $? -ne 0 ];then
                echo -e "33[31;1m$SN 33[0m" | tee -a $NOT_FOUND_FILE
                NOT_FOUND=$(($NOT_FOUND + 1))
           fi
    
       else
           #echo $already_exist
           already_exist=$(($already_exist + 1))
       fi
    done
    
    #判断匹配数量
    search_count=`awk '{print $'"$INPUT_COLUMN"'}' ${INPUT_FILE} | wc -l`
    new_search_count=`awk '$8=="未处理" {print $5}' ${INPUT_FILE}| wc -l`
    has_been_restored=`awk '$8=="已恢复" {print $5}' ${INPUT_FILE}| wc -l`
    find_new_count=`cat ${OUTPUT_FILE}| wc -l`
    find_all_count=$((${already_exist} + ${find_new_count}))
    total_data_source=`cat ${TOTAL_DATA_FILE} | wc -l`
    
    #将已报修的修理中的追加到新发现的里面
    if [[ ${find_new_count} -ne 0 ]];then
        echo "============Next-is-Under-Repairs-in-${UNDER_REPAIR_FILE}===========" >> ${OUTPUT_FILE}
        cat ${UNDER_REPAIR_FILE} >> ${OUTPUT_FILE}
    else
        cat ${UNDER_REPAIR_FILE} >> ${OUTPUT_FILE}
    fi
    
    #对结果进行总结输出,巡检已恢复的
    echo -e "33[32;1mrepaired:${has_been_restored}33[0m"
    
    #输出巡检未处理的搜索结果
    if [ $new_search_count -eq $find_all_count ];then
        echo -e "33[32;1mSearch Count:${search_count} All New searches found, Sum:${new_search_count}33[0m 
        033[33;1munder_repair:${already_exist}033[0m
        033[31;1mNewFound:$find_new_count  Please See ${OUTPUT_FILE} 033[0m"
    else 
        echo -e "33[31;1mSearch Count:${search_count},New searche Count:${new_search_count} Found: ${find_all_count}33[0m 
        033[33;1munder_repair:${already_exist}033[0m 
        033[31;1mNotFound:${NOT_FOUND} See ${NOT_FOUND_FILE}033[0m 
        033[32;1mNewFound:${find_new_count} Please See ${OUTPUT_FILE} 033[0m"
    fi
    echo -e "33[33;1m${TOTAL_DATA_FILE} Total data sources:${total_data_source}33[0m"

    查看历史修理记录

    #!/usr/bin/bash
    if [ $# -lt 2 -o $# -gt 3 ];then
        echo -e "33[31;1mUSAGE: $0 <历史维修记录文件> <新巡检告警的列表文件> <SN所在列数字>33[0m"
        exit
    fi
    
    MAINTENANCE_HISTORY_FILE=$1
    NEW_FAULT=$2
    
    #确定SN所在列
    if [ $# -eq 3 ];then
        SN_COLUMN=$3
    elif [ $# -eq 2 ];then
        SN_COLUMN=3
    fi
    
    SNS=`awk '{print $'"${SN_COLUMN}"'}' ${NEW_FAULT}`
    for SN in $SNS
    do
        grep ${SN} ${MAINTENANCE_HISTORY_FILE} > /dev/null 2>&1
        if [ $? -eq 0 ];then
            maintenance_history=`awk '/'"$SN"'/{print "",$4,"请重新确认!!!"}'  ${MAINTENANCE_HISTORY_FILE}`
            #echo  $maintenance_history
            sed -i '/'"${SN}"'/s/$/'"$maintenance_history"'/'  ${NEW_FAULT}
    
        fi
    done

    awk引用shell中变量的几种方法============================

    :"'$var'"

    这种写法大家无需改变用'括起awk程序的习惯,是老外常用的写法.如:

    for hostname in ${hostnames}; do awk -F ',|=|"' '$1=="'${hostname}'" {print $5}' epc-hosts-04.03-1936UTF-8.csv ;done
    var="test"
    awk 'BEGIN{print "'$var'"}'

    这种写法其实就是把一对单引号分成了两段单引号,中间的shell变量直接按照shell变量的引用方式即可,但是如果var中含空格,为了shell不把空格作为分格符,便应该如下使用:

    var="thisis a test"
    
    awk 'BEGIN{print "'"$var"'"}'    (也就是在shell变量的两边加上一对双引号即可)

    :export变量,使用ENVIRON["var"]形式, (ENVIRON为awk中的内置环境变量数组)

    :                                                                     

    var="thisis a test";export $var
    
    awk 'BEGIN{print ENVIRON["var"]}'

    :当然也可以使用-v选项

    :

    var="thisis a test"
    awk –v nvar="$var"  'BEGIN{print nvar}'

    这样便把系统变量定义成了awk变量.

    如果在awk是这种格式的话  awk  'script'  filename  也可以这样引用shell变量

    awk 'script' awkvar="shellvar" filename
    awk 'END{print awkvar}' awkvar="$shellvar" filename

    ============awk引用shell 变量END=================

  • 相关阅读:
    HA分布式集群二hive配置
    win下写任务提交给集群
    win10下将spark的程序提交给远程集群中运行
    Scala快学笔记(三)
    Scala快学笔记(二)
    Scala快学笔记(一)
    统计学习方法 三 kNN
    统计学习方法 二 感知机
    fluent python(一)
    Codewar (1)
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/12455216.html
Copyright © 2011-2022 走看看