Быстрый скрипт awk для получения подстроки / строки, которую мы хотели

ORDER EVENT .........[] [] ... so many other tags... [Account<25106>=ACCT1] [Destination...] .. so many other tags. 

В настоящее время я пытаюсь получить такую ​​учетную запись. Я попытался использовать совпадение в awk, но это выглядит медленнее. Можете ли вы предложить что-нибудь еще, кроме того, что ниже, которое еще быстрее?

 j = index($0, "<25106>="); account=substr($0, j + accountTagLength); account=substr(account,1,index(account, "]") - 1); 

Учетная запись не является вторым полем, а полевое поле меня меняется.

Тайминги:

 bash-3.2$ time head -1000000 temp.log | awk -F'<25106>=' '{print $2}' | sed -e 's/].*//' > /dev/null real 0m2.410s user 0m2.782s sys 0m0.319s bash-3.2$ time head -1000000 temp.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m1.690s user 0m1.737s sys 0m0.448s bash-3.2$ time head -1000000 temp.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m1.588s user 0m1.733s sys 0m0.179s bash-3.2$ time head -1000000 temp.log | awk -F'<25106>=' '{print $2}' | sed -e 's/].*//' > /dev/null real 0m2.384s user 0m2.762s sys 0m0.272s bash-3.2$ time head -1000000 temp.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m1.703s user 0m1.709s sys 0m0.484s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | gawk 'match($0, /<25106>=([^]]+)/, ary) {account = ary[1]}' real 0m3.449s user 0m3.661s sys 0m0.290s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | gawk 'match($0, /<25106>=([^]]+)/, ary) {account = ary[1]}' real 0m3.410s user 0m3.551s sys 0m0.236s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | gawk 'match($0, /<25106>=([^]]+)/, ary) {account = ary[1]}' real 0m3.361s user 0m3.487s sys 0m0.286s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m1.626s user 0m1.831s sys 0m0.263s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | awk -F '<25106>=' '{split($2, ary, /\]/); account = ary[1]}' real 0m2.721s user 0m2.808s sys 0m0.265s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | awk -F '<25106>=' '{split($2, ary, /\]/); account = ary[1]}' real 0m2.787s user 0m2.863s sys 0m0.516s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | awk -F '<25106>=' '{split($2, ary, /\]/); account = ary[1]}' real 0m2.724s user 0m2.882s sys 0m0.278s bash-3.2$ time head -1000000 dumper/cam_verbose.20120220.000.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m1.576s user 0m1.748s sys 0m0.235s bash-3.2$ time head -100000 ORDER_EVENTS_CHAS_20120224.log | grep -oE '<25106>=([A-Za-z0-9]*)+' | cut -d= -f2 > /dev/null real 0m2.098s user 0m2.131s sys 0m0.033s bash-3.2$ time head -100000 ORDER_EVENTS_CHAS_20120224.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); print substr(account,1,index(account, "]") - 1);} }' > /dev/null real 0m0.253s user 0m0.275s sys 0m0.040s bash-3.2$ time head -100000 ORDER_EVENTS_CHAS_20120224.log | grep -oE '<25106>=([A-Za-z0-9]*)+' | cut -d= -f2 > /dev/null real 0m2.070s user 0m2.105s sys 0m0.034s bash-3.2$ time head -100000 ORDER_EVENTS_CHAS_20120224.log | grep -oE '<25106>=([A-Za-z0-9]*)+' > /dev/null real 0m2.065s user 0m2.090s sys 0m0.037s bash-3.2$ time head -1000000 ORDER_EVENTS_CHAS_20120228.log | awk -F'<25106>=' '{ substr($2,0,index($2,"]")-1);}' real 0m3.426s user 0m3.637s sys 0m0.412s bash-3.2$ time head -1000000 ORDER_EVENTS_CHAS_20120228.log | awk -F'<25106>=' '{ substr($2,0,index($2,"]")-1);}' real 0m3.463s user 0m3.603s sys 0m0.408s bash-3.2$ time head -1000000 ORDER_EVENTS_CHAS_20120228.log | awk '{j = index($0, "25106>="); if (j > 0) { account=substr($0, j + 7); substr(account,1,index(account, "]") - 1);} }' real 0m2.247s user 0m2.307s sys 0m0.649s 

Попробуй это:

 awk -F'<25106>=' '{print substr($2,0,index($2,"]")-1);}' 

Не использовать регулярное выражение, просто строгие строковые операции.

Если у вас есть GNU awk ( gawk ), вы можете использовать функцию match() с скобками:

 gawk 'match($0, /<25106>=([^]]+)/, ary) {account = ary[1]}' 

В качестве альтернативы вы можете использовать сложный разделитель полей:

 awk -F '<25106>=' '{split($2, ary, /\]/); account = ary[1]}' 

Если вы напечатаете только этот номер, вы можете попробовать следующее:

 echo "ORDER EVENT ......... [Account<25106>=ACCT1]" | awk -F'<25106>=' '{print $2}' | sed -e 's/].*//' 

EDIT: sed-единственное решение:

 echo "ORDER EVENT ......... [Account<25106>=ACCT1]" | sed -e 's/.*25106>=//' -e 's/].*//' 

EDIT2:

 awk '{if (split($0, a, "25106>=") > 1) {print substr(a[2], 0, index(a[2], "]")-1)} }'