QNXからユーザーとグループを取得するために、「ls -l」の出力を解析します。

QNXからユーザーとグループを取得するために、「ls -l」の出力を解析します。

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 -nof を使用すると、必要に応じて十分な 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' || falseuser='o'\''connor'...o'connorls false

おすすめ記事