“切割”id 输出

“切割”id 输出

我需要编写一个脚本,将 id 命令的输出“切割”为三部分。例如:

假设 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'[=()]'设置=or()作为字段分隔符
  • $3将是第一个字段之后的第三个字段,=第一个字段(以 终止)。这样就得到了值mylogin
  • 其他字段同样,按要求打印

答案3

一种方法可以是:

# 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)

相关内容