산출

산출

stats.txt페이지에는 다음이 있습니다.

Get-VMHardDiskDrive | Select-Object Path

ComputerName : ACD-VMH04
Path         : D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd
VhdFormat    : VHD
VhdType      : Dynamic
Used Space   : .07
Prov Space   : 4.00

ComputerName : ACD-VMH04
Path         : D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd
VhdFormat    : VHD
VhdType      : Dynamic
Used Space   : 258.04
Prov Space   : 906.34

AWK나는 이것을 제공하기 위해 다음 명령을 실행합니다 .

ACD-VMH04
D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd
VHD
Dynamic
.07
4.00

ACD-VMH04
D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd
VHD
Dynamic
258.04
906.34

파일에는 유사한 항목이 6개 정도 있는데 다른 파일에는 더 많은 항목이 있으므로 출력을 다음과 같이 표시하려면 어떻게 해야 하는지 궁금합니다.

ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic - .07 - 4.00
ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic - 258.04 - 906.34

이것은 어느 정도 작업을 수행하지만 빈 줄을 만났을 때 중지하고 줄 바꿈하도록 지시하는 방법을 모르겠습니다.

awk -F  " : " '{ ORS = " " } /Select-Object Path/ { output = 1; start = NR + 2 }; output && NR >= start { print $2, "-" }' stats.txt

답변1

줄은 없지만 여기서 핵심 개념은 모든 것을 수집할 때까지 필드를 저장한 다음 줄에 인쇄하는 것입니다. 또한 빈 행의 필드 개수(NF)는 0입니다.

암호:

#!/bin/awk -f
BEGIN {FS = " : "; OFS = " - "}
NF > 0 {
    gsub(/[ ]+$/, "", $1)
    a[$1] = $2
}

NF == 0 {dump()}

END {dump()}

function dump() {
    print a["ComputerName"], a["Path"], a["VhdFormat"], a["VhdType"]
}

결과:

ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic
ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic

답변2

perl -lne '
   /Select-Object Path/ and !$a++ and <>,next;

   /^ComputerName\s+:/ && $a .. /^$/ || eof and do{
      push  @A, (/\s+:\s+\K(.*)/)[0]          if /^ComputerName\s+:/ || /./;
      print join(" - ", splice(@A,0,@A)),"\n" if /^$/                || eof;
   };

' stats.txt

산출

ACD-VMH04 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\f9314d7d-5d2d-11e0-8feb-806e6f6e6963_2012-06-29T153327.vhd - VHD - Dynamic - .07 - 4.00

ACD-VMH05 - D:\HYPER-V\VMDEV01\Virtual Hard Disks\C_2012-06-29T153327.vhd - VHD - Dynamic - 258.04 - 906.34

답변3

":"를 구분 기호로 사용하고 awk에서 각 줄의 두 번째 필드를 인쇄할 수 있습니다.


awk -v FS=" : " -v ORS="" '{{print $2,"- "}; if ( $0 ~ /^$/) {print "\n"}}' stats.txt

관련 정보