2016-08-30 20 views
1

grepコマンドを使用してログディレクトリを検索するスクリプトがあります。以下はそのコマンドです。シェルスクリプトのToとFROMの間のUNIXでのログの検索

export CMD="grep -ie '.*${RUN_DATE}.*${MESSAGE_TO_SEARCH}' ${LOG_FILE_PATH}/${LOG_FILE} | awk -F 'addInfo' '{print \$2;}' | sed '/^$/d'" 

ここで、RUN_DATEはスクリプトの実行日です。

MESSAGE_TO_SEARCHは、ログファイル内で検索しているメッセージです。

スクリプトを開始する前に宣言されています。

私は例えばのために、それはTOの間と時間から、検索するというスクリプトを変更したい:

FROM_TIME = 2016年8月28日13時30分00秒と

TO_TIME = 2016年8月29日17:00:00

したがって、スクリプトはこの時間内にあるログのみを提供する必要があります。

私は正規表現として渡す日付を使って次のように試しましたが、動作しませんでした。

export CMD="grep -ie '.*[${FROM_DATE}-${TO_DATE}].*${MESSAGE_TO_SEARCH}' ${LOG_FILE_PATH}/${LOG_FILE} | awk -F 'addInfo' '{print \$2;}' | sed '/^$/d'" 

正しい方法をお勧めします。ありがとう

EDIT1:正規表現が適切でない場合、これを行う方法を教えてください。

+0

コマンドを変数に格納しないでください。あなたはそれを使用するためにevalを使う必要があります。 – anishsane

+0

私は例を示すことができます –

+1

正規表現は、日付の範囲と一致するための最良のツールではありません。スクリプトでログファイル名を解析する方が良いでしょう。 [ここに例がある](http://stackoverflow.com/questions/6839987/regular-expression-for-a-date-range)正規表現がどのように複雑になるかを示す日付 – Aserre

答えて

1

ログファイルから行を選択するだけの場合は、いくつかの単純なコマンドで別の方法がありますが、読みやすくなります。

1.最初と最後の行の行番号を取得します。

# SN for start line number, EN for end line number. 

export SN=`cat -n LOG_FILE | grep START_TIME | head -1 | awk '{print $1}'` 
export EN=`cat -n LOG_FILE | grep END_TIME | tail -1 | awk '{print $1}'` 

2.必要な行を取得します。

head -$EN LOG_FILE | tail -$(($EN-$SN+1)) 

私たちが必要とする行番号を知ったら、頭と尾を使って必要のない部分を切り捨てることができます。^_^

関連する問題