

現在、dateコマンドを使用して付与したファイルがあります。  
■例：20180101.zip ～ 20180131.zip

選択した日付の9時から次の日の9時までの中で  
zipを解凍せず、中身から特定の文字列に該当している行が  
何行あるのかを調べるスクリプトを作成しましたがうまく動作しません。  
ご教授頂けますでしょうか。

  * スクリプトで連続する整数を表示したい際、1～31ではなく、01～31を表わせる方法があれば教えて頂きたいです。
  * 参照する2つのファイルを選択するため、 a a+1 のような差分にて出力ができる構成があればと存じます。

■コマンド例：

[code]

    #!/bin/sh
    i=10
    j=`$i+1`
    while [ $i -ne 20 ];
    do
    echo "`ls 201801"$i".zip 201801"$j".zip | xargs -n1 -IX unzip -p X | awk -F - '"Dec "$i" 09:00:00" <= $1 && $1 < "Dec "$j" 09:00:00"' | grep ',allow,' | wc -l`"
      i=`expr $i + 1`
      j=`expr $j + 1`
    done
    
[/code]

以上よろしくお願いいたします。


CC BY-SA 3.0
2018-02-23T20:43:22.133
41965
2018-02-27T12:14:28.977
2018-02-27T12:14:28.977
3054
27521
question
linux shellscript
過去に生成した日付付きファイル名をスクリプトにて選択したい


> スクリプトで連続する整数を表示したい際、1～31ではなく、01～31を表わせる方法があれば教えて頂きたいです。

`seq`コマンドで連続する数を生成できます。手元のバージョンは`-f`でフォーマット指定できました。

[code]

    $ seq -f "%02.f" 1 10
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    
[/code]

ファイル名が日付ならそのまま渡してしまってもいいかも。

[code]

    $ seq 20180110 20180120
    20180110
    20180111
    20180112
    20180113
    20180114
    20180115
    20180116
    20180117
    20180118
    20180120
    
[/code]

> 参照する2つのファイルを選択するため、 a a+1 のような差分にて出力ができる構成があればと存じます。

`expr`コマンドを使うと文字列で表現した式を計算できます。

[code]

    $ expr "1 + 1"
    2
    
[/code]

`for`、`seq`、`expr`を組み合わせて

[code]

    $ for i in `seq 20180110 20180120`; do echo $i `expr $i + 1`; done
    20180110 20180111
    20180111 20180112
    20180112 20180113
    20180113 20180114
    20180114 20180115
    20180115 20180116
    20180116 20180117
    20180117 20180118
    20180118 20180119
    20180119 20180120
    20180120 20180121
    
[/code]


CC BY-SA 3.0
2018-02-23T22:12:51.460
41966
2018-02-23T23:16:05.803
2018-02-23T23:16:05.803
4236
4236
41965
answer


> 選択した日付の9時から次の日の9時までの中でzipを解凍せず、中身から特定の文字列に該当している行が何行あるのか

日付を選択するのではなく、日付ごと(月初〜月末)に集計する場合を考えてみました。

[code]

    unzip -p '201801*.zip' |
    awk -F'[ :]' '
        $2>1 && $3<9 && $0~",allow,"{ cnt[$2-1]++ }
        $3>=9 && $0~",allow,"{ cnt[$2+0]++ }
      END{
        for (d in cnt) {
          printf("201801%02d: %d\n", d, cnt[d])
        }
      }
    '
    
[/code]

unzip
コマンドの引数をシングルクォートで囲んでいる(`'201801*.zip'`)のは、ワイルドカード(`*`)をシェルに展開させないためです(unzip
内で展開されます)。  
awk スクリプトでは午前0時から午前9時までの該当数を前日分として集計しています(`cnt[$2-1]++`)。`$2>1`
としているのは1月1日(月初)の午前0時から午前9時までをスキップするためです(質問文に掲載されているコードでは "Dec" となっていますね…)。


CC BY-SA 3.0
2018-02-24T08:06:02.910
41976
2018-02-24T08:31:24.167
2018-02-24T08:31:24.167
41965
answer