解析“ls -l”的输出结果以获取 QNX 上的用户和组

解析“ls -l”的输出结果以获取 QNX 上的用户和组

我正在使用QNX。

我有以下输出ls -l

drwxr-xr-x   2 root      root           4096 Jul 26  2021 bin

由此,我想用来sed提取用户和组,并将这些字符串放入 shell 变量中。

我无权访问stat命令。

答案1

如果您的 shell 是 POSIX shell,并且用户名和组名不包含空格字符,则可以使用 split+glob 运算符(当您在列表上下文中不加引号地保留参数扩展、命令替换或算术扩展时隐式调用):

IFS=' ' # split on space only
set -o noglob # disable the glob part
output=$(LC_ALL=C ls -Lld bin) || exit # exit if bin can't be stat()ed.

set -- $output # split+glob $output and assign result to positional parameters

mode=$1 # could also contain +, @... to specify system-dependent extra
        # information such as the presence of ACLs or extended attributes

links=$2 user=$3 group=$4 size=$5

如果您不能保证用户名和组名不包含空格字符,您可以使用ls -nof 来代替ls -l,然后您将获得 uid 和 gid $user$group这可能足以满足您的需求。

使用sed,您可以使用它来解析 输出的第一行ls并生成设置变量的 shell 代码:

get_credentials() {
  eval "$(
    sp=' \{1,\}' nsp='[^ ]\{1,\}'
    LC_ALL=C ls -Lld -- "${1?}" |
      LC_ALL=C sed -n "
        /^$nsp$sp$nsp$sp\($nsp\)$sp\($nsp\).*$/ {
          s//\1 \2/
          s/'/'\\\\''/g
          s/\($nsp\) \($nsp\)/user='\1' group='\2' ||/p
        }
        q"
    ) false"
}

用作:

get_credentials bin || exit
printf 'The %s name is: "%s"\n' user  "$user" \
                                group "$group"

如果可以从输出的第一行提取用户名和组名,则这将eval评估user='the-user' group='the-group' || falseshell 代码(或者user='o'\''connor'...例如),否则。o'connorlsfalse

答案2

纯sed

  1. 收集用户名

    user=$(ls -ld .| sed 's/^[dlLsStT+@rwx-]*[ 0-9]*\([^ ]*\).*$/\1/')
    
  2. 收集组名

    group=$(ls -ld .| sed -e s/$user// -e 's/^[dlLsStT+@rwx-]*[ 0-9]*\([^ ]*\).*$/\1/')
    

在哪里

  • 首先sed不需要-e因为只有一个命令
  • ^[dlLsStT+@rwx-]*[ 0-9]*捕获文件访问和大小(您可能需要s为 socket/c添加b特殊文件)
  • \([^ ]*\)匹配并记住用户名/组名(当然其中不带空格)
  • .*$其余线
  • \1回忆起第一个记住的模式

笔记 :

  • 如果用户rwx(或任何匹配访问位的组合),这将失败
  • 正如 Stéphane Chazelas 指出的那样,这种对用户名和组名的转发是“正常的”。

相关内容