내 서버에서 로그 파일로의 연결을 확인할 때 내 사용자 정의 메시지를 리디렉션하고 싶습니다. 조건을 해제하기 위해 종료 1을 사용합니다. 그런데 조건을 더 자세하게 만들고 로그 파일로 리디렉션하려면 어떻게 해야 합니까?
awk
메시지를 리디렉션에 잘 맞도록 내부에 이를 구현하려면 어떻게 해야 합니까 ?
awk { ... "Connectivity to ${rda} failed, exiting" >> ${log} ... } then
내 스크립트는 다음과 같습니다.
#/bin/bash
rda="www.google.com"
log="/var/log/connectivity.log"
if nc -zw1 ${rda} 22 && echo |openssl s_client -connect ${rda}:22 2>&1 |awk '
handshake && $1 == "Verification" { if ($2=="OK") exit;exit 1; }
$1 $2 == "SSLhandshake" { handshake = 1 }'
then
echo -e "Connectivity works" >> ${log}
exit 0
fi
내 awk 버전은 다음과 같습니다.
# awk -W version mawk 1.3.3 Nov 1996, Copyright (C) Michael D. Brennan
compiled limits: max NF 32767 sprintf buffer 2040
답변1
print
다음의 파일을 사용할 수 있습니다 .awk
print "data" >"somefile.log"
또는
filename="somefile.log"
print "data" >filename
를 사용하면 >
첫 번째 파일의 파일이 잘리지 print
만 스크립트가 끝나거나 명시적으로 파일을 열 때까지 파일은 열린 상태로 유지됩니다 close()
. 파일이 열리면(첫 번째 파일 이후 print >
) 후속 호출이 print >
잘림 없이 파일에 추가됩니다.
기존 파일에 추가하려면 print >>
.
명령줄에서 로그 파일 이름을 사용하는 예:
... | awk -v out="$log" { print "this is a message" >>out }
또는,
... | out=$log awk { print "this is a message" >>ENVIRON["out"] }
위의 코드는 (아마도) 기존 파일(경로 이름이 쉘 변수에 있음)에 추가됩니다 log
. 두 번째 예에서는환경 변수 out
$log
쓸 파일 경로로(명령줄에서 설정됨 awk
)
답변2
이미 설명했듯이 이 구성을 사용하여 파일을 쓰고 계속 쓸 수 있습니다.
awk '{ print "hello, world" >>"file.log" }'
퍼즐의 또 다른 부분은 복잡한 참조를 사용하지 않고 쉘 변수를 얻는 방법입니다 $log
. awk
이 -v
플래그를 사용하면 변수를 정의할 수 있습니다 awk
. 이 경우 이를 쉘 변수의 값으로 설정합니다 $log
.
awk -v logfile="$log" { print "Appending to", logfile, "here" >>logfile }'
( 변종(적어도 및 )이 내장 으로 사용되고 재정의가 허용되지 않기 log="$log"
때문에 사용하지 않습니다 .)awk
mawk
gawk
log
답변3
모든 로깅을 단일 awk
스크립트로 결합할 수 있습니다. 스크립트를 조정해 보세요.
awk -v rda="${rda}"'
handshake &&
$1 == "Verification" {if ($2=="OK") {print "Connectivity works"
exit
}
print "Connectivity to " rda " failed, exiting"
exit 1
}
$1 $2 == "SSLhandshake" {handshake = 1
}
' >> "${log}"
일반 출력과 오류 출력을 구별하려면 /dev/stderr
내부에서 오류를 리디렉션하세요 awk
.