web-dev-qa-db-ja.com

日付の範囲内のすべてのログファイルを分類する方法

次の方法で名前が付けられたログファイルがあります。

localhost_log_file.2017-09-01.txt
localhost_log_file.2017-09-02.txt
....

localhost_log_file.2017-10-30.txt

つまり、各ログファイルの形式は次のとおりです。

localhost_log_file.YYYY-MM-DD.txt

2017-09-03から2017-10-08までの間に取得されたすべてのログファイル、つまりlocalhost_log_file.2017-09-03.txt 使って localhost_log_file.2017-10-08.txt

現在私がしていることは、次の各コマンドを個別に実行することで3つの中間ファイルを作成することです。

for((i=3;i<=9;i++)) do cat localhost_log_file.2017-09-0$i.txt >> log1.csv ; done;

for((i=10;i<=30;i++)) do cat localhost_log_file.2017-09-$i.txt >> log2.csv ; done;

for((i=1;i<=8;i++)) do cat localhost_log_file.2017-10-0$i.txt >> log3.csv ; done;

次に、中間ファイルを次のように結合します。

cat log1.csv log2.csv log3.csv> totallog.csv

これを行うより良い方法はありますか?

5
Ricky

dateユーティリティを使用して、興味のある日付の範囲を反復処理してみませんか?あなたの例では次のようになります:

# Set the date counter to the start date
d=2017-09-03

# Iterate until we reach the end date (i.e. the date after the last date we want)
while [ "$d" != 2017-10-09 ]; do

    # cat each file
    cat "localhost_log_file.${d}.txt";

    # Increment the date counter
    d="$(date -I -d "$d + 1 day")";

done

詳細はこちらをご覧ください:

または、ループの本体でcatを呼び出す代わりに、ループの結果をcatコマンドに渡すことができます。

コマンド置換を使用すると、次のようになります。

d=2017-09-03
cat $(while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done)

そして、これはパイプとxargsを使用した同じものです:

d=2017-09-03
while [ "$d" != 2017-10-09 ]; do
    echo "localhost_log_file.${d}.txt";
    d="$(date -I -d "$d + 1 day")";
done | xargs cat
8
igal

ブレース展開をネストできます。

短くて甘い:

cat localhost_log_file.2017-{09-{03..30},10-{01..08}}.txt > totallog.csv

MacOSなどの一部のシステムでは、以前のバージョンのBashが使用されており、これが機能しないことに注意してください。 Linuxの場合、これは正常に機能します。

12
Wildcard

使用日:

for i in {0..35}; do
     cat localhost_log_file.$(date +%F -d "2017-09-03 + $i day").txt
done > totallog.csv
3
Ipor Sircer

どちらかというと主観的ですが、両方にブレース拡張を使用できます

cat localhost_log_file.2017-09-{03..09}.txt > log1.csv

そして

cat log{1..3} > totallog.csv

Log?.csvファイルを保持したいとします

1
bu5hman

次のコマンドを使用します。

_ls | sort | while read i; do  if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]); then cat $i >> totallog.csv ; fi ; done
_

このように実行する必要があります

_ls | sort | while read ienterキーを押します
do enterキーを押します
if ([ "$i" \> "localhost_log_file.2017-09-03.txt" ] || [ "$i" == "localhost_log_file.2017-09-03.txt" ]) && ([ "$i" \< "localhost_log_file.2017-10-08.txt" ] || [ "$i" == "localhost_log_file.2017-10-08.txt" ]) enterキーを押しますthen enterキーを押します
_cat $i >> totallog.csventerキーを押します
fi enterキーを押します
done enterキーを押します

0
user259703