Bash:在匹配

时间:2016-05-27 14:24:34

标签: arrays bash awk

我知道这些问题已被多次回答,但我相信我的情况有点复杂。我有一个输入文件包含:

 blabla bla
 TimeGenerated 13:13:13
 some text
 some more text
 AccountName Joe
 bla bla
 ObjectName d:\dir\
 AccessType 0x444
 bla text
 blabla bla
 TimeGenerated 13:13:15
 some text
...

等等,重复相似的模式。 我的任务是将AccountNames,ObjectNames和AccessTypes变量收集到3个数组中,例如users [],objects [],types []。我不需要关心无关紧要的线条。解决方案必须优雅而快速。首先我想我会尝试像

这样的东西
while read line;do
 if [[ "$line" == 'AccountName*' ]] ... then put that into array...
 if [[ "$line" == 'ObjectName*' ]] ...  then put that into array...

但我认为这太难看了。必须有一个更好的方法。我正想着一些快速的闪电

 awk '/AccountName/ {print $2}' logfile  ....
   ...

但我不知道如何有效地使用此输出。 更多,我需要确保日志文件包含意外的不一致,例如一个ObjectName行以某种方式从AccountName和AccessType之间消失或者其值丢失,相关的数组元素获得一个静态字符串,例如“错误”。

1 个答案:

答案 0 :(得分:1)

/AccountName/ { count++; user[count] = $2; object[count] = "error"; type[count] = "error" }
/ObjectName/ { object[count] = $2 }
/AccessType/ { type[count] = $2 }

END {
    for (i = 1; i <= count; i++) {
        print user[i], object[i], type[i];
    }
}