ファイルから2つのタイムスタンプ間の行を取得する

ファイルから2つのタイムスタンプ間の行を取得する

大容量ファイルがありますが、日付と時刻を使用して検索する必要があります。ファイルの各行には日付と時刻があります。

複数の行を検索して、2つの特定の日付と時刻の間にある行を取得する必要があります。

サンプルファイル(日付と時刻フィールド$ 2と$ 3):

SERVER 2015-12-12 05:00:20 some_text_here something  
SERVER 2015-11-02 12:22:40 some_text_here something
SERVER 2015-12-11 20:00:00 some_text_here something
SERVER 2015-12-11 23:00:00 some_text_here something
SERVER 2015-12-12 00:30:00 some_text_here something
SERVER 2015-12-12 00:59:00 some_text_here something
SERVER 2015-09-20 03:28:11 some_text_here something
SERVER 2015-04-16 04:49:59 some_text_here something

私が試したコマンド(ユーザーはスクリプトを実行するときに4つのパラメータを提供する必要があります):

AAA="$1 $2"
BBB="$3 $4"

awk '$2" "$3>="'"$AAA"'" && $2" "$3<="'"$BBB"'"' file.txt > newfile.txt

上記の行をスクリプトとして使用していますが、動作しません。

newfile.txt以下を含める必要があります(パラメータを含む2015-12-11 20:00:00 2015-12-12 01:00:00):

SERVER 2015-12-11 20:00:00 some_text_here something
SERVER 2015-12-11 23:00:00 some_text_here something
SERVER 2015-12-12 00:30:00 some_text_here something
SERVER 2015-12-12 00:59:00 some_text_here something

答え1

唯一の実際の問題は、$AAAandの$BBB代わりにAAAandに割り当てることですBBB。したがって、これを行うと(コードとほぼ同じ):

AAA="2015-12-11 20:00:00"
BBB="2015-12-12 01:00:00"
awk '$2" "$3>="'"$AAA"'" && $2" "$3<="'"$BBB"'"' file.txt > newfile.txt

すでに働いているはずです。ただし、潜在的な引用の問題を減らすために、次のような追加の変更をお勧めします(特にこの方法を他の場所で再利用する場合、またはに特殊文字を入力する場合AAABBB

AAA="2015-12-11 20:00:00"
BBB="2015-12-12 01:00:00"
awk -v string1="$AAA" -v string2="$BBB" '$2" "$3>=string1 && $2" "$3<=string2' file.txt > newfile.txt

-vこれについてはマニュアルページで読むことができますawk

答え2

2つの特定の日付と時刻を入力できるスクリプトが必要な場合があります。 ここに画像の説明を入力してください。

パスワード:

#!/bin/bash
if [ $# -ne 4 ];then
exit 0
fi
AAA=$1" "$2
BBB=$3" "$4
awk -v begintime="${AAA}" -v endtime="${BBB}" '$2" "$3>=begintime && $2" "$3<=endtime' exa > newfile.txt

答え3

awk最高のツールではありません。

sed -e  "/^$AAA/,/^$BBB/,p" file.txt

そしてman sed

関連情報