我知道这样的问题已经回答了好几次了,但我认为我的情况有点复杂。我有一个包含以下内容的输入文件:
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个数组中,例如user[]、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 ....
...
但我不知道如何有效地使用这个输出更重要的是,我需要确保如果日志文件包含意外的不一致性,例如AccountName和AccessType之间的一行ObjectName不知何故消失了,或者它的值丢失了,那么相关的数组元素会得到一个静态字符串,例如"error"。
/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];
}
}