これはすでに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:テキストファイルの形式は実際のエディターでは読みにくいですが、その形式は「最もクリーンな」ビューのスクリーンショットを添付するためです。
必要なawk
は次のようになります。
awk -F '=' '/^-/{gsub(/\-*$/,"",$2);print $2}' input.txt
ここでの考え方は、=
カラム(またはawk用語-フィールド)セパレータとして。そのため、CPU時間を含む目的の行には、=
、左側にあるすべてのものを$1
とその右側-$2
。
その後は、単純な/PATTERN/ {ACTION}
構造。ダッシュで始まるパターンに一致する行のみ、終了ダッシュが切り取られ、残りはCPU時間になります。
「ユニット」は5行のグループです。この状況では、次のことが役立つ場合があります。
awk '{print $1, $11}' RS="cpu =" logfile
どこ RS="cpu ="
は、レコード区切り文字(RS)を "cpu ="として再定義します。次に、目的のフィールドを印刷するだけの質問です