2012-12-20 3 views
2

배경 : 우리는 테이프 라이브러리와 백업 소프트웨어 인 NetWorker를 사용하여 여기에 데이터를 백업합니다. 설치되어 클라이언트는 매우 기본이며, 우리는 둘 이상의 대상 디렉토리를 복원해야 할 때 우리는 단순히 다음 줄의 X와 스크립트를 통해 백그라운드에서 X 클라이언트 인스턴스를 호출하는 스크립트를 만들 :내 정규식이 너무 욕심이 많습니까?

recover -c client-srv -t "Mon Dec 10 08:00:00" -s barckup-srv -d /dest/dir/ -f -a /src/dir & 

문제는 동일한 머신에서 동시에 백업되는 서로 다른 파티션/디렉토리가 여러 개의 다른 테이프에 퍼져있을 수 있으며 백업 및 복원간에 라이브러리에서 일부 테이프가 제거되었을 수 있다는 것입니다.

최근까지 사람들이 필요한 테이프가 무엇인지 알아내는 유일한 방법은 라이브러리가 특정 테이프가 없다는 불평을 기다리는 것 외에 다른 테이프를 사용하여 가짜 복원을 설정하는 것입니다. 진절머리 나는 오래된 데스크탑 GUI 클라이언트와 특정 메뉴 옵션을 누르십시오. 첫 번째 옵션은 테이프가 오프 사이트로 밝혀지면 되돌아 오는 데 하루가 걸리고 초는 지루하고 시간이 많이 걸립니다.

실제 질문 : 나는 위의 명령으로 이미 작성한 스크립트를 읽고 대화식 CLI 클라이언트로 보내고 어떤 테이프를 뱉어내는 "메타"스크립트를 작성했습니다 필요한 경우, 실제로 라이브러리에있는 경우. 이렇게하려면 스크립트는 필요한 정보를 꺼내 다음과 같은 정규 표현식을 사용

# pull out a list of the -a targets 
restore_targets="`sed 's/^.* -a \([^ ]*\) .*$/\1/' $rec_script`" 

# pull out a list of -c clients 
restore_clients="`sed 's/^.* -c \([^ ]*\) .*$/\1/' $rec_script`" 
numclients=`echo $restore_clients | uniq | wc -l` 

# pull out a list of -t dates 
restore_dates="`sed 's/^.* -t \"\([^\"]*\)\" .*$/\1/' $rec_script`" 
numdates=`echo $restore_dates | uniq | wc -l` 

내가 이름을 기억하지 않는 점, 정규 표현식에의 s/\(x\)/\1/ 유형을 사용하여 몹시 익숙하지 않다, 그러나입니다 이게 내가하고있는 일을 성취하는 가장 좋은 방법이야? 명령 으로 작동하지만 불필요하게 .*을 사용하고 있는지 궁금합니다.

+0

읽고있는 데이터 샘플을 제공 할 수 있습니까? 어쩌면 당신이 실제로 찾고있는 무엇인가? 나는 Regex를보고 있지만, 당신이 읽고있는 샘플을 보지 않고 무엇을 얻고 싶은지 정확히 알 수는 없다. – Nick

+0

@Nick 그는 위에서 인용 한 것과 같은 라인을 포함하고있는 스크립트에서'recover'로 시작하여 읽고 있습니다. – Barmar

+0

@Barmar 와우, 이것은 내가 오늘 아침에 커피를 빼먹었습니다. 나는 그것을 지금 본다. – Nick

답변

1

\1은 제 1 포획기를 지칭한다. foo(.*?)\1으로 바꾸고 foobar을 입력하면 결과 텍스트는 bar이되며 \1은 첫 번째 캡처 그룹에서 캡처 한 텍스트를 가리 킵니다.

귀하의 질문에 관해서는, 파이썬 (또는 다른 높은 수준의 스크립트 언어)를 사용하여 인수를 구문 분석하는 데 안전하고 쉽게 할 수 있습니다
>>> import shlex 
>>> shlex.split('recover -c client-srv -t "Mon Dec 10 08:00:00" -s barckup-srv -d /dest/dir/ -f -a /src/dir &') 
['recover', '-c', 'client-srv', '-t', 'Mon Dec 10 08:00:00', '-s', 'barckup-srv', '-d', '/dest/dir/', '-f', '-a', '/src/dir', '&'] 

지금,이 작업하기가 훨씬 쉽다. 따옴표가 없어지고 명령의 모든 구성 요소가 잘 정리되어 목록에 포함됩니다.

완전히 완전하게하려면 argparse을 사용하고이 명령 줄에 대해 자신 만의 파서를 구현하십시오. 이렇게하면 쉽게 정보를 얻을 수 있지만 상황에 따라 지나치게 길 수도 있습니다.

당신의 실제 질문에 관해서는, 당신은 정규식을 해부 할 수 있습니다 :이 정규식 -t "foo \" bar"을 캡처

^.* -t "([^\"]*)" .*$ 

, 비 욕심 버전은 -t "foo \"에서 멈출 것입니다 동안.

+0

실제로'^. * -t "([^"] *) ". * $'[백 슬래시 없음],'''에 래핑되기 때문에 그냥 이스케이프해야합니다. 또한 Python과 같은 것을 사용하고 싶지만 스크립트는 HPUX 시스템에서 실행할 수 있어야하므로 약 1984 년 이후의 모든 언어/구문이 작동하지 않습니다. – Sammitch

+0

@Sammitch : 그게 사물을 복잡하게합니다. 현재 정규 표현식이 작동하면 작동합니다. – Blender

관련 문제