現用のNetAppの状況確認をするために「perfstatデータ収集ツール」というのが配布されている。
rsh/sshで対象のNetAppにログインして、いろんなコマンドを実行して、1つのテキストファイルとして出力をする。
この「1つのテキストファイル」というのがくせ者で、200MBぐらいのファイルができたりする。
これだとエディタで取り扱いづらいので細かく分割することにした。
中をみてみると「=-=-=-=-=-= CONFIG IPアドレス PRESTATS =-=-=-=-=-= aggr status -v」という感じで「 =-=-=-=-=-= 」区切りでファイルが出力されている。
それを元にファイルを分割したのが下記スクリプト。
$inputfile="x:\tmp\source\perfstat7_20191122_1400.txt" $outdir="x:\tmp\output" $filename="" Get-Content $inputfile -Encoding UTF8 | ForEach-Object { $line=$_ if( $line.Contains("=-=-=-=-=-=") ){ $filename=$line $filename=$filename.Replace("=-=-=-=-=-= ","") $filename=$filename.Replace("/","-") $filename=$filename.Replace(":","") $filename=$outdir+"\"+$filename+".txt" New-Item $filename } if($filename -ne ""){ $line | Add-Content $filename } }
今回は1回しか実行しないので速度を気にする必要がないので簡単さを優先している。
もし、出力速度を気にするのであれば1行毎にAdd-Contentするのは非常に効率が悪いので工夫が必要となる。
参考例:「PowerShellで巨大なファイルをGet-Contentし、Export-Csvするのを省メモリで行う」
2019/11/25 追記
上記のスクリプトだと遅すぎで、約200MBのファイル処理に5時間かかりました。
やはり改行のみ行が数万行ある、というのが悪かったようです。
また、同じヘッダ行が何回か登場するようで単純に「New-Item」としているとファイル名が重複しているというエラーがでてしまっていました。
さすがに5時間はないなーということで、高速化処理をしたのが下記となります。
実行にかかる時間は2分と大幅短縮となりました。
$inputfile="x:\tmp\source\perfstat7_20191122_1400.txt" $outdir="x:\tmp\output2" $filename="" $results=@() $linecount=0 Get-Content $inputfile -Encoding UTF8 | ForEach-Object { $line=$_ if( $line.Contains("=-=-=-=-=-=") ){ if($filename -ne ""){ $results | Add-Content $filename $results=@() $linecount=0 } $filename=$line $filename=$filename.Replace("=-=-=-=-=-= ","") $filename=$filename.Replace("/","-") $filename=$filename.Replace(":","") $filename=$outdir+"\"+$filename+".txt" if ( !(Test-Path $filename) ){ New-Item $filename } } if($filename -ne ""){ $results += $line $linecount++ if(($linecount % 1000) -eq 0 ){ $results | Add-Content $filename $results=@() } } }
“NetAppのperfstatデータ収集ツールで取得したファイルを分解する” への1件の返信