주어진 문자열을 찾은 후 문자열 "PWD"의 후속 발생을 검색합니다.

주어진 문자열을 찾은 후 문자열 "PWD"의 후속 발생을 검색합니다.

다음은 내 샘플 test.log 파일입니다.

export SQRDIR=/v/orahome/Middleware/Oracle/bin64


 
export OID=ap0092

export PWD=pass1

export FDPWD=pass1

export AP0085_PWD=pass1

export SVR=AFFPROD

export TWO_TASK=db01

 

export EF_OID=AP0093

export EF_PWD=pass2

 

export CCC_PER_OID=CCC_JAS

export CCC_PER_PWD=pass3

 

export CAN_PER_OID=CAN_JAS

export CAN_PER_PWD=pass4

 

###################################################

사용자 입력 이 ap0092입력 후에는 검색 문자열이 처음 발생한 후 처음으로 나타나는 PWD를 검색해야 합니다.=ap0092

따라서 원하는 출력은 다음과 같습니다.pass1

마찬가지로 CCC_JAS원하는 출력은 다음과 같습니다.pass3

Solaris 운영 체제용 솔루션이 필요합니다.

[비Solaris의 경우] 다음 행을 가져오지만 grep -A 1원하는 행이 다음 행이 아닌 경우 검색하는 방법을 모릅니다.

export OID=ap0092참고: 사이에 여러 줄 또는 흰색 줄이 있을 수 있습니다.

export PWD=pass1

제안해주세요.

답변1

가능한:

#! /bin/sh -
oid="${1?No OID specified}"
file=/path/to/your/file.log

die() {
  printf>&2 '%s\n' "$@"
  exit 1
}

password=$(
  OID=$oid perl -ne '
    if (/^export (\w+_)?OID=(.*)$/) {
      $prefix = $1 if $right_oid = $2 eq $ENV{OID};
    } elsif ($right_oid && /^export ${prefix}PWD=(.*)$/) {
      print "$1\n"; $found = 1; exit
    }
    END {exit !$found}' < "$file"
) || die "No password found for $oid"

printf '%s\n' "The password for $oid is $password"

Solaris 10 이하의 경우 POSIX 쉘은 아니지만 여전히 이전 SysV 쉘에 있으므로 또는로 교체 #! /bin/sh하십시오 .#! /usr/xpg4/bin/sh#! /bin/ksh/bin/sh

관련 정보