通常、ログを検索すると最近のイベントが見つかります。最後に、bashプロンプトでTabキーを押して名前を完成させました。
最後に、日付算術を使用してファイル名を作成するbashエイリアスを作成しました。次のようなもの
grep <test> `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-3 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-2 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-1 days"` grep 400 `date '+localhost_access_log.%C%y-%2m-%2d.txt' -d "-0 days"`
これを最適化する方法はありますか?理想的には、localhost_access_log.2019-06-24.txtやapi-2019-06-24-1.logなどの3つの最新ファイルをgrepするために複数のエイリアスを作成したいと思います。日付コマンドコード。本質的に、私が送信したパターンに基づいて、今日のログファイルを含む4つの最新のファイル名を返し、grepコマンドに渡すことができるbash機能のヘルプを探しています。
答え1
こだわらない場合は、次のように簡単にこれを実行bash
できます。zsh
setopt extendedglob
grep <test> *(ND.om[1,4])
現在のディレクトリの4つの最新ファイルを検索します。
説明する:
N
- 「null glob」をオンにします(globパターンが一致しない場合は自動的にすべてを置き換えます)。D
- 「GLOB_DOTS」を開く(「隠しファイル」とも一致).
- 一般的なファイルの一致om
- 修正時間でソート[1-4]
- 配列添え字
純粋なbashソリューションは次のとおりです。
grep test $(ls -1rt | tail -n 4)
(ただし、スペースを含むファイル名などの奇妙なファイル名では失敗します。)
find . -maxdepth 1 -type f -name "pattern" -mtime -1 -exec grep test {} +
pattern
現在のディレクトリで、最後の日に変更された名前と一致するファイルを検索します(4つ以上の場合がありますが、0つの場合もあります)。ただし、ファンキーなファイル名は処理できます。
答え2
これはbash
シンプルさに基づくソリューションです。ls
各ログファイルが特定の日付のものであると仮定し、指定されたワイルドカードに一致するN個の最新のファイルを一覧表示するように機能します。
$ grep test $(ls -tr localhost_access_log.*.txt | tail -4)
これがls出力を解析するのに賢明ではない場合と見なされる場合は、代わりに次のようにします。
$ grep test $(find . -name localhost_access_log.\*.txt -mtime -3d)
一般に、ポイントは日付の計算に問題が発生しないようにすることです。grep
N個の最新ファイルを実行するだけです。繰り返しますが、あなたの質問からわかるように、これはログが毎日交換されると仮定します。