Encontre a última linha de um arquivo para a string correspondente? [fechadas]

2

Eu quero um loop que é executado infinitamente sobre um arquivo, mas sempre verifica a última linha para ver se ela contém a string correspondente, se isso acontecer, então ecoar a linha e manter o loop em execução. O que eu tenho agora não funciona eu recebo um erro para o grep

#! /bin/bash

echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"
# (tail -n1) < FILE
STRING="MYNAME"
while : ;do
    Last = tail -F "$FILE"
    grep -q "$STRING" "$Last" && echo "FOUND" && break
    sleep 5
done
    
por user1585869 02.07.2015 / 20:34

3 respostas

3

Não se incomode em criar um roteiro. Isso exige uma linha única, não um script.

Aproveite as ferramentas existentes para fazer o que você precisa, em vez de escrever uma nova ferramenta.

Basta digitar isso na linha de comando:

tail -f -n 1 /Users/shubhamsinha/Desktop/new_test.log | grep MYNAME

Explicação:

tail -f é executado para sempre no arquivo especificado e gera todas as linhas adicionais adicionadas ao arquivo.

-n 1 significa que, quando tail estiver iniciando, só exibirá a última linha atual do arquivo, em vez das últimas 10 linhas do arquivo, que é o padrão.

| é um pipe. Se você não sabe sobre pipes, solte tudo, não tente escrever mais scripts de shell, até entender os canais. (Não demorará muito, mas é crucial para escrever bons scripts.)

grep MYNAME imprime apenas as linhas de sua entrada que contêm o padrão MYNAME.

    
por 06.05.2016 / 01:48
0
#! /bin/bash
echo "Script is starting......."
FILE="/Users/shubhamsinha/Desktop/new_test.log"

STRING="MYNAME"

while true; do
    tail bar | grep "MYNAME" && echo "FOUND" && break
    sleep 5
done

Exemplo

  • FILE="/home/user1/tmp/bar"
  • O nome do script é foo

    % ./foo &                  
    [1] 12586
    Script is starting.......                                                                                                                                                                                                               
    % echo "MYNAME" > ~/tmp/bar
    % MYNAME
    FOUND
    
    [1]  + 12586 done       ./foo
    
por 02.07.2015 / 21:25
-2

Em vez de usar o comando tail , use awk para obter resultados perfeitos.

Last = tail -F "$FILE"  ===>  Last=$(awk '/./{line=$0} END{print line}' $FILE)
    
por 20.04.2017 / 06:16