awk를 사용하여 AIX의 lsuser 섹션 형식 출력 구문 분석

awk를 사용하여 AIX의 lsuser 섹션 형식 출력 구문 분석

나는 AIX의 lsuser -f ALL출력을 구문 분석하고 정보를 한 줄로 반환하기 위해 간단한 awk 스크립트를 만들고 있습니다. 샘플 출력은 다음과 같습니다.

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예를 들어 일부 사용자가 이전에 로그인하지 않았을 수 있기 때문에 일부 ID가 존재하지 않는 필드에서는 스크립트가 제대로 작동하지 않습니다 . 예는 다음과 같습니다.

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

sysadm1 라인은 새로운 라인으로 교체되어야 합니다. 어떻게 해결할 수 있나요?

답변1

user예를 들어 해당 라인에 도달하면 변수를 추가할 수 있습니다 user:. 그렇다면 만약사용자 이름 앞에 인쇄할 개행 문자를 설정합니다. 그렇지 않으면 인쇄되지 않고 다음 개행 문자를 건너뜁니다 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)
}

관련 정보