2

から/etc/passwd、「ユーザー」の部分だけが必要です。

例:

backup:x:34:34:backup:/var/backups:/bin/sh

ユーザーとして持っbackupています。

私が今これを使用しているユーザー部分を抽出するために:

perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd

これは私の古い方法よりも数文字少ないです:

while read line; do echo ${line%%:*}; done < /etc/passwd

しかし、それはやり過ぎのように聞こえます。書くべきテキストはたくさんあります。

グーグル検索は私に与えます:

awk -F  ':' '{print $1}' < /etc/passwd

これは同等だと思いますか?それは...ですか?

cmp <(perl -pe 's/^(.*?):.*/\1/g' < /etc/passwd) <(awk -F  ':' '{print $1}' < /etc/passwd)

これを行うための標準のUNIXツールまたはperlを使用したより簡単な方法はありますか?またはcut

私は初心者です。

ところで、私は次のようにPythonで手を試しましたが、私はそれを吸います、Pythonでこれを行うためのより良い方法があるかもしれません:(

python -c 'print "\n".join([u[:u.find(":")] for u in open("/etc/passwd")])'

編集:実際には、Pythonの場合はおそらくこのようになります:

python -c 'print "\n".join([u.split(":")[0] for u in open("/etc/passwd")])'

うーん...まだ非常に冗長です。

4

4 に答える 4

6
perl -F: -lane 'print $F[0]' < /etc/passwd

ソリューションが行うことは何もawkしません。-a入力の各行をフィールドに分割-F:することを意味します。これ:は、フィールド区切り文字であることを意味します。そして、-l入力の各行に対して改行を出力するので、言う必要はありませんprint "$F[0]\n"

あなたがそれを要求したので、cut解決策はさらに簡単です:

cut -d: -f1 < /etc/passwd

意味:分割して:、最初のフィールドを出力します。

于 2012-09-04T03:13:52.340 に答える
6

個人的には、awkソリューションを使用します。カットは機能しますが、柔軟性が十分でないことがよくあります。

awk -F: '{print $1}' /etc/passwd

または、より一般的には、を使用しますgetent passwd。これにより、で構成されているすべてのユーザーDBソースが照会されます。これは/etc/nsswitch.conf、リモートLDAPサーバー(および)のようなものである可能性があります/etc/passwd

getent passwd | awk -F: '{print $1}'

bashのみのソリューションが必要な場合は、これを行うことができます。見た目は奇妙ですが、外部コマンドは呼び出されません。フィールド間区切り文字を設定すると、分割する文字がわかります$IFSread最後の< /etc/passwdリダイレクトは、ループ全体で有効になります。

while IFS=: read USER _; do
    echo "$USER"
done < /etc/passwd

$IFSこのように設定すると、コマンドにのみ影響しreadます。通常、変数の割り当てはコマンドの前に置くことができ、それらはそのコマンドに対してのみ有効になります。例:

$ FOO=foo
$ echo $FOO
foo
$ FOO=bar true
$ echo $FOO
foo

だから、めちゃくちゃの心配はありません$IFS。)

于 2012-09-04T03:21:44.827 に答える
1

Perlには、これを行うためのビルトインが用意されています:getpwent

endpwent(); # reset to beginning of file in case some other code has read some entries already
while ( my ($username) = getpwent() ) { 
    print "user: $username\n";
}
endpwent();

getpwuidとgetpwnamを使用して、特定の名前またはIDを検索できます。3つのget関数はすべて、1行のすべての標準フィールドのリストを返します。

于 2012-09-04T05:09:32.843 に答える
1

必要なのがユーザー名だけの場合は、 `id'コマンドで十分であり、はるかに簡単です。

USER=`id -un`

パスワードファイルエントリの他の部分については、上記のオプションのいずれかを引き続き使用します。

于 2012-09-10T18:22:15.723 に答える