Usando o awk para analisar a saída do lsuser do AIX no formato de sub-rotina

1

Estou criando um script awk simples para analisar a saída lsuser -f ALL do AIX e retornar informações em uma linha. Uma amostra da saída é algo assim.

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

Aqui está o meu código até agora: -

$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}

O script não funciona bem com campos que não existem para determinados IDs, como time_last_login , porque alguns usuários podem não ter efetuado login antes. Exemplo conforme abaixo.

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

A linha sysadm1 deve estar em uma nova linha. Como faço para corrigir isso?

    
por AbdulSiddiq 05.05.2013 / 16:03

1 resposta

1

Você pode adicionar uma variável, por exemplo user quando chegar à linha user: . portanto se for , imprima uma nova linha antes do nome do usuário, senão, e pule a impressão da nova linha em time_last_login .

Se um ou mais campos estiverem faltando, você provavelmente usaria um array e imprimiria após cada iteração do usuário e adicionaria um END{} para o último.

Dessa forma, você pode imprimir, por exemplo N/A para campos ausentes.

Como alternativa, use uma matriz para especificar quais campos você deseja imprimir.

Exemplo (com ambos):

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)
}
    
por 05.05.2013 / 18:11