たとえば、このフォルダには異なる時間のいくつかの温度データがあります。
temps.txt
温度の数値が含まれています。それでは、bashスクリプトを使用して最高温度をどのように知ることができますか? (結果には日付、時刻、および温度の数だけが表示されます./2011.10.20/00:00/temps.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
temps.txt
$ cat temps.txt
Sensor Location Temp
------ -------- ----
#1 PROCESSOR_ZONE 27C/80F
答え1
find
、grep
およびコマンドの組み合わせを使用して、目的のawk
結果を得ることができます。以下は、記録された最高温度でファイルを印刷する1行のコードです。
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)}'
出力
./2012.04.16/00:10/temps.txt
以下はscript
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}"
答え2
GNUの場合、grep
ファイルパスに改行が含まれていないとします。
grep -rHPo 'PROCESSOR_ZONE\s+\K\d+C' . | awk -F: '
0+$NF >= max {max = $NF; text = $0}; END {print text}'
答え3
解決策は、awkの分割機能を利用してフィールドを分割し、数字を逆順に並べ替えて、最大の数字を一番上に表示します。
find . -name "temps.txt" -print|xargs tail -n 1 | awk '{split($NF,temp,"[CF/]");print temp[1]}'|sort -r | head -n 1