我需要编写一个脚本,将 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)