Использование 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 должна быть в новой строке. Как это исправить?

  • Как переносить значения, разделенные запятыми, на следующую строку, не нарушая другие поля, используя awk или ksh
  • Как добавить имя, дату и размер жесткого диска
  • Вытяните несколько строк данных из 2 столбцов в нескольких местах
  • Как заменить пользовательскую строку даты в текстовом файле
  • Как запустить grep в одном столбце?
  • Сопоставление столбцов и их замещение
  • Удалите несколько запятых из определенного столбца файла с разделителями табуляции и распечатайте слова на новой строке
  • Извлечение значений из блока данных
  • 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) } 
    Interesting Posts

    Почему мой скрипт оболочки висит на `apt-get -y upgrade`?

    Локальная сеть без использования протокола IP в Linux

    Нет звука в проигрывателе webex в вине

    Вторая сессия записывается на диск BD-R с использованием -Z-флаг growisofs вместо -M. Можно ли сделать первый сеанс видимым?

    Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?

    Переименование файлов с расширением нижнего регистра с «переименованием»

    Диаграмма ядра Linux против производительности?

    GPG зависает при доступе к закрытым ключам

    grep: специальный символ +

    Сделайте «меньше» точку перехода в центр результата поиска, а не вверх

    Самый легкий SMTP-сервер для одиночного компьютера Linux (SBC)

    Команда ls не работает для каталога с огромным количеством файлов

    Как изменить эти правила iptables, чтобы связать HTTP-трафик с моим VPN-соединением?

    не может sudo mv libtinfo.so.5.bak libtinfo.so.5

    Размер изображения с gscan2pdf и ImageMagick `convert` bloat

    Linux и Unix - лучшая ОС в мире.