scegli il file più recente e usa getline per leggerlo
-
20-08-2019 - |
Domanda
Avendo problemi con un piccolo script awk, sto cercando di scegliere il più recente di alcuni file di registro e quindi usare getline per leggerlo. Il problema è che funziona se non invio alcun input prima allo script.
Funziona
echo | myprog.awk
questo non
myprog.awk
myprog.awk
BEGIN{
#find the newest file
command="ls -alrt | tail -1 | cut -c59-100"
command | getline logfile
close(command)
}
{
while((getline<logfile)>0){
#do the magic
print $0
}
}
Soluzione
Il tuo problema è che mentre il tuo programma seleziona OK il file di registro il blocco {} deve essere eseguito per ogni riga del file di input e tu non hai il file di input, per impostazione predefinita è l'input standard. Io stesso non conosco Awk molto bene, quindi non so come modificare l'input (se possibile) dall'interno di uno script Awk, quindi vorrei:
#! /bin/awk -f
BEGIN{
# find the newest file
command = "ls -1rt | tail -1 "
command | getline logfile
close(command)
while((getline<logfile)>0){
getline<logfile
# do the magic
print $0
}
}
o forse
alias myprog.awk="awk '{print $0}' `ls -1rt | tail -1`"
Ancora una volta, questo potrebbe essere un po 'sporco. Aspetteremo una risposta migliore. : -)
Altri suggerimenti
Non analizzare mai ls
. Vedi questo per il motivo.
Perché devi usare getline? Lascia che awk
faccia il lavoro per te.
#!/bin/bash
# get the newest file
files=(*) newest=${f[0]}
for f in "${files[@]}"; do
if [[ $f -nt $newest ]]; then
newest=$f
fi
done
# process it with awk
awk '{
# do the magic
print $0
}' $newest