이 스크립트를 사용하여 텍스트 파일에서 명령줄을 추출하고 표 형식으로 이메일로 보냅니다. 단일 명령에 여러 줄의 출력이 있기 때문에 awk를 사용하여 단일 셀에 여러 줄을 넣는 방법을 알아야 합니다.
사용된 스크립트:
tmpfile="/tmp/test.html"
input="/tmp/test.txt"
{
echo '<table border=1 cellspacing=0 cellpadding=3>'
awk 'NR==1 {print "<tr><td>Hostname</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==2,NR==5 {print "<tr><td>IPAddress</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==6{print "<tr><td>Date</td><td>"$0"</td></tr>"}' "$input"
echo '</table>'
} >"$tmpfile"
텍스트 파일: cat /tmp/test.txt - 2~5행에는 단일 명령의 출력이 포함됩니다.
machinename.domain
ens00: flags=00
inet 00.00.00.00 netmask 00.00.00.0 broadcast
ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
RX packets 97 bytes 61809
currentdate
이메일 표 형식으로 제외
Hostname machinename.domain
IPAddress ens00: flags=00
inet 00.00.00.00 netmask 00.00.00.0 broadcast
ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
RX packets 97 bytes 61809
Date currentdate
표 형식의 현재 출력
Hostname machinename.domain
IPAddress ens00: flags=00
IPAddress inet 00.00.00.00 netmask 00.00.00.0 broadcast
IPAddress ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
IPAddress RX packets 97 bytes 61809
Date currentdate
답변1
이것은 아마도 awk로 하고 싶은 일일 것입니다:
$ cat tst.sh
#!/usr/bin/env bash
tmpfile='test.html'
input='test.txt'
awk '
BEGIN {
print "<table border=1 cellspacing=0 cellpadding=3>"
}
NR == 1 {
print "<tr><td>Hostname</td><td>" $0 "</td></tr>"
}
NR == 2 {
print "<tr><td valign=\"top\">IPAddress</td><td>" $0
}
(2 < NR) && (NR < 6) {
print "<br>" $0
}
NR == 6 {
print "</td></tr>"
print "<tr><td>Date</td><td>" $0 "</td></tr>"
}
END {
print "</table>"
}
' "$input" > "$tmpfile"
$ ./tst.sh
$ cat test.html
<table border=1 cellspacing=0 cellpadding=3>
<tr><td>Hostname</td><td>machinename.domain</td></tr>
<tr><td valign="top">IPAddress</td><td>ens00: flags=00
<br>inet 00.00.00.00 netmask 00.00.00.0 broadcast
<br>ether 00:00:00:00:00:00 txqueuelen 000 (Ethernet)
<br>RX packets 97 bytes 61809
</td></tr>
<tr><td>Date</td><td>currentdate</td></tr>
</table>
브라우저에서 렌더링하면 테이블은 다음과 같을 것입니다. 제 생각엔 이것이 바로 여러분이 원하는 것입니다.
답변2
awk ORS(Output Record Separator) 변수를 사용하면 여러 줄의 출력을 단일 셀로 결합할 수 있습니다. 이를 다른 문자열이나 문자로 수정할 수 있으며 기본적으로 개행으로 설정됩니다.
awk를 사용하여 3~17행의 출력을 단일 셀로 결합하도록 스크립트가 변경되었습니다.
tmpfile="/tmp/test.html"
input="/tmp/test.txt"
{
echo '<table border=1 cellspacing=0 cellpadding=3>'
awk 'NR==1 {print "<tr><td>Hostname</td><td>"$0"</td></tr>"}' "$input"
awk 'NR==2,NR==5 {gsub(/^ */, ""); printf "<tr><td>IPAddress</td><td>"; for (j=1; j<=NF; j-=-1) {printf "%s ", $j}; printf "</td></tr>";}' "$input"
awk 'NR==6{print "<tr><td>Date</td><td>"$0"</td></tr>"}' "$input"
echo '</table>'
} >"$tmpfile"
제가 수정한 내용은 다음과 같습니다.
gsub(/*, "")
두 번째 awk 명령에 출력 줄의 선행 공백을 제거하는 명령을 포함시켰습니다 . 이렇게 하면 출력이 테이블에 올바르게 배치됩니다.- 각 IP 주소 뒤에 개행 문자를 삽입하지 않기 위해 두 번째 awk 명령을 다음으로 변경했습니다
print
.printf
- 두 번째 awk 명령에서는
for
루프를 사용하여 각 IP 주소를 반복적으로 실행하고 각 IP 주소를 공백으로 구분하여 한 줄에 인쇄합니다. - 결과가 테이블에 제대로 정렬되도록 하기 위해 입력 파일의 3~17행에서 추가 공백을 제거했습니다.