行で Grep を使用して、その行の上に特定のテキストを印刷します。

行で Grep を使用して、その行の上に特定のテキストを印刷します。

私は現在、partnum列の下で次の700e10を探して、その行の上の "rstcb"の検索/grepを見つける必要がある難しいスクリプトに直面しています。問題は、「rstcb」のgrepの上の行数が固定されていないことです。

rstcb 700000036d048e8 tid 19150545
isfd  op_mode    op_flags   partnum   ucnt ocnt lk ra   partp          ocnt ucnt
0     400        297        700da0    2    2       1    700000023b8c028 715  715
1     2          3          700da0    2    2       0    700000023b8c028 715  715
2     1000400    403        700e10    1    0       0    70000002c768738 0    604
3     1000400    403        700e11    1    0       0    70000002c89a028 0    302
4     1000400    3          70051e    1    1       0    7000000242a1028 318  698
5     1000440    3          70051f    1    1       0    7000000242a15c8 318  396

このコンテンツを入手する手順

ステップ1: Select hex(partnum) from systables where tabname = "stocks"

出力例: 0x00700e10

ステップ2:(informix)を実行するonstat -g opn | grep -i 700e10

ステップ3:たとえば、画像から上記のテキストを取得します。

ステップ2の最初の結果の上にrstcbテキストを検索するgrepを含めたいと思います。一度取得したら、awk '{print $2}' 番号700000036d048e8が欲しい

答え1

私の要件が正しい場合は、簡単な説明がawk役に立ちます。

$ cat > test
rstcb 999999999999
rstcb 700000000123
foo bar doo partnum
1 2 3 4
5 6 7 7001e0

$ awk -vkey=7001e0  '/^rstcb/ {val=$2; next} $4 == key {print val; exit}' test   
700000000123

これにより、次に始まる行の2番目のフィールドが保存され、4番目のフィールドが一致するか、コマンドラインに設定されている項目がある行に遭遇すると、保存されたrstcb値(最後の値)が印刷されます。7001e0key

next最初のコードブロックは2番目のテストをスキップし、最初のexit一致の後に停止します。これを削除すると複数のヒットが発生しますが、同じrstcb行にある可能性があります。

関連情報