Imaginando que sua entrada é salva em um arquivo chamado "test.txt", você pode usar "awk" com a seguinte sintaxe:
awk -F '|' '/^VAR_3/ {print $2}' test.txt
Exemplo de execução para a entrada que você forneceu:
$ awk -F '|' '/^VAR_3/ {print $2}' test.txt
VALU_31
Aqui está uma explicação básica deste comando awk:
-F '|'
: define "|" (símbolo de pipe) como o separador de campo% /^VAR_3/
: corresponde apenas às linhas que começam com "VAR_3"
{print $2}
: imprime o segundo campo / coluna (que, nesse caso, contém o valor que você deseja para imprimir)
ATUALIZAÇÃO (3 de dezembro de 2015):
Assim, o OP adicionou um comentário esclarecedor, o que leva a concluir que ele quer que a pesquisa seja multilinha, considerando as linhas entre dois "tokens" como parte do valor do primeiro token.
Aqui está uma versão revisada para o exemplo inicial, desta vez usando os comandos " sed " (2 vezes!) e " head ":
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33
OK. Parece bom : -) Vamos ver se isso vale para um caso de linha única:
$ sed -n '/VAR_4|/,/VAR_/p' test.txt | sed '1 s/VAR_4|//' | head -n -1
VALU_4
Bom. Por isso, também funciona para casos de linha única!
Funciona bem se a string pesquisada NÃO estiver na entrada? Vamos tentar por VAR_0
(que NÃO existe no exemplo dado):
$ sed -n '/VAR_0|/,/VAR_/p' test.txt | sed '1 s/VAR_0|//' | head -n -1
$
Ótimo. Então, isso parece estar funcionando em vários casos (embora eu ache que pode haver soluções mais eficientes).
Então, como isso funciona? Aqui está o resumo básico para o exemplo "VAR_3" ...
A primeira parte - sed -n '/VAR_3|/,/VAR_/p' test.txt
- retorna a seguinte saída:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt
VAR_3|VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
Então, essa parte basicamente combina tudo entre VAR_3
e a próxima ocorrência de VAR_
. Como podemos ver, esta parte parece estar retornando o que queremos ... Mais duas coisas que não queremos: o " VAR_3|
" na primeira linha -E- a última linha.
Então, canalizamos essa primeira saída para outra instrução "sed" que só se aplica à primeira linha, e substituímos a string " VAR_3|
" por nada, removendo-a efetivamente:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//'
VALU_31
VALU_31
VALU_33
VAR_4|VALU_4
O " 1
" é para aplicar o comando sed à primeira linha ... E queremos NÃO incluir essa última linha, então canalizamos essa saída para o comando " head " com a opção " -n
" ("MINUS n") - especificamente " -n 1
" para excluir a última linha:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33