web-dev-qa-db-ja.com

Awkによる解析

これはすでにUbuntuに新しいので、これがすでに尋ねられている場合は申し訳ありませんが、一般的な形式のテキストファイルを解析する方法が欲しいです:

-------- step 0  ---- cpu =     Time_value  -------
Energy =  Energy_value1   KinEng = KinEng_value1 Temp = Temp_value1

-------- step 10 ---- cpu =     Time_value  -------
Energy =  Energy_value2   KinEng = KinEng_value2 Temp = Temp_value2

具体的には、awkやgrepを使用して時間値とtemp_valueを引き出し、個々の列でファイルに出力する方法を見つけようとしていました

Time_value1 Temp_value1
Time_value2 Temp_value2
etc...

Awkのドキュメントを調べると、awk '/Temp/ {print $9}' file_nameがtemp値を提供し、awk '/cpu/ {print $7}' file_nameがtime_valueを提供するはずですが、それぞれの文字列の異なる列を検索しながら1つのコマンドで両方の文字列を検索するにはどうすればよいですか?つまり、awk '/cpu|sec/ {print}' file_name行を変更して、各文字列の列情報を含めるにはどうすればよいですか。

@steeldriver:テキストファイルの形式は実際のエディターでは読みにくいですが、その形式は「最もクリーンな」ビューのスクリーンショットを添付するためです。

enter image description here

1
Jonathan Tran

必要なawkは次のようになります。

awk -F '=' '/^-/{gsub(/\-*$/,"",$2);print $2}' input.txt

ここでの考え方は、=カラム(またはawk用語-フィールド)セパレータとして。そのため、CPU時間を含む目的の行には、=、左側にあるすべてのものを$1とその右側-$2

その後は、単純な/PATTERN/ {ACTION}構造。ダッシュで始まるパターンに一致する行のみ、終了ダッシュが切り取られ、残りはCPU時間になります。

0

「ユニット」は5行の​​グループです。この状況では、次のことが役立つ場合があります。

awk '{print $1, $11}' RS="cpu =" logfile

どこ RS="cpu ="は、レコード区切り文字(RS)を "cpu ="として再定義します。次に、目的のフィールドを印刷するだけの質問です

0
user216043