以下は私のサンプル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