Использование awk для анализа вывода lsuser AIX в формате строфы

Я создаю простой awk-скрипт для анализа данных lsuser -f ALL AIX и возврата в одну строку. Образец вывода – это что-то вроде этого.

 root: id=0 pgrp=something groups=something home=/ shell=/usr/bin/csh auditclasses=general login=true su=false - root: id=0 pgrp=something groups=something home=/ shell=/usr/bin/csh auditclasses=general login=true su=false - root: id=0 pgrp=something groups=something home=/ shell=/usr/bin/csh auditclasses=general login=true su=false 

Вот мой код:

 $1 ~ /[^=]:[ ]*$/ {sub(/:/,"",$1);printf $1" ";FS="="} $1 ~ /login/ {printf $2" "} $1 ~ /su/ {printf $2" "} $1 ~ /account_locked/ {printf $2" "} $1 ~ /time_last_login/ {print $2} 

Сценарий не работает с полями, которые не существуют для определенного идентификатора, такого как time_last_login потому что некоторые пользователи могут не войти в систему раньше. Пример ниже.

 root something ALL false 1360813178 **daemon staff ALL true sysadm1 something ALL false 1352015794** sysadm2 staff ALL true 1352015794 

Строка sysadm1 должна быть в новой строке. Как это исправить?

  • Как перечислить весь уникальный ip-адрес, который в настоящее время подключен к определенному порту?
  • Как я могу сопоставить строку, когда ей не предшествует цифра с помощью awk?
  • grep и добавить его в конец строки
  • AWK, Сумма категории
  • Сортировка столбцов из двух файлов с awk
  • Извлечь значение из другого столбца и заменить в другом столбце
  • Как извлечь строки между двумя шаблонами в одном столбце?
  • Идентификаторы соответствия и исходный исходный файл
  • One Solution collect form web for “Использование awk для анализа вывода lsuser AIX в формате строфы”

    Вы можете добавить переменную, например, user когда вы дойдете до user: line. Таким образом, если он установлен, напечатайте новую строку перед именем пользователя, иначе нет, и пропустите печать новой строки в time_last_login .

    Если одно или несколько полей могут отсутствовать, вы, вероятно, будете использовать массив и печатать после каждой итерации пользователя и добавлять END{} для последнего.

    Таким образом, вы можете напечатать, например, N/A для отсутствующих полей.

    В качестве альтернативы используйте массив для указания полей, которые вы хотите распечатать.

    Пример (с обоими):

     function prnt_user_data(arr, prnt) { printf("\nAlternative 1:\n") for (p in prnt) { printf("%s ", prnt[p] in arr ? arr[prnt[p]] : "N/A") } printf("\nAlternative 2:\n") printf(\ "%s %s %s %s\n", "user" in arr ? arr["user"] : "N/A", "su" in arr ? arr["su"] : "N/A", "account_locked" in arr ? arr["account_locked"] : "N/A", "time_last_login" in arr ? arr["time_last_login"] : "N/A" \ ); delete arr; } BEGIN { FS="=|[ \t]*" prnt_flds["01"]="user"; prnt_flds["02"]="su"; prnt_flds["03"]="account_locked"; prnt_flds["04"]="time_last_login"; } NF == 0 {next} NF == 3 { user_data[$2]=$3; } NF == 1 && /:[ ]*$/{ if("user" in user_data) prnt_user_data(user_data, prnt_flds) user_data["user"]=substr($1, 1, length($1) - 1); } END { if("user" in user_data) prnt_user_data(user_data, prnt_flds) } 
    Linux и Unix - лучшая ОС в мире.