下面是我的示例 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 操作系统的解决方案。
我正在grep -A 1
[对于非 Solaris] 获取下一行,但不知道如何搜索所需的行是否不是下一行。
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 或更早版本上,请替换#! /bin/sh
为#! /usr/xpg4/bin/sh
或#! /bin/ksh
,因为/bin/sh
当时不是 POSIX shell,但仍在旧的 SysV shell 上。