텍스트 파일 출력을 테이블의 이메일로 보내지만 이메일 출력에 텍스트 파일 행을 기반으로 한 테이블의 중복 행이 있습니다.

텍스트 파일 출력을 테이블의 이메일로 보내지만 이메일 출력에 텍스트 파일 행을 기반으로 한 테이블의 중복 행이 있습니다.

아래에서 작동하는 것은 txt 파일을 테이블의 이메일로 보내는 것입니다. 이메일 출력에는 txt 파일 출력의 줄 수에 따라 중복된 명령줄이 있습니다. 수신된 이메일의 출력에 텍스트 파일과 동일한 수의 반복 줄이 있는 이유는 무엇입니까? 또한 출력을 위해 txt 파일의 두 번째 줄을 어떻게 사용할 수 있습니까?

다음과 같이 사용하세요.

tmpfile="/tmp/tmp.html"
 input="/tmp/tmp.txt"
 awk 'BEGIN {print "<table>"}
 {print "<tr>";print "<td>Hostname</td>";print "<td>"NR==2{print $0}"</td>";print "</tr>"}
  END {print "</table>"}' "$input" >"$tmpfile"
Expected out in email (table):
Hostname    machineipaddress
Current out:
Hostname    NR==2{print $0}
Hostname    NR==2{print $0}
    
# cat /tmp/tmp.txt
machinename.domain
machineipaddress

답변1

  • 입력의 두 번째 줄만 출력하려면 NR==2전체 awk 코드 블록에 대한 조건으로 ( )를 사용하세요.

  • 또한 인쇄 문이 그렇게 많이 필요하지 않습니다. 하나만으로 단순화할 수 있습니다(읽고 수정하기 쉽게 만들 수 있음). 아래 스크립트에서는 $0print 문만 인용되지 않았습니다.

  • 쉘 스크립트에서 awk 전후의 이니셜을 인쇄할 수 있습니다 <table>. </table>awk 스크립트에서 BEGIN 및 END 블록을 사용하여 이 작업을 수행하는 데 아무런 문제가 없지만 단순한 인쇄 문이므로(즉, awk에서 처리가 필요하지 않습니다. BEGIN은 일반적으로 awk 스크립트에 대한 초기 변수 및 기타 조건을 설정하는 데 사용됩니다. END는 일반적으로 나머지 스크립트의 모든 처리에 대한 요약이나 결과, 전체 또는 평균과 같은 최종 출력을 생성하는 데 사용되며 awk 외부에서 실행하는 것이 더 쉽습니다. 더 중요한 것은 awk 스크립팅을 단순화한다는 것입니다.

tmpfile='/tmp/tmp.html'
input='/tmp/tmp.txt'

{
  echo '<table>'
  awk 'NR==2 { print "<tr><td>Hostname</td><td>"$0"</td></tr>" }' "$input"
  echo '</table>'
} > "$tmpfile"

산출:

$ cat /tmp/tmp.html
<table>
<tr><td>Hostname</td><td>machineipaddress</td></tr>
</table>
  • 마지막으로, 코드를 읽을 수 있도록 코드에 줄바꿈과 들여쓰기를 추가합니다. 이와 같은 약간의 awk(또는 기타) 스크립트는 종종 "한 줄"이라고 불릴 수 있지만 이는 한 줄에만 있을 수 있다는 의미는 아닙니다. 작은 따옴표로 묶여 있으므로 줄 바꿈을 포함할 수 있습니다. 매우 긴 코드 줄은 읽고 이해하는 것이 거의 불가능하며, 이는 코드 디버깅이 거의 불가능하다는 것을 의미합니다.

    경험 법칙:각 문 뒤에 개행 문자를 추가합니다..

    awk 스크립트에는 명령문이 하나만 있기 때문에 여기서는 실제로 관련이 없지만 다음 사항도 수행해야 합니다.들여쓰기 코드이렇게 하면 각 중첩 블록이 조금씩 들여쓰기됩니다(탭 또는 몇 개의 공백이지만 일관성이 있어야 하며 각각의 새로운 들여쓰기 수준은 동일한 양의 들여쓰기를 추가해야 함). 이렇게 하면 코드 프로세스를 더 쉽게 볼 수 있습니다.

관련 정보