awk를 사용하여 txt 파일에서 여러 줄을 추출하여 html의 단일 셀에 넣습니다.

awk를 사용하여 txt 파일에서 여러 줄을 추출하여 html의 단일 셀에 넣습니다.

이 스크립트를 사용하여 텍스트 파일에서 명령줄을 추출하고 표 형식으로 이메일로 보냅니다. 단일 명령에 여러 줄의 출력이 있기 때문에 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행에서 추가 공백을 제거했습니다.

관련 정보