저는 네트워크 관리자가 Perl 정규 표현식을 사용하여 SAN에서 일부 스냅샷을 자동화하도록 돕고 있습니다. 우리 스크립트는 다음을 수행합니다.
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$1/')
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1 | perl -pe 's/^tcp: \[\d*\] \d*\.\d*\.\d*\.\d*:\d*,\d* (iqn\..*\..*\..*:.*-.*-.*-.*-(.*-.*-\d{4}-\d{2}-\d{2}-\d{2}:\d{2}:\d{2}\.\d*\.\d*))$/$2/')
스냅샷의 서명에는 두 부분이 있는데, 하나는 다른 하나 안에 중첩되어 있으며 캡처 그룹을 사용하여 이름의 일부와 실행해야 하는 다양한 후속 명령을 캡처합니다. 나는 그것이 동일한 명령을 반복해서 실행하고 정규식을 나중에 정리할 수 있다는 것을 알고 있지만 기본적으로 그들은 perl을 사용하여 대괄호를 하나씩 출력합니다.
tcp: [32] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
tcp: [33] 40.40.40.101:3260,1 iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
icsiadm 및 grep의 결과를 캡처하여 다음 결과를 얻으려고 합니다.
iqn.2001-05.com.equallogic:4-52aed6-91c5ffa78-2f0d8ae18504fee1-r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
그리고
r12prd-rbmsdata1-2012-06-29-16:07:40.108.1
우리가 가진 문제는 때때로 첫 번째 줄에 대한 파이프가 실패한다는 것입니다.
head: cannot open '–n1' for reading: No such file or directory
물론 이는 헤더의 표준 입력이 비어 있어서 파일명을 찾고 있음을 나타내는 것으로 보입니다.
하지만 항상 비어 있어야 할 이유는 없습니다.
이렇게 하면:
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
두 번째 변수는 실패하고 두 번째 변수는 비어 있습니다.
그러나 이를 뒤집으면 varsnap1이 실패합니다.
varsnap1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
varinit1=$(iscsiadm -m session | grep rbmsdata1 | head -n1)
그것은 이상하고 우리는 무슨 일이 일어나고 있는지 모릅니다. 명령줄에서 grep 이후에 iscsiadm 명령을 실행하면 실행할 때마다 동일한 내용이 반환됩니다.
뭔가 파이프를 엉망으로 만들었나요?
RedHat Enterprise Linux의 헤드 버전 5.97
답변1
귀하의 질문에 오류가 있을 수 있지만(일반 대시 대신 긴 utf8 대시):
$ head –n1
head: cannot open ‘–n1’ for reading: No such file or directory
$ head -n1 # ctrl-d
$
한 번만 발생했기 때문에 브라우저 문제라고 생각합니다. head
어쨌든 필요할 때 입력을 기다리십시오. head -n1
다음 중 하나로 바꿔보세요 .
sed -n 1p
awk 'NR==1 {print}' # yay, no potential dash problems
좋습니다. 이를 수행하는 방법이 있지만 해당 파이프 요소를 건너뛰고 grep
매개변수를 추가하여 첫 번째 일치 항목만 반환하도록 지정할 수도 있습니다 -m 1
. 또는 두 요소를 모두 제거하고 perl
일치하는 첫 번째 행에서만 작동하도록 지시합니다.