Analisar arquivo para padrão recursivo

1

no meu dir, existem vários arquivos com o padrão

simulation_y_t

para todos os arquivos com esse padrão, eu precisaria verificar se na última linha do arquivo a palavra hgip aparece ou não ... a palavra pode não estar separada por espaços dos caracteres adjacentes, mas se aparecer ele vai aparecer nos últimos 20 caracteres da linha ...

como eu seria capaz de fazer isso?

    
por user3069326 30.05.2015 / 21:31

1 resposta

2

Usando sed :

for file in *simulation_y_t*; do sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file"; done

Ele irá verificar a última linha de cada arquivo e se hgip aparecer nos últimos 20 caracteres, a linha será impressa.

Aqui está a versão expandida (imprimindo os nomes dos arquivos também):

#!/bin/bash
for file in *simulation_y_t*; do
    line="$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")"
    [[ -n $line ]] && echo "$file: " "$line"
done
  • O% start$ (antes do padrão s/// ) indica a última linha do arquivo.

  • O padrão hgip.\{0,16\}$ garante que hgip ocorra apenas com os últimos 20 caracteres da linha

  • line conterá a linha com correspondência

  • [[ -n $line ]] testa se o comprimento de $line é diferente de zero, se for o caso, o arquivo e a última linha correspondente serão impressos.

Isso também pode ser feito usando grep com ajuda de tail :

grep 'hgip.\{0,16\}$' < <(for f in *simulation_y_t*;do tail -1 "$f";done)

Aqui a lógica é igual a sed , além disso, tail -1 nos dará as últimas linhas dos arquivos para que possamos executar grep sobre eles.

EDITAR:

Se você quiser excluir a última linha, se ela corresponder às condições, use:

!/bin/bash
for file in *simulation_y_t*; do
   [[ -n "$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")" ]] && sed -i.bak '$d' "$file"
done

O arquivo original será mantido com uma extensão .bak , se você não quiser usar apenas -i em vez de -i.bak .

    
por heemayl 30.05.2015 / 22:03