Cisco 패브릭 구성의 Excel 스프레드시트를 생성 중이며 가져올 필드/열에 직접 서식을 적용하고 싶습니다.
물론 수정된 정보가 포함된 형식은 다음과 같습니다.
zone name Zone1_HOSTNAME01 vsan XXX
fcalias name STORAGEPORT_0 vsan XXX
pwwn xx:xx:xx:xx:xx
fcalias name STORAGEPORT_1 vsan XXX
pwwn xx:xx:xx:xx:xx
fcalias name STORAGEPORT_2 vsan XXX
pwwn xx:xx:xx:xx:xx
zone name Zone2_HOSTNAME02 vsan XXX
fcalias name STORAGEPORT_3 vsan XXX
pwwn xx:xx:xx:xx:xx
fcalias name STORAGEPORT_4 vsan XXX
pwwn xx:xx:xx:xx:xx
fcalias name HOSTNAME02 vsan XXX
pwwn xx:xx:xx:xx:xx
따라서 내가 원하는 것은 영역 이름 ZONE NAME의 모든 내용을 1 필드의 "vsan" 공간에 포함시킨 다음 "zone name"이 포함된 줄의 시작 부분이 나타날 때까지 각 문자열을 자체 필드에 넣는 것입니다. 그런 다음 구분 기호를 사용하여 원하는 것을 얻을 수 있습니다. 그래서 본질적으로 내가 궁극적으로 원하는 것은 다음과 같습니다.
"zone name Zone1_HOSTNAME01" "vsan" "XXX" "fcalias name" "STORAGEPORT_0 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_1 vsan XXX" "pwwn xx:xx:xx:xx:xx" "fcalias name" "STORAGEPORT_2 vsan XXX" "pwwn xx:xx:xx:xx:xx"
또는 그런 것. 나중에 열을 더 쉽게 조작할 수 있으므로 각 공백은 자체 필드에 있을 수 있습니다.
텍스트 파일에는 800줄이 넘으며 일부는 더 클 수도 있지만 명확하지 않습니다. 가장 큰 문제는 "Area Name...."으로 시작하는 첫 줄 뒤에 오는 텍스트가 다를 수 있으므로 다음에 오는 내용에 관계없이 그냥 해당 필드로 번역합니다.
답변1
다음 스크립트는 필드 내에 공백이 있기 때문에 perl
탭으로 구분된 형식( )으로 입력 파일을 출력합니다 .markizy.txt
#!/usr/bin/perl
while(<>) {
chomp;
s/ +(vsan|fcalias|pwwn) */\t$1 /g ;
s/ +\t/\t/;
if ($. > 1 && m/^zone name/) {
print $l,"\n";
$l = $_;
} elsif (eof) {
$l .= $_;
print $l,"\n";
} else {
$l .= $_;
};
};
perl
$.
내장 변수는 현재 줄 번호이므로 스크립트는 input 의 첫 번째 줄에 있을 때 인쇄(빈 줄)를 방지합니다. 이 변수와 기타 여러 변수(및 for와 같은 긴 별칭)에 대한 자세한 내용은 zone name
참고자료를 참조하세요 .man perlvar
$INPUT_LINE_NUMBER
$.
파일로 저장하고 를 사용하여 실행 가능하게 만든 chmod +x
후 실행합니다. 예를 들어 cat -T
탭( ^I
)을 표시합니다.
$ ./markizy.pl markizy.txt | cat -T
zone name Zone1_HOSTNAME01^Ivsan XXX^Ifcalias name STORAGEPORT_0^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_1^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_2^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx
zone name Zone2_HOSTNAME02^Ivsan XXX^Ifcalias name STORAGEPORT_3^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name STORAGEPORT_4^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx^Ifcalias name HOSTNAME02^Ivsan XXX^Ipwwn xx:xx:xx:xx:xx
파이핑을 하면 cat -T
출력에 탭으로 구분된 필드가 있음을 알 수 있습니다(그렇지 않으면 공백과 크게 다르지 않기 때문입니다). 실제로 실행할 때 사용하지 말고 파일로 리디렉션하십시오. Excel(또는 gnumeric
거의 Libre Office Calc
모든 다른 스프레드시트)은 탭으로 구분된 텍스트 파일을 가져오는 데 아무런 문제가 없습니다. 이는 제가 기억하는 한 거의 오랫동안 표준 기능이었습니다.
실제로 실행하려면:
./markizy.pl markizy.txt > markizy.csv
가져올 때 데이터가 쉼표로 구분되지 않고 탭으로 구분되어 있음을 Excel에 알려야 할 수도 있습니다. 그렇지 않으면 해당 사실을 감지할 수 있습니다.
또는 데이터 필드에 쉼표가 포함되어 있지 않다고 확신하는 경우 \t
스크립트의 모든 s를 쉼표로 바꾸어 쉼표로 구분할 수 있습니다.
답변2
답변3
분명히 일부 필드는 정렬된 데이터를 가져온 후 Excel에서 생성하는 문자열에서 고려되므로 생략될 수 있습니다. 더 나은 옵션이 있다고 확신하지만 이는 내 출력을 모두 차지하고 모든 값을 새 줄에 순서대로 배치한 다음 vsan|pwwn|'zone name'|fcalias에 대해 필요하지 않은 필드를 제거하고 나뭇잎을 남깁니다. me 영역 및 구성원 별칭과 pwwn 항목만 있으면 됩니다. 또한 모든 영역이 대문자 Z로 시작하므로 더 간단해집니다.
한 줄에 사용하는 코드는 다음과 같습니다.
grep -oP '\S+' switch01-zones-20160711 | grep -Ev 'name|vsan|^01|^02|fcalias|pwwn|zone' | awk '{printf "%s%s", (/^Zone/?rs:FS), $0; rs=RS} END{print ""}' >to-import.csv
이로 인해 각 지역에 대한 멋진 단일 행과 문자열 작성을 위해 Excel로 가져온 연결된 www 장치의 구성원 별칭이 모두 짧은 시간에 남았습니다.