awkのコマンド出力から特定の行を取得する

awkのコマンド出力から特定の行を取得する

インパラシェルから特定のレコードを読み取るためにパイプを使用しました。これは私が得たものです。

[cloudera@localhost ~]$ echo "select * from abc where key > 'a-26052014015400' limit 1;" | impala-shell
Starting Impala Shell without Kerberos authentication
Connected to localhost.localdomain:21000
Server version: impalad version cdh5-1.3.0 RELEASE (build 40e1b62cf0b97f666d084d9509bf9639c575068c)
Welcome to the Impala shell. Press TAB twice to see a list of available commands.

Copyright (c) 2012 Cloudera, Inc. All rights reserved.

(Shell build version: Impala Shell vcdh5-1.3.0 (40e1b62) built on Tue Mar 25 13:46:44 PDT 2014)
Query: select * from abc where key > 'a-26052014015400' limit 1
[localhost.localdomain:21000] > +------------------------+------+----------------+-------+
| key                    | hpid | uts            | value |
+------------------------+------+----------------+-------+
| a-26052014015700 | HS2  | 26052014015450 | 50    |
+------------------------+------+----------------+-------+
Returned 1 row(s) in 2.42s
Goodbye

私が本当に欲しいのは、 a-26052014015700 | HS2 | 26052014015450 | 50awkプログラミングのこの記録です。 pipe awkコマンドを使ってみました。

`echo "select * from abc where key > 'a-26052014015400' limit 1;" | impala-shell| awk -F'=' '{print $2}' | awk -F '>' '{print $1}`

しかし、期待した結果は得られませんでした。レコードを抽出するより良い効率的な方法はありますか?

答え1

次にパイピングしてみてくださいgrep

$  grep -E "| a-[0-9]* | HS2  | [0-9]* | [0-9]* |" 

|最初と最後を削除します|

$  grep -Eo "  a-[0-9]* \| HS2 \| [0-9]* \| [0-9]* " 

「-E」は拡張正規表現構文にアクセスします。

「-o」は、行の内容全体ではなく、行の一致部分のみを出力するために使用されます。

答え2

出力が常に次の形式であることがわかっている場合Xタイトル行とはいフッター行では、必要な部分のみを使用して取得できますheadtail

    エコクエリ|インパラシェル|tail-n+X|ヘッド-エン-はい

    # - 上記の例では -
    echo "key> 'a-26052014015400'が1のabcから*を選択してください。"
                |テール-n +13 |ヘッド-n -3

    #返品
    a-26052014015700 50 |

    -N--わかった=カリウム
            最後の10行ではなく最後のK行を出力します。
            または使用-N+KラインKから始めてラインを出力します。

    -N--わかった=[-]ケイ
            最初の10行ではなく最初のK行を印刷します。
            「-」で始まり、各ファイルの最後のK行を除くすべての行を印刷します。

関連情報