awkを使用してログファイルをフィルタリングしようとしています。フィルタリングは時間ベースであり、時間範囲外のログファイルエントリは削除されますが、その範囲内のエントリは保持されます。これで、特定の時間範囲内の項目が見つかると、後続のすべての項目もその時間範囲内にあることがわかります。
これで確認は不要です。それでは、awkがこれをきちんと実行する方法はありますか?私は、フラグ変数を使用してもはやチェックがないことを示し、各行を印刷できることを意味します。しかし、「残りのすべての行を処理してください」と言う方法はありますか?
答え1
awk 'flag == 0 || some_test { flag = 1 } flag == 1 { processing }'
これは、ブール/バイナリ「フラグ」を使用して、処理がファイルの終わりまで続くことができるタイミングを追跡します。
最初のブロックは、データが処理を開始できるポイントをテストします。問題は、some_test
すでに既存のテストがあることです。どのくらいかかりますかflag == 0
。テストが true の場合、フラグが切り替わり、1
テストが無効になり、processing
ブロックが有効になります。
最後のブロックは、ユーザーをトリガーした最初の行からsome_test
ファイルの終わりまで、すべての行に対して実行されます。
答え2
あなたのログの時間が昇順にソートされているとします。
「いったん時間範囲内にある項目を見つけたら、次の項目もすべてその時間範囲内にあることがわかります」という条件は、次のように作成できます。
1
time >= start_of_range , 0 { print }
どこ:
time
処理中の行から時間を抽出するフィールドまたは式。start_of_range
処理時間範囲の最小値です。,
Awk が ranges を理解する方法で a を表現するとrange
、 the の左が,
最初に true のときに始まり、 the の右が,
true のときに終わります。この場合、never(0)は右のコマンドを最後まですべての後続の行に適用しますprint
。
awkスクリプトの最初の行に次のように入力します。
awk '$7 >= "2015-08-12" , 0 { print }'
実際のモード(一致範囲)のデフォルト動作なので、印刷も削除できます。
awk '$7 >= "2015-08-12" , 0'
2
別のアプローチは、テストを交換し、以下を行うことです。
awk '$7 < "2015-08-12" {next}
{print}
' file
簡単に次のように書くことができます。
awk '$7 < "2015-08-12" {next} 1' file
ただし、すべての行のテストは引き続き評価されます。
答え3
1.はい、使用してください範囲0
orで終了条件""
(= false、一致しません):
awk '<is_within_the_range>, 0'
<is_within_the_range>
他の範囲を除くすべての式になる条件はどこにありますか?
開始条件は次のとおりです。いいえ最初のゲームが終わったら、もう一度評価してみてください。
$ seq 1 6 | awk '
function check(){ print "checking", $0; return $1 == 3 }
check(), 0
'
checking 1
checking 2
checking 3
3
4
5
6
2.範囲が気に入らない場合は、Cのように条件が一致する限り、すべての行を明示的に印刷して、慌てずにすべての操作を実行できます。
seq 1 6 | awk '$1==3 { do print; while (getline > 0) }'
三。POSIX規格によると、別の解決策は次のとおりです。しなければならない一般検索可能ファイルの使用(パイプではありません!)、しかし実際には動作しませんほとんどのawk実装では、すべてのPOSIXユーティリティがそうであるように、awkを使用して終了時に最後のレコードの終わりにファイルポインタを設定します。リクエストを受ける:
seq 1 6 > file
{ awk '$1 == 3 { print; exit }'; cat; } < file
IMLEこれは、* BSDの「one true awk」または「one true awk」ではなく、Solarisのawk
/でのみ機能します。nawk
gawk
mawk
4.最後に、低速の高級言語で独自のステートマシンを作成できます(フラグを設定してから確認するなど)。すでに素敵でシンプルなインターフェースを提供しますが、考慮する価値があるのはとても愚かです。
答え4
ファイル行に PATTERN が含まれている場合、その行と次の行の両方が印刷されます。
awk 'flag || /PATTERN/{flag=1} flag{print $0}' file
さらに処理が必要な場合は、「print $ 0」を別のコードに置き換えることができます。