ファイルの Grep 文字列

ファイルの Grep 文字列

1回の作業のために、フォルダ内に5つのファイル名を作成しました。ファイル名は次の形式に従います。

ES_currentdate_currenttime_processid_uniqueid.log

そのパスで最近作成されたファイルの状態を読みたいです。

シェルスクリプトでファイル名を設定する方法は次のとおりです。

$ filename=ES_*_uniqueid.log
$ echo grep "##status##XRB##" $HOME/log/$filename | sort -u` "

grep5つのファイルすべての状態を読み、エコーするとき。grep最近作成されたファイルからのみ文字列を取得したいです。

誰でもソリューションを提供できますか?

答え1

ファイル名は時系列で作成しても問題になりません。これを使用してtail -1ファイルリストの最後のファイルを取得します。このファイルは常に最新のファイルでなければなりません。

$ filename=ES_*_uniqueid.log
$ grep "##status##XRB##" $(ls -tr $filename | tail -1)

ls -tr $filename | tail -1これにより、単一の結果である最新のファイルを返すサブコマンドが実行されます。これにより、一致する文字列を見つけるためにファイルが検索されます##status##XRB##

答え2

zshから(説明する:

grep "##status##XRB##" ~/log/ES_*.log(om[1])

日付が適切な形式(YYYYmmdd_HHMMSS)の場合、ファイル名のアルファベット順は時系列と一致します。したがって、kshまたはbashでは、一致するファイルの名前を配列に入れます。現在存在するファイルが最後の配列要素になります。

logs=(~/log/ES_*.log)
grep "##status##XRB##" "${logs[${#logs}-1]}"

POSIXシェル(たとえば/bin/sh)を使用している場合にのみ、位置パラメータを使用できます。

grep_last_match () {
  eval set -- \"\${$#}\"
  grep "##status##XRB##" "$1"
}
grep_last_match ~/logs/ES_*.log

関連情報