choisissez le fichier le plus récent et utilisez getline pour le lire

StackOverflow https://stackoverflow.com/questions/1048146

  •  20-08-2019
  •  | 
  •  

Question

Ayant des problèmes avec un petit script awk, je tente de choisir le fichier journal le plus récent, puis d’utiliser getline pour le lire. Le problème est que cela fonctionne si je n’envoie aucune entrée au script.

Cela fonctionne

echo | myprog.awk

cela ne pas

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
}
}
Était-ce utile?

La solution

Votre problème est que, bien que votre programme sélectionne OK, le fichier journal est exécuté, le bloc {} doit être exécuté pour chaque ligne du fichier d'entrée et vous n'avez pas encore entré le fichier. Je ne connais pas très bien moi-même awk, je ne sais donc pas comment modifier les entrées (si possible) depuis un script awk. Je voudrais donc:

#! /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
    }
}

ou peut-être

alias myprog.awk="awk '{print $0}'  `ls -1rt | tail -1`" 

Encore une fois, c'est peut-être un peu sale. Nous attendrons une meilleure réponse. : -)

Autres conseils

Ne jamais analyser ls. Voir ceci pour la raison.

Pourquoi devez-vous utiliser getline? Laissez awk faire le travail pour vous.

#!/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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top