下午好,
1.AWK多个字段分隔符
我的第一个问题是,是否有两个字段分隔符曾经位于分隔符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;
- 这将返回找到的每个不同记录的计数。
如果我这样做:
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 :(得分:3)
尝试将字段拆分为数组:
... | awk -F"|" '{split($17,a,";"); print a[3]}'
答案 1 :(得分:3)
将字段拆分为子字段,使用awk的拆分函数:
要打印第二个主要字段中的第三个子字段,例如4
中的1|2;3;4|5
:
echo '1|2;3;4|5' | awk -F'|' '{ split($2, array, /;/); print array[3]; }'
答案 2 :(得分:0)
下午好,
非常感谢你的支持,它以某种方式为我提供了很多帮助,最后得到了基于你的帮助的解决方案,这里的解决方案适合任何有好奇心的人:
cat /xmllogs/logs/xml/stats.log | awk -F“|” '/ GetAvail /&amp;&amp; / AG \ | 3857928 / {split($ 17,b,“;”); !一个并[b [1]] ++}; END {for(i in a)print a [i]“|”i;}'
这允许您获得针对给定模式找到的不同值的计数。
干杯!小心!
o_0budaya0_o