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ãos///
) indica a última linha do arquivo. -
O padrão
hgip.\{0,16\}$
garante quehgip
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
.