2016-05-27 1 views
-1

Я знаю, что на такие вопросы были даны ответы несколько раз, но я считаю, что мой случай немного сложнее. У меня есть файл ввода, содержащий это:Bash: заполнение нескольких массивов из файла на соответствие строке

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 массива, например. пользователи [], объекты [], типы []. Мне не нужно заботиться о нерелевантных линиях. Решение должно быть элегантным и быстрым. Сначала я подумал, что попробую что-нибудь вроде

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

Можете ли вы рассказать нам, что вы планируете делать с этими массивами bash? Возможно, было бы проще сделать все в awk и вообще пропустить bash в зависимости от того, какую дальнейшую обработку вам нужно делать с этими значениями. Кроме того, вы упомянули конкретный случай, который необходимо обработать (неожиданное пропущенное значение). Важно включить такие случаи в ваш образец ввода! – jas

+0

Спасибо за ваш комментарий! Целью массивов является создание нескольких сложных статистических данных для каждого пользователя, поэтому я определенно нуждаюсь в этих массивах. – zulumare

ответ

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]; 
    } 
} 
+0

Perfect. Я не знал об этом КОНЕЦ в awk. Благодарю. – zulumare

Смежные вопросы