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

어디

  • 먼저 명령이 하나뿐이므로 sed필요가 없습니다.-e
  • ^[dlLsStT+@rwx-]*[ 0-9]*s파일 액세스 및 크기 캡처( socket/에 대한 특수 파일을 c추가 해야 할 수도 있음 )b
  • \([^ ]*\)사용자/그룹 이름을 일치시키고 기억합니다(물론 공백 없이).
  • .*$남은 줄
  • \1처음 기억된 패턴을 기억해 보세요

노트:

  • 사용자 rwx(또는 일치하는 액세스 비트의 조합)가 다음과 같은 경우에는 실패합니다.
  • Stéphane Chazelas가 지적했듯이 이러한 사용자 및 그룹 이름 전달은 "정상"입니다.

관련 정보