Comment find le plus grand nombre de documents contenant plusieurs numéros

Par exemple, il existe des données de température sur ces dossiers à des moments différents. time.txt contient le numéro de température. Alors, comment puis-je utiliser le script bash pour find la température maximale? (les résultats montrent seulement la date, l'heure et le nombre de température, par exemple ./2011.10.20/00:00/time.txt 27C ).

 $ ls 2011.10.20 2012.01.20 2012.04.16 2012.07.12 2012.10.07 2011.10.21 2012.01.21 2012.04.17 2012.07.13 2012.10.08 2011.10.22 2012.01.22 2012.04.18 2012.07.14 2012.10.09 $ cd 2011.10.20 $ ls 00:00 02:25 04:50 07:15 09:40 12:05 14:30 16:55 19:20 21:45 00:05 02:30 04:55 07:20 09:45 12:10 14:35 17:00 19:25 21:50 00:10 02:35 05:00 07:25 09:50 12:15 14:40 17:05 19:30 21:55 $ cd 00:00 $ ls time.txt $ cat time.txt Sensor Location Temp ------ -------- ---- #1 PROCESSOR_ZONE 27C/80F 

Vous pouvez utiliser les commands combiner find , grep et awk pour get le résultat désiré. Le ci-dessous est un oneliner qui va imprimer le file qui a la température maximale enregistrée.

 find . -mindepth 3 -exec echo -n "{} " \; -exec grep "PROCESSOR_ZONE" {} \; | awk '{ split($4,val,"/"); gsub("C","",val[1]); if (max<val[1]) {file=$1; max=val[1]} } END {print(file)}' 

Sortie

 ./2012.04.16/00:10/time.txt 

Voici la version du script de l'oneliner.

 #!/bin/bash # The path where temperature directories and files are kept path="/tmp/tmp.ADntEuTlUT/" # Temp file tempfile=$(mktemp) # Get the list of files name and their corresponding # temperature data. find "${path}" -mindepth 3 -exec echo -n "{} " \; -exec grep "PROCESSOR_ZONE" {} \; > "${tempfile}" # Parse though the temp file to find the maximum # temperature based on Celsius awk '{split($4,val,"/");gsub("C","",val[1]);if(max<val[1]){file=$1;max=val[1]}} END{print(file)}' "${tempfile}" # Removing the temp file rm -f "${tempfile}" 

Avec GNU grep , en supposant qu'aucun path de file ne contienne de caractères de nouvelle ligne:

 grep -rHPo 'PROCESSOR_ZONE\s+\K\d+C' . | awk -F: ' 0+$NF >= max {max = $NF; text = $0}; END {print text}' 

Cette solution fait usage de la fonction split dans awk pour split les champs et faire le sorting inversé numérique pour faire apparaître le nombre max en haut.

 find . -name "time.txt" -print|xargs tail -n 1 | awk '{split($NF,temp,"[CF/]");print temp[1]}'|sort -r | head -n 1