패턴별로 파일 분할

패턴별로 파일 분할

여러 가상 호스트가 있는 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에서 가상 호스트 번호가 매겨져 있을 수 있습니다!

관련 정보