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
}
}
È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top