grep(またはsed?):一致するものを見つける前に、指定された行数をスキップします。

grep(またはsed?):一致するものを見つける前に、指定された行数をスキップします。

私は時間が経つにつれて蓄積される巨大なログファイルを扱っており、切り取ったり回転したりすることはできませんが、毎時間新しい項目を解析する必要があります。

grep私は特定の文字列を持つアイテムを取得し、取得したアイテムの数を数えて最初のアイテムを捨てるために使用しましたNNアイテム数はどこにありますか?

以前のループをすべて収集しましたが、これはもちろん、各ループがファイル全体を効果的に把握できないことを意味します。私はUnixに対して比較的素朴ですが、これを行うより効率的な方法があると思いますか?tail最後の解析以降、どのように多くの新しい行が作成されたのか分からないので、それはうまくいかないと思います。この投稿スキップについて話しますが、検索文字列を使用してスキップする行数を決定しますが、スキップ番号をパラメータとして指定したいと思います。これ各行で指定された数の文字をスキップすることについて話しますが、指定された数の行をスキップしたいと思います。

どんな提案がありますか?

答え1

子孫のために公開されたQを書いている間に見つけました。

tail -n+N file | grep ...

ここで、Nはスキップされた行数から1を引いたものです。

答え2

sed初期行数をスキップするために使用できます。注文する

sed '1,200d'

最初の200行は削除され、他のすべての行は変更されていません。

今回もawk同様の方法で使用できます。

awk 'FNR > 200'

上記のコマンドは行201と次の行を印刷しますが、前の行は削除します。このFNR変数は、現在のファイルから読み取られたレコード数です(デフォルトは行数)。

簡単にパラメータ化して、コマンドラインから数字を取得できます。

awk -v n=200 'FNR > n'

次のものと組み合わせることもできますgrep(次に置き換えられる関数)。grepawk

awk -v n=200 'FNR > n && /pattern/' somefile

...pattern拡張された正規表現がある場所です。

または、コマンドラインの値からパターンを取得するには、次の手順を実行します。

awk -v n=200 -v p='pattern' 'FNR > n && $0 ~ p'

または、より安全に環境変数を使用してください。

pattern='pattern' awk -v n=200 'FNR > n && $0 ~ ENVIRON["pattern"]' somefile

関連情報