私がやっていることにsedソリューションが必要です。/etc/passwd
AIXユーザーID(ユーザー名)に基づいてファイルから名前を抽出する必要があります。これまで私はこれを持っていますが、うまくいきません。可能なすべてのソリューションを高く評価します。
sed "/^Ravi02/s/\(^.\{21\}\).\([a-zA-Z]\{50\}\)/\1/p" /export/home/Ravi02/passwd
以下は、passwdファイルのいくつかの例のエントリです。
Jose01:!:49030:49082:Freeman, Joseph III:/export/home/p1jxf01:/bin/ksh
Ravi02:!:37242:1580:Dronavalli, Ravi:/export/home/j1rxd02:/bin/ksh
Beny01:!:49335:49040:Young, Ben:/export/home/p1bmy01:/bin/ksh
IDに基づいて名前を抽出する必要があります。 IDが「Jose01」の場合は「Freeman、Joseph III」を取得し、IDが「Ravi02」の場合は「Dronavalli、Ravi」をインポートする必要があります。
答え1
ファイルは区切りファイルpasswd
です:
。したがって、最初のフィールドは常にユーザー名などです。
(注:man 5 passwd
説明フィールド)。
この場合、ユーザー名が与えられると、GECOS フィールドが必要です。
これできる完了しましたが、sed
他のツールがより良いかもしれません。 awk
簡単に:
awk -F: '$1 == "Ravi02" { print $5 }' /etc/passwd
答え2
標準sed
ソリューションは
sed -n '/^Ravi02:/s/^[^:]*:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'
少し簡単にすることができます
sed -n 's/^Ravi02:[^:]*:[^:]*:[^:]*:\([^:]*\):[^:]*:[^:]*$/\1/p'
ポイントはコロン(:
.\{21\}
)とコロンを使用して文字()と文字()を計算するのではなく、特に完全名フィールドでコンマ()やスペースなどの文字を[a-zA-Z]\{50\}
一致させることができるからです。,
私のシステムでは、次のバリエーションも機能します。
sed -n '/^Ravi02:/s/^\([^:]*:\)\{4\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
sed -n 's/^Ravi02:\([^:]*:\)\{3\}\([^:]*\)\(:[^:]*\)\{2\}$/\2/p'
sed -nE '/^Ravi02:/s/^([^:]*:){4}([^:]*)(:[^:]*){2}$/\2/p'
sed -nE 's/^Ravi02:([^:]*:){3}([^:]*)(:[^:]*){2}$/\2/p'
ただし、すべてのシステム(AIXなど)ですべて機能しているかどうかはわかりません。