Como eu procuro por um padrão usando GREP que deve ocorrer APÓS a enésima ocorrência de outro padrão na mesma linha?

0

Eu tenho um arquivo com registros que são delimitados por pipe ('|'). Eu preciso procurar por uma string específica somente na 6ª coluna e depois retornar a linha inteira através do utilitário grep. Existem no total 10 colunas e, portanto, 9 tubos. Nas linhas de exemplo abaixo, eu preciso procurar por 'G50483', Somente o 2º registro deve ser retornado.: -

3DEAC-9AF7-4EEE-9ACD-A6E376C5727C | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D ||Y| 610535 | DEFERRAL-TASK CLAIMED | RON BOW - ORD  Arv 10-SEP-2015 20:48, BOW-Line 2      Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 1G50483 every 50FH to ensure no       additional damage is present|| GMT |11-SEP-11

26BDF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED |RON BOW - ORD  Arv 25-SEP-2015 21:46, BOW-Line 6      Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N G50483 every 50FH to ensure no        additional damage is present || GMT | 27-SEP-10

G50483 26B2F1DF-D080-4ACC-94F9-1AB39038EBF9 | 2F6E92EF-8903-4E50-8A6B-7049C0A7543D || Y |179808 | DEFERRAL-TASK CLAIMED | RON BOW - ORD  Arv 25-SEP-2015 21:46, BOW-Line 6       Pre-Repair Recurring Deferral Task: Perform a general visual inspection of the transcowl seal P/N 3G50483 every 50FH to ensure no       additional damage is present|| GMT | 27-SEP-05
    
por Krishna V 27.10.2015 / 05:47

2 respostas

0

Se tiver que ser grep :

grep -Em2 "([^|]+|){6}[^|]+G50483.*' file | tail -n1
  • -E ativa expressões regulares estendidas
  • -m2 para na segunda correspondência
  • '...' da expressão regular
    • [^|]+| procura por um ou mais caracteres ( + ) que não são um canal | seguido por um canal.
    • (...){6} isto é feito 6 vezes consecutivamente, então estamos no 7º campo agora. Sua pergunta menciona o sexto campo, mas assumi o sétimo campo por causa da entrada de exemplo. Altere para {5} , se desejar.
    • [^|]+ agora procuramos por caracteres que não são pipes até o padrão de pesquisa final:
    • G50483 do padrão real
  • tail -n1 é necessário, porque grep sozinho não pode imprimir apenas a enésima ocorrência, tail corta a outra ocorrência que somente a segunda avalia.
por 27.10.2015 / 09:46
0

No Unix, você precisa escolher a ferramenta certa para o trabalho, pois ela fornece um kit de ferramentas. grep funciona em linhas inteiras. Use awk em vez disso:

awk -F "|" '$6 ~ /G50483/ { print $2; }'
  • -F é o separador de campo "|" neste caso
  • $6 é a coluna para pesquisar padrão
  • ~ corresponde a um padrão (você pode usar == para uma correspondência exata)
  • /pattern/ padrão de pesquisa
  • $2 - 2º campo ( $0 seria toda linha)

Mais informações aqui: Programação efetiva do AWK - 4e .

    
por 27.10.2015 / 08:02

Tags