awkを使用して、空白ではなく最初の文字でテキストファイルをレコードに分割し、文字列を含むレコードのみを印刷する方法

awkを使用して、空白ではなく最初の文字でテキストファイルをレコードに分割し、文字列を含むレコードのみを印刷する方法

情報が塊で区切られたテキストファイルがあります。このチャンクをレコードに分割して個別に処理したいです。

これは私のテキストファイル(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{} 部分はループが完了した後に実行され、入力の最後のレコードの場合を処理します。

おすすめ記事