다음은 내 샘플 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