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)