Obter linha específica da saída do comando no awk

4

Eu usei pipeline para ler registros específicos do shell impala. Aqui está o que eu tenho

[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

O que eu realmente quero é a-26052014015700 | HS2 | 26052014015450 | 50 deste registro na programação do awk. Eu tentei com o comando awk canalizado

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

mas não obteve o resultado esperado. Qualquer método melhor e eficiente para extrair o registro?

    
por Aashu 14.07.2014 / 16:28

2 respostas

4

tente enviar para grep :

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

para se livrar do primeiro | e do último | :

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

"- E" para acessar a sintaxe da expressão regular estendida

"- o" é usado para produzir apenas o segmento correspondente da linha, em vez do conteúdo completo da linha.

    
por 14.07.2014 / 17:46
3

Se você souber que sua saída sempre estará em um formato de X linhas de cabeçalho e Y linhas de rodapé, poderá usar head e tail para obtenha apenas a parte que você precisa,

    echo query | impala-shell | tail -n +X | head -n -Y

    # -- in your case above --
    echo "select * from abc where key > 'a-26052014015400' limit 1;" | impala-shell \
                | tail -n +13 | head -n -3 

    # returns
    | a-26052014015700 | HS2  | 26052014015450 | 50    |

final

    -n, --lines=K
            output the last K lines, instead of the last 10; 
            or use -n +K to output lines starting with the Kth

cabeça

    -n, --lines=[-]K
            print the first K lines instead of the first 10; 
            with the leading '-', print all but the last K lines of each file
    
por 14.07.2014 / 19:19

Tags