Converter script Bash em script AWK

1
CURTIME=$(date '+%s')
LOG=/home/apache_logs.txt
FILETIME1=$(stat $LOG -c %Y)
TIMEDIFF1=$(expr $CURTIME - $FILETIME1)

Eu criei esse script no Ubuntu e ele funciona bem lá, mas no SunOS (Generic_150400-64 sun4v sparc sun4v), ele não está funcionando.

Esse script é para verificar se os logs estão sendo atualizados e o fazem (se houver), dependendo da saída de segundos no TIMEDIFF1.

Se else executará coisas como, se os logs forem atualizados há 15 minutos, faça isso, se há 30 minutos faça isso ... e assim por diante.

Portanto, o tempo em segundos como saída é importante para que a instrução if else seja executada com eficiência.

por isso, estou tentando determinar quantos anos um arquivo tem (há quanto tempo foi modificado / atualizado) no SECONDS. e preciso de tempo em segundos.

Bharat
fonte
O que você já tentou? Você pode colar suas tentativas de código?
Q23 11/07
As primeiras quatro linhas em que eu preciso de modificação já estão coladas acima da minha pergunta, mas vou postar aqui novamente. CURTIME = $ (nawk "BEGIN {print srand}") LOG = / home / apache_logs.txt FILETIME1 = $ (stat $ LOG -c% Y) TIMEDIFF1 = $ (expr $ CURTIME - $ FILETIME1)
Bharat
1
Então, basicamente, você está tentando determinar a idade de um arquivo (há quanto tempo ele foi modificado / atualizado)? Você precisa saber exatamente quantos anos ela tem ou se pode obter uma resposta "sim" ou "não" a uma consulta como "Faz mais de N  segundos?" (Para algum valor de  N  )? …………………… Por favor, não responda nos comentários; editar  a sua pergunta para dar descrição mais clara e mais completa  do objetivo que você deseja alcançar.
G-Man
tornou as perguntas mais claras
Bharat
1
it is not workingé a menos útil de todas as descrições de problemas. Quando algo em sua vida não está funcionando e você quer que alguém o ajude a fazê-lo funcionar, você precisa dizer a ele de que maneira não está funcionando. Neste caso - saída errada, sem saída, core dump, mensagens de erro, outra coisa? O que acontece se você incluir um shebang no topo - #!/bin/env bash? O que faz você pensar que um script awk seria apropriado para esta tarefa?
Ed Morton

Respostas:

1

Como substituto do stat, você pode usar o seguinte perl oneliner:

perl -e 'print((stat("/tmp/a"))[10])'

Para solucionar a data atual, você pode usar o touchcomando para criar um arquivo temporário e ler o carimbo de data / hora da modificação no arquivo temporário, como:

touch /tmp/currtime
CURRTIME=$(perl -e 'print((stat("/tmp/currtime"))[10])')
FILETIME=$(perl -e 'print((stat("/path/to/log"))[10])')
DIFFTIME=$(($CURRTIME - $FILETIME))
echo "Time difference is $DIFFTIME seconds"
#cleanup
rm /tmp/currtime

A referência sobre o comando perl stat () pode ser encontrada em: https://perldoc.perl.org/functions/stat.html

Lambert
fonte
muito obrigado Lambert
Bharat
0

Se a versão do dateseu sistema SunOS não suportar o  +%sargumento, usar awkpara corrigir isso , embora não seja impossível, é impraticável.

Funciona ? Caso contrário, você estará sem sorte. Nesse caso, você pode usá-lo para obter o horário atual:stat filename -c %Y

tmpfile="/tmp/apache_test$$"
if [ -e "$tmpfile" ]
then
    printf "%s exists; that’s odd.\n" "$tmpfile"
    exit
fi
if ! { touch "$tmpfile"  &&  CURTIME=$(stat "$tmpfile" -c %Y)  &&  rm "$tmpfile";}
then
    printf "Something went wrong.\n"
    exit
fi

Se a sua versão do bash não suportar , use-o  .[ -e filename ]-f

PS Você deve citar todas as suas variáveis:

FILETIME1=$(stat "$LOG" -c %Y)
TIMEDIFF1=$(expr "$CURTIME"  "$FILETIME1")
G-Man
fonte
nome do arquivo stat -c% Y funciona? não, ele não funcionou
Bharat
se você conhece outros comandos, por favor me avise, eu só preciso de um workaorund para esses dois comandos
Bharat