터미널 출력을 로그 정보로 다시 포맷하는 방법을 알고 싶습니다. 보다 구체적으로 말하면 패키지 sensors
의 명령 출력을 다시 형식화하여 lm-sensors
파일에 쓰고 싶습니다 . 출력은 다음과 같습니다.
acpitz-virtual-0
Adapter: Virtual device
temp1: +61.0°C (crit = +99.0°C)
temp2: +29.8°C (crit = +99.0°C)
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0: +63.0°C (high = +86.0°C, crit = +100.0°C)
Core 0: +62.0°C (high = +86.0°C, crit = +100.0°C)
Core 1: +59.0°C (high = +86.0°C, crit = +100.0°C)
Core 2: +63.0°C (high = +86.0°C, crit = +100.0°C)
Core 3: +61.0°C (high = +86.0°C, crit = +100.0°C)
radeon-pci-0100
Adapter: PCI adapter
temp1: +61.5°C
다시 포맷하는 목적은 나중에 gnuplot(라이브 플로팅) 데이터를 사용하는 것입니다. 따라서 결과는 다음과 유사해야 합니다.
# Timestamp [hh:mm:ss] temp1 [°C] temp2 [°C] ...
13:45:52 65.0 29.0 .
13:45:53 66.0 28.0 .
13:45:54 64.0 27.0 .
13:45:55 55.0 26.0 .
... ... ... .
일종의 루프가 필요한 센서 수가 다른 여러 컴퓨터에서 사용하고 싶습니다. 그러나 중복 라인을 제거하는 위치와 방법에 대한 루프가 있습니다(예: acpitz-virtual-0, 어댑터:가상 장치, ...). lm-sensors
차트를 생성하는 패키지 기능 도 알고 있습니다 . 하지만 저는 집에서 만든 솔루션을 구현하고 문제를 보다 일반화하고 싶습니다.
답변1
나는 같은 문제가 있었고 해결책을 구현했습니다.
sed
파이프라인 출력은 정규식을 사용하여 구문 분석되고 sensors
결과는 로그 파일에 추가됩니다.
- 날짜는 UNIX 타임스탬프로 파일에 기록되고 표준 출력 형식으로 지정됩니다. 개행을 억제하려면
echo -n "$(date +"%H:%M:%S")
이 명령을 사용하십시오. - 다음으로 출력을
sensors
파이프하여sed
각 행을 구문 분석하여 검색을 통해 온도를 찾습니다°C
. - 결과는 agine 으로 파이프됩니다
sed
. 이제 문자열은 세 부분으로 나뉩니다. 콜론과 공백으로 시작하는 센서 이름^[a-zA-Z0-9 ]*:\s*
, 기호, 숫자, 점으로 구성된 온도,\([0-9.+-]*\)
문자열 끝까지의 나머지 부분입니다.*$
. 두 번째 부분은 괄호를 사용하여 참조로 표시됩니다. - 개행 문자를 제거 하기 위해 결과가 다시 파이프됩니다
sed
.자세한 내용을 보려면 클릭하세요. - 스크립트는 X초 동안 휴면 상태입니다. (나의 경우 5초.)
생성된 배치 스크립트:
# Printing the names of the columns as first row in file
echo "Time; temp1; temp2; Physical id 0; Core 0; Core 1; Core 2; Core 3; SIO Temp; temp3" > Temperatures.log
while true
do
# Printing the time and all temperatures to stdout
echo -n "$(date +"%H:%M:%S"): "
sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$/\1/" | sed ':a;N;$!ba;s/\n/;\t/g'
# Logging time as UNIX time and temperatures to file
echo -n "$(date +"%s"); " >> Temperatures.log
sensors | sed -n "/°C/p" | sed "s/^[a-zA-Z0-9 ]*:\s*\([0-9.+-]*\).*$/\1/" | sed ':a;N;$!ba;s/\n/;\t/g' >> Temperatures.log
# Sleeping for X seconds
sleep 5
done