QNXを使用しています。
私は次のような結果を得ましたls -l
。
drwxr-xr-x 2 root root 4096 Jul 26 2021 bin
sed
ここからユーザーとグループを抽出し、この文字列をシェル変数に入れたいと思います。
stat
コマンドにアクセスできません。
答え1
シェルがPOSIXシェルで、ユーザー名とグループ名にスペース文字が含まれていない場合は、分割+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
of を使用すると、必要に応じて十分な uid と gid をls -l
取得できます。$user
$group
を使用すると、出力の最初の行を解析し、変数を設定するシェルコードを生成するsed
ために使用できます。ls
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' || false
user='o'\''connor'...
o'connor
ls
false
答え2
純粋な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/')
どこ
- まず、コマンドが1つだけなので、
sed
必要ありません。-e
^[dlLsStT+@rwx-]*[ 0-9]*
s
ファイルアクセスとサイズキャプチャ(socket /用の特別なファイルをc
追加する必要があるかもしれません)b
\([^ ]*\)
ユーザー/グループ名を一致させて覚えておいてください(もちろん空白なし)。.*$
残りの行\1
最初に覚えたパターンを思い出してください
メモ:
- ユーザー
rwx
(または一致するアクセスビットの組み合わせ)が次の場合、失敗します。 - Stéphane Chazelasが指摘したように、これらのユーザーとグループ名の転送は「正常」です。