与えられた文字列を見つけた後、文字列「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

関連情報