파일에 여러 개의 가상 호스트가 있고 각 가상 호스트를 .이 있는 파일로 나누고 싶습니다 ServerName
. 이 파일을 찾고 있습니다.
<VirtualHost *:80>
ServerName host1.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName host2.example.com
</VirtualHost>
<VirtualHost *:80>
ServerName hostN.example.com
</VirtualHost>
서브파일로 host1.example.com
....hostN.example.com
나는 이것을 보았다Q&A, 이는 내가 찾고 있는 것과 가장 가깝지만 두 줄을 어떻게 일치시키는지 잘 모르겠습니다. 중첩된 if 문을 시도했지만,
gawk '{
if(match($0, /(\<VirtualHost \*:80\>)/, v)){
if(match($0, / ServerName (.*)/, s)){
name=s[1]
{print name}
}}}
' samplevhost
그리고
gawk '{
if(match($0, /(\<VirtualHost \*:80\>)(\n )(ServerName)(.*)/, k)){
name=k[1]
{print name}
}}
' samplevhost
화면에 인쇄되지만 출력이 나오지 않습니다. 내가 무엇을 놓치고 있나요?
답변1
가상 호스트 정의가 빈 줄로 구분되어 있다고 판단되면 입력 파일을 하나 이상의 빈 줄로 구분된 줄 덩어리로 분할하고 Not 대신 덩어리 단위로 파일을 처리하는 Perl의 "단락 모드" slurp를 사용할 수 있습니다. 한 줄씩(이것이 아마도 gawk
스크립트 실패의 원인일 것입니다). 다음을 사용하여 "섹션별로" 파일을 처리합니다 -n00
( 참조 ).perlrun(1)
perl -n00 -e '
/ServerName\s+(.*)/;
$file = $1;
open $fh,">",$file or die "Failed to open file $file for writing: $!\n";
print $fh $_;
close $fh' your_file_here