2013-07-01 60 views
1

下午好,發現不同的模式,AWK多字段分隔符|算上場

1.AWK多個字段分隔

我的第一個問題是,是否有2個的分離器分離器1一旦位於現場,我如何得到該領域內這不是第二個分離器的第一名?例如:

命令

zcat /home/technic/scripts/informe/datos/datos* \ 
| egrep -m1 "\|435\|t|\|0\|t"| grep ";CI[0-9]" \ 
| awk -F "[|;]" '{print $17}' 

**record $17 (FS="|")** 

2013-08-04;2013-08-10;CI6785,;HG=S;BD=S;AD=2,;NI=1,;SA,;TH,;HB=S;RG=S;PO=S;VI=S; 

我想CI6785,

還有就是爲什麼我需要做這種方式,因爲awk命令具有不同的過濾器大多非常具體的原因切「|」只有在某些情況下才能獲得「;」在同一個awk上。在現場發現

2.count不同的模式

這種情況希望有類似以下行爲:

{!a["ERR|"$3"|"$15]++ || !a["IPS|"$18]++ || !a["HTTPS|"$22]++}; 
for(i in a) print a[i]"|"i; 

--This返回找到各自不同的記錄的計數。

如果我這樣做:

zcat /home/technic/scripts/informe/datos/datos* \ 
| awk -F "|" --posix '!match($0,/([0-9]{2}:){2}/);{print substr($0, RSTART, RLENGTH)}' \ 
| sort | uniq -c 

我得到以下結果(一部分):

418 23:50: 
392 23:51: 
393 23:52: 
373 23:53: 
336 23:54: 
321 23:55: 
348 23:56: 
366 23:57: 
326 23:58: 
341 23:59: 

這基本上讓我發現,每分鐘的計數,現在我想做的事這是第一個例子,不必經過排序和uniq。

我需要這個工作才能添加另一個比較條款。

請大家讚賞!

忘了把整個AWK看到的景象:

for DATO in {1..3} 
do  
DATOS=$(zcat /home/technic/scripts/informe/datos/datos"$DATO"_"$AGENCIA".tmp.gz | grep "AG|$AGENCIA" | awk -F "|" --posix 'BEGIN \ 
    { \ 
     CI=0 ; CI5 =0; CI7 =0; CI10 =0; CI20 =0; \ 
     H=0 ; H5 =0; H7 =0; H10 =0; H20 =0; \ 
     A=0 ; A5 =0; A7 =0; A10 =0; A20 =0; \ 
     G=0 ; G5 =0; G7 =0; G10 =0; G20 =0; \ 
    } \ 

    {!a["ERR|"$3"|"$15]++ || !a["IPS|"$18]++ || !a["HTTPS|"$22]++}; \ 
    /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;CI[0-9]{1,}/ {CI++} ; \ 
    CI > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;CI[0-9]{1,}/ && $14 < 5000 {CI5++} ; \ 
    CI > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;CI[0-9]{1,}/ && $14 >= 5000 && $14 < 7000 {CI7++} ; \ 
    CI > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;CI[0-9]{1,}/ && $14 >=7000 && $14 < 10000 {CI10++} ; \ 
    CI > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;CI[0-9]{1,}/ && $14 >=10000&& $14 < 20000 {CI20++} ; \ 

    /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;H[0-9]{1,}/ {H++} \ 
    H > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;H[0-9]{1,}/ && $14 < 5000 {H5++} ; \ 
    H > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;H[0-9]{1,}/ && $14 >= 5000 && $14 < 7000 {H7++} ; \ 
    H > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;H[0-9]{1,}/ && $14 >=7000 && $14 < 10000 {H10++} ; \ 
    H > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;H[0-9]{1,}/ && $14 >=10000&& $14 < 20000 {H20++} ; \ 

    /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;A[0-9]{1,}/ {A++} \ 
    A > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;A[0-9]{1,}/ && $14 < 5000 {A5++} ; \ 
    A > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;A[0-9]{1,}/ && $14 >= 5000 && $14 < 7000 {A7++} ; \ 
    A > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;A[0-9]{1,}/ && $14 >=7000 && $14 < 10000 {A10++} ; \ 
    A > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;A[0-9]{1,}/ && $14 >=10000&& $14 < 20000 {A20++} ; \ 

    /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;G[0-9]{1,}/ {G++} \ 
    G > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;G[0-9]{1,}/ && $14 < 5000 {G5++} ; \ 
    G > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;G[0-9]{1,}/ && $14 >= 5000 && $14 < 7000 {G7++} ; \ 
    G > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;G[0-9]{1,}/ && $14 >=7000 && $14 < 10000 {G10++} ; \ 
    G > 0 && /\|GetAvail/ && /\|435\|t|\|0\|t/ && $17 ~ /;G[0-9]{1,}/ && $14 >=10000&& $14 < 20000 {G20++} ; \ 
    END { 
    if (CI > 0){ print "DISPOCI|"CI"|"CI5"|"(CI5*100/CI)"|"CI7"|"(CI7*100/CI)"|"CI10"|"(CI10*100/CI)"|"CI20"|"(CI20*100/CI); } \ 
    if (H > 0){ print "DISPOH|"H"|"H5"|"(H5*100/H)"|"H7"|"(H7*100/H)"|"H10"|"(H10*100/H)"|"H20"|"(H20*100/H); } \ 
    if (A > 0){ print "DISPOA|"A"|"A5"|"(A5*100/A)"|"A7"|"(A7*100/A)"|"A10"|"(A10*100/A)"|"A20"|"(A20*100/A); } \ 
    if (G > 0){ print "DISPOG|"G"|"G5"|"(G5*100/G)"|"G7"|"(G7*100/G)"|"G10"|"(G10*100/G)"|"G20"|"(G20*100/G); } \ 
    for(i in a) print a[i]"|"i; \ 
    }';)" " 
    echo ${DATOS[@]} | sed "s/[ ][ ]*/\n/g" | grep 'DISPO' 
    echo "todos los datos en array de dispos ++++++++++++++++++++++" 
for REC in $(echo ${DATOS[@]} | sed "s/[ ][ ]*/\n/g" | grep 'DISPO') 
do 
    echo $REC | awk -F "|" '{print $1}' 
    if [ -z ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} ];then 
     echo "no ha encontrado añado registro ++++++++++++++++++++++++" 
     DISPO[$(echo $REC | awk -F "|" '{print $1}')]=$(echo $REC | awk -F "|" '{print $2"|"$3"|"$4"|"$5"|"$6"|"$7"|"$8"|"$9"|"$10}') 
     echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]}"<----------------- valor dentro de array" 
    else 
     echo "na encontrado sumo registro ++++++++++++++++++++++++" 
     PARAM1=$(($(echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} | awk -F "|" '{print $1}') + $(echo $REC | awk -F "|" '{print $2}'))); echo "$PARAM1<------------parametro 1" 
     PARAM2=$(($(echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} | awk -F "|" '{print $2}') + $(echo $REC | awk -F "|" '{print $3}'))); echo "$PARAM2<------------parametro 2" 
     PARAM3=$(($(echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} | awk -F "|" '{print $4}') + $(echo $REC | awk -F "|" '{print 5}'))); echo "$PARAM3<------------parametro 3" 
     PARAM4=$(($(echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} | awk -F "|" '{print $6}') + $(echo $REC | awk -F "|" '{print $7}'))); echo "$PARAM4<------------parametro 4" 
     PARAM5=$(($(echo ${DISPO[$(echo $REC | awk -F "|" '{print $1}')]} | awk -F "|" '{print $8}') + $(echo $REC | awk -F "|" '{print $9}'))); echo "$PARAM5<------------parametro 5" 
     PORC1=$(echo "scale=2;($PARAM2*100)/$PARAM1" | bc);PORC2=$(echo "scale=2;($PARAM3*100)/$PARAM1" | bc);PORC3=$(echo "scale=2;($PARAM4*100)/$PARAM1" | bc);PORC4=$(echo "scale=2;($PARAM5*100)/$PARAM1" | bc) 
     DISPO[$(echo $REC | awk -F "|" '{print $1}')]="$PARAM1|$PARAM2|$PORC1|$PARAM3|$PORC2|$PARAM4|$PORC3|$PARAM5|$PORC4"       
    fi 
done 
for REC in $(echo ${DATOS[@]} | sed "s/[ ][ ]*/\n/g" | grep 'ERR|') 
do 
    echo "$REC" 
    echo "------- ERR -------" 
done 
for REC in $(echo ${DATOS[@]} | sed "s/[ ][ ]*/\n/g" | grep 'IPS|') 
do 
    echo "$REC" 
    echo "------- IPS -------" 
done  
for REC in $(echo ${DATOS[@]} | sed "s/[ ][ ]*/\n/g" | grep 'HTTPS|') 
do 
    echo "$REC" 
    echo "------- HTTPS -------" 
done   
done 

o_0budaya0_o

+0

你能張貼一些樣本輸入數據和你的期望輸出嗎? –

+0

確定每一行如下:Jun 30 12:34:53 intoas08/intoas08 20130630 12:34:53 | 172.16.18.88:7010 | GetAvailAccomAdvanced | 1 | AG | 3287398 | 8929338 | 1 | 783 | 336 | 18 | 372 | 7 | 375 | 0 | t69245 | 2013年8月22日; 2013年8月30日; CI11188; HG = S; BD = S; AD = 4,; NI = 0,; SA,; TH,; HB = S; RG = S; PO = S; VI = S; | 91.240.58.214 | XML | 13725884930057010932520 | TR0 | N | – budaya

回答

3

嘗試分裂場到一個數組:

... | awk -F"|" '{split($17,a,";"); print a[3]}' 
+0

好吧,我會嘗試這一個,我希望它也讓我計算不同的發現。當我嘗試計數模式或類似的時候,我得不到相同的結果!a [「ERR |」$ 3「|」$ 15] ++。我會嘗試這種鎖定到其他領域/模式,並希望它有幫助!謝謝! – budaya

3

分裂場爲子場,使用awk的分割功能:

要打印第二個主字段的第三個子字段,像41|2;3;4|5

echo '1|2;3;4|5' | awk -F'|' '{ split($2, array, /;/); print array[3]; }' 
+0

好吧,我會嘗試這一個,我希望它也讓我計算不同的發現。當我嘗試計數模式或類似的時候,我得不到相同的結果!a [「ERR |」$ 3「|」$ 15] ++。我會嘗試這種鎖定到其他領域/模式,並希望它有幫助!謝謝! – budaya

0

下午好,

非常感謝您對我們的支持它在某種程度上幫助了很多我終於結束了這是基於你的幫助的解決方案,這裏有雲解決方案對於任何有好奇心的人:

cat/xmllogs/logs/xml/stats。日誌| awk -F「|」 '/ GetAvail/& &/AG \ | 3857928/{split($ 17,b,「;」); !一個並[b [1]] ++}; END {for(i in a)print a [i]「|」i;}'

這可以讓您獲得對給定模式找到的不同值的計數。

乾杯thx!保重!

o_0budaya0_o