データベース名セットを使用して各データベース名に接続し、それに対してストアドプロシージャを実行する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)を使用します。p
perl
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