아래에서 작동하는 것은 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 코드 블록에 대한 조건으로 ( )를 사용하세요.또한 인쇄 문이 그렇게 많이 필요하지 않습니다. 하나만으로 단순화할 수 있습니다(읽고 수정하기 쉽게 만들 수 있음). 아래 스크립트에서는
$0
print 문만 인용되지 않았습니다.쉘 스크립트에서 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 스크립트에는 명령문이 하나만 있기 때문에 여기서는 실제로 관련이 없지만 다음 사항도 수행해야 합니다.들여쓰기 코드이렇게 하면 각 중첩 블록이 조금씩 들여쓰기됩니다(탭 또는 몇 개의 공백이지만 일관성이 있어야 하며 각각의 새로운 들여쓰기 수준은 동일한 양의 들여쓰기를 추가해야 함). 이렇게 하면 코드 프로세스를 더 쉽게 볼 수 있습니다.