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'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/')
    

どこ

  • まず、コマンドが1つだけなので、sed必要ありません。-e
  • ^[dlLsStT+@rwx-]*[ 0-9]*sファイルアクセスとサイズキャプチャ(socket /用の特別なファイルをc追加する必要があるかもしれません)b
  • \([^ ]*\)ユーザー/グループ名を一致させて覚えておいてください(もちろん空白なし)。
  • .*$残りの行
  • \1最初に覚えたパターンを思い出してください

メモ:

  • ユーザーrwx(または一致するアクセスビットの組み合わせ)が次の場合、失敗します。
  • Stéphane Chazelasが指摘したように、これらのユーザーとグループ名の転送は「正常」です。

関連情報