1. 程式人生 > >shell與awk的指令碼運用(三)

shell與awk的指令碼運用(三)

要求:取出log中最後以GG結尾,並且下一行的ip欄位是否包含aaaa,這兩行必須是同一個人,然後將這兩行的指定資訊輸出到最終檔案中。

 

 

#!/bin/bash
#指令碼宣告

file=`ls *.LOG`
#列出所有log檔案
a=0
#定義變數a的值為0,待會作為下一行的行號

for log in $file
#迴圈每一個log檔案
do
#進入迴圈
   line_num=`awk 'END{print NR}' $log`
   #獲取當前log檔案最後一行的行號
   for i in `seq $line_num`
   #迴圈每一行,從第一行開始
   do
   #進入迴圈
      a=$(expr $i + 1) 
      #a的值為當前行號加1,也就是下一行的行號
      zuihou=`cat $log|awk -v bl=$i -F'|' 'NR==bl{print $15}'`
      #定義當前行的最後一個值
      ip=`cat $log|awk -v bl=$i -F'|' 'NR==bl{print $12}'|awk -F':' '{print $3}'`
      #定義當前行的ip
      name=`cat $log|awk -v bl=$i -F'|' 'NR==bl{print $6}'`
      #定義當前行的姓名值
      input_line_1=`cat $log|awk -v bl=$i -F'|' 'NR==bl{print $6,$7}'`
      #定義待會要輸入到最終檔案的資訊

      if [[ $zuihou -eq GG ]];then
        #判斷當前行的最後一個值是不是等於GG

        if [[ $ip != "aaaa" ]];then
           #如果是,再判斷ip那一列是不是沒有aaaa
           next_line=`cat $log|awk -v bl=$a 'NR==bl{print $0}'`
           #定義當前行的下一行的整行資料
           input_line_2=`cat $log|awk -v bl=$a -F'|' 'NR==bl{print $6,$7}'`
           #定義下一行要輸出到最終檔案的資料
           name_2=`cat $log|awk -v bl=$a -F'|' 'NR==bl{print $6}'`
           #定義下一行的姓名值
       value=`echo $next_line|grep 'aaaa'`    
           #定義當前行是否包含aaaa,如果是輸出的整行,如果不是則是空值   

           if [[ ! $value ]];then
           # 進行判斷,判斷value是不是空值
                echo $next_line
                #輸出下一行整行(用來檢查指令碼有誤問題)
            echo 'pass................'
                #輸出pass,結束判斷
           elif [[ $name == $name_2 ]];then
           #如果不是空值,判斷當前行和下一行的姓名是否一樣
                echo "input................."
                #輸出input,然後開始寫入
                echo $i >> /tmp/test/zuizhong.txt
                #輸出行號到zuizhong.txt檔案中,用來檢查指令碼是否正常
                echo $input_line_1 >> /tmp/test/zuizhong.txt
                #輸出當前行所需欄位到zuizhong.txt中
                echo $input_line_2 >> /tmp/test/zuizhong.txt
                #輸出下一行所需欄位到zuizhong.txt中
           fi
           #結束判斷
      fi
      #結束判斷
    fi
    #結束判斷
   done
   #本次迴圈完成
done
#迴圈完成