Como posso fazer o grep para múltiplos padrões e imprimi-los na mesma linha?

1

Eu tenho vários arquivos que seguem o mesmo padrão de dados.

Digamos que esse seja o padrão do qual eu quero extrair:

First part of text...patternA......Second part of text.....patternB.....Third part of text....patternC.....End part of text

Atualmente estou usando isso:

grep -P -o ".{0,5}patternA|.{0,5}patternB.{0,5}|patternC.{0,5}" filename.txt

Com isso, a saída que estou recebendo é:

1111 patternA
2222 patternB 2222
patternC 3333

A saída que eu realmente quero é:

1111 patternA 2222 patternB 2222 patternC 3333

Eu não consigo descobrir como se livrar das novas linhas no final de cada padrão.

Como posso fazer isso?

    
por Nikola Atanasov 17.03.2017 / 18:11

3 respostas

3

Use sed para copiar as partes da linha que correspondem ao padrão para a saída, usando grupos de captura.

sed -r -n 's/.*(.{0,5}patternA).*(.{0,5}patternB.{0,5}).*(patternC.{0,5}).*/  /p' filename.txt

Isso pressupõe que os padrões estão sempre nesta ordem nas linhas.

    
por 17.03.2017 / 21:28
2

com column :

COLUMN(1)                 BSD General Commands Manual                COLUMN(1)

NAME
     column -- columnate lists

SYNOPSIS
     column [-tx] [-c columns] [-s sep] [file ...]

DESCRIPTION
     The column utility formats its input into multiple columns.  Rows are
     filled before columns.  Input is taken from file operands, or, by
     default, from the standard input.  Empty lines are ignored.

Por exemplo (com um uso inútil e livre de cat para demonstrar que você pode canalizar a saída de grep para column ):

$ cat example
Fuzzy
wuzzy
was
a
bear
$ cat example | column
Fuzzy   wuzzy   was a   bear
    
por 17.03.2017 / 18:50
0

Se você sabe que todos os 3 campos sempre existem, você pode tentar o seguinte com "colar"

grep -P -o ".{0,5}patternA|.{0,5}patternB.{0,5}|patternC.{0,5}" filename.txt | paste - - -

    
por 17.09.2018 / 21:44