情報が塊で区切られたテキストファイルがあります。このチャンクをレコードに分割して個別に処理したいです。
これは私のテキストファイル(file.txt)です。
Alarm Stats:
com.android.calendar
38ms running, 0 wakeups
1 alarms: act=com.android.calendar.APPWIDGET_SCHEDULED_UPDATE dat=content://com.android.calendar typ=vnd.
com.android.providers.calendar
2ms running, 2 wakeups
2 alarms: act=com.android.providers.calendar.intent.CalendarProvider2 flg=0x14
android
35563ms running, 11 wakeups
1 alarms: act=android.intent.action.DATE_CHANGED flg=0x20000014
1210 alarms: act=android.intent.action.TIME_TICK flg=0x40000014
120 alarms: act=com.android.server.ThrottleManager.action.POLL flg=0x14
1 alarms: act=android.net.wifi.DHCP_RENEW flg=0x14
10 alarms: act=android.content.syncmanager.SYNC_ALARM flg=0x14
com.apollo.apollonetworkcheck
1026ms running, 88 wakeups
88 alarms: flg=0x14
com.android.phone
4ms running, 0 wakeups
2 alarms: act=com.android.phone.UPDATE_CALLER_INFO_CACHE flg=0x14
検索文字列として「apollo」を使用すると、出力は次のようになります。
com.apollo.apollonetworkcheck
1026ms running, 88 wakeups
88 alarms: flg=0x14
これまで私のコマンドラインにこれがありますが、検索文字列 "apollo"をどこに置くべきかわかりません。また、レコード区切り文字に「空白なし」を指定する方法がわかりません。
$ awk 'BEGIN { RS = "^RTC" } { print $1 }' file.txt
Archemar、wurtel、steeldriver、terdon、あなたの答えは素晴らしく、問題に多くのコンテンツとリソースソリューションを追加します。私はすべての答えが価値があるので投票しました。もちろん、「gawk」を含むコマンドは、unix / linuxコマンドの使用の問題と目標をより正確に表現します。
ベストアンサー1
私はいつもすべてにPerlを入れました:-)
perl -ne 'if (/^\s/) { $x.=$_ }else{print $x if $x=~/apollo/; $x=$_} END {print $x if $x=~/apollo/}' file.txt
編集:1行の説明:
- -nは基本的に各ループの終わりに印刷せずに入力を繰り返すことを意味します(-pは同じですが、デフォルトでは行を印刷します)。
- -e は式またはコードスニペットを指定します。これは暗黙のループ内で行われます。
- 完全な「レコード」が見つかるまで$ x変数を使用して入力テキストをバッファリングします。
- /^\s/ は行の先頭のスペースと一致します。見つかると、入力行が$ xバッファに追加されます。そうでない場合は、「logging」が完了し、検索文字列「apollo」がチェックされます。見つかったら、記録を印刷します。バッファは処理後にクリアされます。
- END{} 部分はループが完了した後に実行され、入力の最後のレコードの場合を処理します。