一致後に空白の有無にかかわらず値を取得するには?

一致後に空白の有無にかかわらず値を取得するには?

データベース名セットを使用して各データベース名に接続し、それに対してストアドプロシージャを実行するbashスクリプトがあります。ストアドプロシージャの出力から値を取得し、スクリプトの残りの部分で使用する必要があります。ほとんどの出力は次のとおりです。

  CONDBAT= 10000 MDBAT= 400 ADBAT= 143 QUEDBAT= 167924 INADBAT= 0  

その後、一部のデータベースの出力が空白なしで異なることを確認しました。

  CONDBAT=4000 MDBAT=1200 ADBAT=263 QUEDBAT=7924 INADBAT=0  

QUEDBATの後に値を取得し、変数として保存する必要があります。私の問題は、両方の出力の値を取得できないことです。私は多くのコマンドを試しました。たとえば、

  grep -Eo 'QUEDBAT=([[:space:]]+[^[:space:]]+){1}'
  grep -vE -e 'QUEDBAT=[[:space:]]{4}' -e '^[^[:space:]]*$'
  grep -oP '(?<=QUEDBAT\=)(\s+)?\K([^ ]*)'  

ただし、両方の出力の値は返されません。スペースを無視してQUEDBATの後に値を取得するには?

1 つのスクリプトにはすべてのデータベースからのすべての出力が必要なため、個別のスクリプトを作成することはできません。ストアドプロシージャを実行するたびに値が変わるため、各セクションの値が3桁か4桁かどうかはわかりません。また、時には出力順序が同じではないため、 との間=のコンテンツも取得できません。ADBAT

答え1

+はい1つ以上。あなたはしなければ*なりません0以上:

grep -Po '\bQUEDBAT=\s*\K\d+'

または:

pcregrep -o1 '\bQUEDBAT=\s*(\d+)'

または、移植性のために実際のエントリ(P上記の/ represents)を使用します。pperl

perl -lne 'print $1 while /\bQUEDBAT=\s*(\d+)/g'
perl -lne 'print for /\bQUEDBAT=\s*(\d+)/g'

perl(あるいは、主にテキスト処理に関連している場合は、スクリプト全体を書くことがより適切かもしれません)。

答え2

入力にタグ=値ペアがある場合は、まずf[]これらのマッピング()を下に保持する配列を作成するのが最善です。その後、入力順序に関係なく、目的の値を取得、比較、並べ替えるなどの操作を実行できます。ただ彼らのラベルです。特定の要件に合わせて、すべてのUnixシステムのすべてのシェルでawkを使用してください。

$ awk -F'[= ]+' '{for (i=1; i<NF; i+=2) f[$i]=$(i+1); print f["QUEDBAT"]}' file
167924

ただし、最初にタグ値の配列を構築するこのアプローチを使用すると、次のようにさらに多くのことができます。

$ awk -F'[= ]+' '
    { for (i=1; i<NF; i+=2) f[$i]=$(i+1) }
    (f["QUEDBAT"] > 500) && (f["MDBAT"] < f["CONDBAT"]) {
        print f["INADBAT"], f["ADBAT"]
    }
' file
0 143

答え3

tr+ sed「=」を使用してフィールドを区切る場合は、パイプを使用できます。

< file tr -s ' =' '\n' |
sed -n '/^QUEDBAT$/{n;p;}'

GNU sed一人でも使えます。

sed -E '
  s/(^|\s)QUEDBAT=\s*(\S+)/\n\2\n/
  s/.*\n//M;/\n/P;D
' file

結果:

167924
7924

答え4

awk -F "=" '{for(i=1;i<=NF;i++){if($i ~ /QUEDBAT/){gsub(/ *INADBAT/,"",$(i+1));gsub(/^[[:space:]]/,"",$(i+1));print $(i+1)};}}' filename

出力

167924
7924

関連情報