私の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で各行の2番目のフィールドを印刷できます。
awk -v FS=" : " -v ORS="" '{{print $2,"- "}; if ( $0 ~ /^$/) {print "\n"}}' stats.txt