web-dev-qa-db-ja.com

ファイルから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
3
capslock13

たぶん、2つの特定の日付と時刻を入力できるスクリプトが必要です。 enter image description here

コード:

#!/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
0
user164825

唯一の実際の問題は、AAABBBではなく$AAA$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

すでに動作するはずです。ただし、潜在的な引用の問題を減らすために、次の変更を行うことをお勧めします(特に、このアプローチを別の場所で再利用したり、AAAまたはBBBに特別な文字を入れたりした場合)。

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のmanページで読むことができます。

3
Lucas