ユーザー名に基づいて/etc/passwdからgecosを抽出するsedソリューション

ユーザー名に基づいて/etc/passwdからgecosを抽出するsedソリューション

私がやっていることにsedソリューションが必要です。/etc/passwdAIXユーザー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など)ですべて機能しているかどうかはわかりません。

関連情報