我需要编写一个脚本,将 id 命令的输出“剪切”成三个部分。例如:
假设 id 给出了这个输出: uid=12345(mylogin) gid=100(users)
我的脚本应该像这样输出它:
Login: mylogin
Id: 12345
Group: users
Run Code Online (Sandbox Code Playgroud)
Kev*_*vin 17
不要费心去解析它。POSIX需要的是id
支持不同的选项来自动执行此操作:
printf "Login: %s\nId: %s\nGroup: %s\n" "$(id -un)" "$(id -u)" "$(id -gn)"
Run Code Online (Sandbox Code Playgroud)
除了需要更多的工作之外,解析也很复杂,因为id
不允许使用任何选项来生成依赖于语言环境的输出:
当 LC_MESSAGES 语言环境类别指定 POSIX 语言环境时,应使用以下格式。在其他语言环境中,字符串 uid、gid、euid、egid 和组可以替换为与语言环境相对应的更合适的字符串。
虽然大多数合理的解析工具都可以解决这个问题,但任何不支持 Unicode 的东西都可能有问题。
在中使用多字符字段分隔符 awk
$ echo 'uid=12345(mylogin) gid=100(users)' | awk -F'[=()]' '{print "Login: " $3 "\nId: " $2 "\nGroup: " $6}'
Login: mylogin
Id: 12345
Group: users
Run Code Online (Sandbox Code Playgroud)
-F'[=()]'
设置=
或(
或)
作为字段分隔符$3
将是第三个字段,在第一个=
和第一个(
以)
. 所以它得到了价值mylogin
小智 8
一种方法可以是:
# 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.
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1304 次 |
最近记录: |