특이한 파이핑 grep/head 동작

특이한 파이핑 grep/head 동작

저는 SAN의 일부 스냅샷에 대한 작업을 자동화하기 위해 perl 정규식을 사용하여 netadmin을 돕고 있으며 스크립트는 다음과 같은 작업을 수행합니다.

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

물론 이는 head에 대한 stdin이 비어 있으므로 파일 이름을 찾고 있음을 나타내는 것으로 보입니다.

하지만 비어 있을 이유가 전혀 없습니다.

우리가 이런 일을 한다면:

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)

매우 이상하고 무슨 일이 일어나고 있는지 알 수 없습니다. iscsiadm 명령은 명령줄에서 실행할 때와 grepping 후에 실행할 때마다 동일한 내용을 반환합니다.

배관에 뭔가 문제가 있는 걸까요?

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첫 번째 일치하는 줄에서만 작동하도록 지시합니다.

관련 정보