例如,这些文件夹中有一些不同时间的温度数据。
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
来获得所需的结果。下面是一个单行代码,它将打印记录了最高温度的文件。
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 中的 split 函数来分割字段并进行数字反向排序以将最大数字弹出到顶部。
find . -name "temps.txt" -print|xargs tail -n 1 | awk '{split($NF,temp,"[CF/]");print temp[1]}'|sort -r | head -n 1