「カット」ID出力

「カット」ID出力

idコマンドの出力を3つの部分に「切り取る」スクリプトを作成する必要があります。たとえば、

idが次のような出力を提供すると仮定します。uid=12345(mylogin) gid=100(users)

私のスクリプトは次のように出力する必要があります。

Login: mylogin
Id: 12345
Group: users

答え1

あえて分析しないでください。 POSIX必要idこれを自動化するために、さまざまなオプションがサポートされています。

printf "Login: %s\nId: %s\nGroup: %s\n" "$(id -un)" "$(id -u)" "$(id -gn)"

より多くの作業が必要になるだけでなく、idロケール依存出力を生成するオプションも許可されていないため、解析も複雑です。

LC_MESSAGES ロケール・クラスが POSIX ロケールを指定する場合は、次の形式を使用する必要があります。他のロケールでは、uid、gid、euid、egid、およびgroups文字列をロケールに対応するより適切な文字列に置き換えることができます。

最も合理的な解析ツールでこの問題を処理できますが、Unicodeをサポートしていないツールは問題を引き起こす可能性があります。

答え2

複数文字フィールド区切り記号の使用awk

$ echo 'uid=12345(mylogin) gid=100(users)' | awk -F'[=()]' '{print "Login: " $3 "\nId: " $2 "\nGroup: " $6}'
Login: mylogin
Id: 12345
Group: users
  • -F'[=()]'=またはフィールド区切り記号(として設定)
  • $3最初のフィールドの後の3番目のフィールドになり、=最初のフィールド(で終わります)。このように、我々は価値を得る。mylogin
  • 他のフィールドは同じで、必要に応じて印刷されます。

答え3

1つのアプローチは次のとおりです。

# 0 |  1  |   2   |  3 | 4 |  5  |
#uid=12345(mylogin) gid=100(users)
IFS='(=)' read -a A <<<"$(id)"
printf '%s: %s\n' Login "${A[2]}" Id "${A[1]}" Group "${A[5]}"
# remember array A indexing begins at 0.

答え4

文字通り以下を使用してくださいcut

echo Login: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f1)
echo Id: $(id | cut -d ' ' -f1 | cut -d= -f2 | cut -d '(' -f2 | cut -d  ')' -f1)
echo Group: $(id | cut -d ' ' -f2 | cut -d '(' -f2 | cut -d ')' -f1)

関連情報