Shell
解析“ls -l”的輸出結果以獲取 QNX 上的使用者和組
我正在使用 QNX。
我有以下輸出
ls -l
:drwxr-xr-x 2 root root 4096 Jul 26 2021 bin
由此,我想用它
sed
來提取使用者和組,並將這些字元串放入 shell 變數中。我無權訪問
stat
命令。
純sed
- 收集使用者名
user=$(ls -ld .| sed 's/^[dlLsStT+@rwx-]*[ 0-9]*\([^ ]*\).*$/\1/')
- 聚團名
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 指出的那樣,使用者名和組名的這種中繼是“正常的”。
如果您的 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