나는 나 자신에게 이메일로 보낼 테이블에 숫자와 백분율의 무료 출력을 넣으려고 합니다. 나는 오랫동안 이것을 하나의 테이블로 병합하려고 노력했지만 내가 상상한 대로 작동하는 것은 아무것도 없는 것 같습니다.
#!/bin/bash
PATH=/opt/someApp/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
date="date +%Y%m%d"
file="/usr/local/bin/log/start-info_`$date`.txt"
touch $file
free | awk '/Mem/{printf("Mem: %.1f% "), $3/($2+.0000000001)*100} /Swap/{printf("Swap: %.1f%"), $3/($2+.0000000001)*100}' > /usr/local/bin/test-file.txt
percent=$(cat /usr/local/bin/test-file.txt)
percent="$(echo $percent)"
free -m | awk 'BEGIN{ print("<table border=1>")}
{
print "<tr>"
for ( i = 1; i<=NF ; i++ ) {
printf "<td> %s </td> ", $i
}
printf "<td> %s </td> ", $percent;
print "</tr>"
}
END{
print("</table>")
}' > $file
sed -i 's:<td> total:<td> </td> <td> total:' $file
(
echo "To: [email protected]"
echo "From: [email protected]"
echo "Subject: startinformation server"
echo "MIME-Version: 1.0"
echo "Content-Type: text/html charset=US-ASCII"
cat $file
echo
) | /usr/sbin/sendmail [email protected]
$percent의 출력은 메일에 포함되지 않으며 단일 셀에서 이전 데이터를 반복할 뿐입니다.
"echo $percent >> $file"을 사용하여 $percent의 출력을 메일에 직접 넣으면 "Mem: 16.0% Swap: 0.0%"로 올바르게 읽히지만 테이블에 있어야 합니다.
편집: 다음은 free -m의 예입니다.
$ free -m
total used free shared buff/cache available
Mem: 3873 616 898 0 2358 2990
Swap: 3872 0 3872
$ free
total used free shared buff/cache available
Mem: 3966276 630492 1045640 956 2290144 3062460
Swap: 3965948 780 3965168
첫 번째 파일(처음에 추가하는 것을 잊어버렸습니다)은 HTML 코드입니다.
<table border=1>
<tr>
<td> </td> <td> total </td> <td> used </td> <td> free </td> <td> shared </td> <td> buff/cache </td> <td> available </td> <td> total used >
<tr>
<td> Mem: </td> <td> 3873 </td> <td> 619 </td> <td> 597 </td> <td> 0 </td> <td> 2656 </td> <td> 2987 </td> <td> Mem: 3873 619 597 >
<tr>
<td> Swap: </td> <td> 3872 </td> <td> 0 </td> <td> 3872 </td> <td> Swap: 3872 0 3872 </td> </tr>
</table>
두 번째 파일에는 첫 번째 awk의 출력만 포함됩니다.
Mem: 16.0% Swap: 0.0%
내가 원하는 것은 두 번째 파일(예: 16.0% 및 0.0%)의 출력을 다음과 같은 테이블로 가져오는 것입니다.
<table border=1>
<tr>
<td> </td> <td> total </td> <td> used </td> <td> free </td> <td> shared </td> <td> buff/cache </td> <td> available </td> <td> %used </td> </tr>
<tr>
<td> Mem: </td> <td> 3873 </td> <td> 619 </td> <td> 597 </td> <td> 0 </td> <td> 2656 </td> <td> 2987 </td> <td> 16.0% </td> </tr>
<tr>
<td> Swap: </td> <td> 3872 </td> <td> 0 </td> <td> 3872 </td> <td> 0.0% </td> </tr>
</table>
답변1
나는 이것이 당신에게 필요한 것이라고 말할 수 있습니다. 즉, 1 call free -m
, 1 call awk
및 no call sed
:
free -m |
awk '
BEGIN { print("<table border=1>") }
{
if ( NR == 1 ) {
$0 = "_" FS $0 FS "%used"
numCols = NF
$1 = ""
}
else {
$numCols = sprintf("%0.1f%%", ($2 ? ($3 / $2) * 100 : 0))
}
print "<tr>"
for ( i=1; i<=NF; i++ ) {
printf "<td>%s</td>%s", $i, (i<NF ? OFS : ORS)
}
print "</tr>"
}
END { print "</table>" }
'
귀하가 제공한 출력이 주어지면 free -m
위의 출력은 다음과 같습니다.
<table border=1>
<tr>
<td></td> <td>total</td> <td>used</td> <td>free</td> <td>shared</td> <td>buff/cache</td> <td>available</td> <td>%used</td>
</tr>
<tr>
<td>Mem:</td> <td>3873</td> <td>616</td> <td>898</td> <td>0</td> <td>2358</td> <td>2990</td> <td>15.9%</td>
</tr>
<tr>
<td>Swap:</td> <td>3872</td> <td>0</td> <td>3872</td> <td></td> <td></td> <td></td> <td>0.0%</td>
</tr>
</table>