여러 가상 호스트가 있는 Apache 가상 호스트 파일을 파일당 하나의 가상 호스트로 분할하는 쉬운 방법이 있습니까?
또는 하나의 가상 호스트만 조작하여 grep 출력을 얻을 수 있는 것입니다.
Bash에서 선호되는 솔루션입니다.
답변1
줄 내용을 기준으로 파일을 분할할 수 있습니다 csplit
. 이것은POSIX 명령하지만GNU 버전몇 가지 유용한 확장 기능이 있습니다. GNU csplit(비포함 Linux, Cygwin)을 사용하여 다음으로 시작하는 각 줄에서 파일을 분할하는 방법은 다음과 같습니다 <VirtualHost
.
csplit -f 'virtualhost-' -b '%03d.conf' all-sites.conf '/^ *<VirtualHost /' '{*}'
휴대용, 이것은 더 투박합니다. 발생 횟수를 세어야 하며 출력 파일 이름은 일련의 숫자로 끝납니다.
csplit -f 'virtualhost-' all-sites.conf '/^ *<VirtualHost /' "{$(($(grep -c '^ *<VirtualHost <all-sites.conf') - 1))}"
어느 쪽이든 첫 번째 파일에는 첫 번째 줄 앞의 모든 내용이 포함되어 있습니다 <VirtualHost
. 줄 앞에 주석이 있으면 <VirtualHost
다음 섹션에 추가되지 않습니다. <VirtualHost
주석 csplit
이 앞에 오는지 뒤에 오는지 알아내는 것은 말할 것도 없고 그렇게 할 만큼 똑똑하지도 않습니다.
콘텐츠 뒤에 출력 파일 이름을 지정하는 등 좀 더 멋진 작업을 수행하려면 awk를 사용할 수 있습니다. csplit 유틸리티는 때때로 편리하지만 awk는 가능한 모든 작업을 쉽게 수행할 수 있습니다.
awk '
BEGIN {output_file = "preamble.conf"}
/^ *<VirtualHost *[^ >]/ {
output_file = "virtualhost-" sub(/ *[:>].*/, "", sub(/^ *<VirtualHost */, "", $0) ".conf";
}
{print >output_file}
' all-sites.conf
답변2
여기서는 작동하지만 완벽하지는 않습니다.
#!/bin/bash
i=1
echo >vhost_${i}.conf
while IFS= read -r lin; do
case $lin in
\<VirtualHost*\>)
true
;;
esac
echo "$lin" >>vhost_${i}.conf
case $lin in
\</VirtualHost\>)
i=$((i+1))
echo >>vhost_${i}.conf
;;
esac
done
다음과 같이 파일 내용을 이 스크립트로 파이프해야 합니다.
cat thenicefile.conf | thisscript
thenicefile.conf에서 가상 호스트 번호가 매겨져 있을 수 있습니다!