Shell

解析“ls -l”的輸出結果以獲取 QNX 上的使用者和組

  • August 13, 2021

我正在使用 QNX。

我有以下輸出ls -l

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

由此,我想用它sed來提取使用者和組,並將這些字元串放入 shell 變數中。

我無權訪問stat命令。

純sed

  1. 收集使用者名
user=$(ls -ld .| sed 's/^[dlLsStT+@rwx-]*[ 0-9]*\([^ ]*\).*$/\1/')
  1. 聚團名
group=$(ls -ld .| sed -e s/$user// -e 's/^[dlLsStT+@rwx-]*[ 0-9]*\([^ ]*\).*$/\1/')

在哪裡

  • 首先sed不需要-e作為只有一個命令
  • ^[dlLsStT+@rwx-]*[ 0-9]*擷取文件訪問和大小(您可能需要s為 socket/添加特殊文件cb
  • \([^ ]*\)匹配並記住使用者名/組名(當然其中沒有空格)
  • .*$剩下的線
  • \1回憶第一個記住的模式

筆記 :

  • 如果使用者是rwx(或任何匹配訪問位的組合),這將失敗
  • 正如 Stéphane Chazelas 指出的那樣,使用者名和組名的這種中繼是“正常的”。

如果您的 shell 是 POSIX 的,並且使用者名和組名不包含空格字元,則可以使用 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 -n代替,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影響 shelluser='the-user' group='the-group' || false程式碼(或user='o'\''connor'...例如) 。o'connor``ls false

引用自:https://unix.stackexchange.com/questions/664458