como atribuir log como uma variável no bash

1

Eu quero atribuir saída de log para "linha", eu tentei o seguinte line=tail -1000 /var/log/syslog

mas não funciona.

o myscript é como abaixo

#!/bin/bash

line='tail -1000 /var/log/syslog'
d1=$(date --date="-10 min" "+%b %_d %H:%M")
d2=$(date "+%b %_d %H:%M")
while read line; do
    [[ $line > $d1 && $line < $d2 || $line =~ $d2 ]] && echo $line
done
    
por Prabash 22.12.2017 / 10:53

2 respostas

0

Tente esta mudança

fd=""
tmplog="/tmp/temp_${$$}_${RANDOM}"
tail -1000 /var/log/syslog > “$tmplog”

exec {fd}<“$tmplog"

while IFS='' read -r -u $fd line || [[ -n $line ]]; do
    #your commands here
done

exec {fd}>&-
rm "$tmplog"

Como funciona: Atribuir fd como uma variável. Crie um arquivo temporário usando o script PID e o número “RANDOM” (você também pode usar o comando mktemp no lugar disso). Abra o descritor de arquivo fd para leitura do arquivo temporário. Use while loop com IFS configurado como nothing e execute o comando read com a opção -u para ler a partir de fd . Coloque seus comandos dentro do loop usando a mesma variável line . Feche o descritor de arquivos. Remova o arquivo temporário.

    
por 22.12.2017 / 11:27
0

Sua tarefa funciona bem - embora $( ... ) seja mais robusto e melhor estilo que os backticks. Mas read line não lê da linha, lê a partir de stdin (o terminal, desde que você não redirecionou ele) para linha, destruindo o conteúdo anterior. Experimente um dos seguintes:

data=$(tail -1000 /file) 
while read line; do echo "$line"; done <<<"$data"
# bash ksh zsh but maybe not older shells
# or 
while read line; do echo "$line"; done < <(tail -1000 file)
# ditto 

data=$(tail -1000 /file) 
echo "$data" | while read line; do echo "$line"; done 
# or
tail -1000 file | while read line; do echo "$line"; done
# most shells, but any var set (or other shell change made) within the loop 
# will disappear on _some_ shells because pipelines are run in subshells

com os comandos apropriados adicionados no loop.

Em geral, para manter os dados não alterados por read , você precisa de -r como mostrado por EnterUserNameHere, mas as entradas do syslog são bem estruturadas e não devem ser necessárias para nenhum caso em que eu possa pensar. OTOH acrescentando que não vai doer e é uma boa prática.

Observe que a comparação de cadeias de dados não funcionará no primeiro dia de alguns meses; por exemplo, se now-10min for "Nov 31 23:55" e agora for "Dec 01 00:05" então todos os datinters que estão realmente entre esses dois tempos irão falhar no teste $line > $d1 && $line < $d2

    
por 23.12.2017 / 06:15