예를 들어, 이 폴더에는 서로 다른 시간의 일부 온도 데이터가 있습니다.
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의 분할 기능을 활용하여 필드를 분할하고 숫자를 역순으로 정렬하여 가장 큰 숫자를 맨 위로 표시합니다.
find . -name "temps.txt" -print|xargs tail -n 1 | awk '{split($NF,temp,"[CF/]");print temp[1]}'|sort -r | head -n 1