著者:USP研究所技術研究員 岡田健
今回は、シェルスクリプトのデバッグを行いたい時、処理の途中or一部だけに限定して実行出来る uspTukubai のコマンド「run」を紹介します。
本記事掲載のシェルスクリプトマガジンvol.47は以下リンク先でご購入できます。
USP研究所 通販サイトでは、個人用uspTukubaiのご購入も可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#!/bin/bash -vx # # ITEMRANKING アイテムランキング表CUI出力 # # usage: ./ITEMRANKING <集計開始日 yyyymmdd> <集計最終日 yyyymmdd> [表示件数] # # written by Ryuichi Ueda (xxxxxx@usp-lab.com) Aug. 9, 2012 logfile=/home/usp/LOG/LOG.$(basename $0).$(date +%Y%m%d) exec 2> $logfile dir=/home/usp/KOJIN/okada/20170131_magazine_run/ITEMRANKING/ tmp=/tmp/$$ ERROR_EXIT(){ echo エラー rm -f $tmp-* exit 1 } day_from=20071203 day_to=20071209 rank_range=$1 [ "_$day_from" = "_" ] && ERROR_EXIT [ "_$day_to" = "_" ] && ERROR_EXIT [ "_$rank_range" = "_" ] && rank_range=50 ############################################ # 売れ数の集計 #URE 1:店コード 2:商品コード 3:日付 #4:売れ数 5:売り上げ 6:値引き cat $dir/POMPA/URE | #0001 0000007 20071201 117 8335 -145 #指定日以降のデータ awk -v f=${day_from} '$3>=f' | #指定日以前のデータ awk -v t=${day_to} '$3<=t' | self 2 4 5 | #1:商品コード 2:売れ数 3:売り上げ高 sm2 1 1 2 3 > $tmp-ure [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT ################################################ #仕入れ数の合計 #SIRE 1:店コード 2:商品コード 3:日付 4:仕入れ数 5,6:他 cat $dir/POMPA/SIRE | awk -v f=${day_from} '$3>=f' | #指定日以前のデータ awk -v t=${day_to} '$3<=t' | self 2 4 | #1:商品コード 2:売れ数 sm2 1 1 2 2 > $tmp-sire [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT ################################################ #在庫数の合計 #ZAIKO.<日付> 1:店コード 2:商品コード 3:日付 4:在庫 cat $dir/POMPA/ZAIKO.${day_to} | self 2 4 | #1:商品コード 2:在庫数 sm2 1 1 2 2 > $tmp-zaiko [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT ################################################ #データの連結 hbar=-------------------------------------------------------------------------------------------------------------------------- days=$(mdate $day_to $day_from | awk '{print $1+1}') loopj num=1 $tmp-{ure,sire,zaiko} | #0000043 93584 40283328 164577 123523 #1:商品コード 2:売れ数 3:売り上げ 4:仕入れ数 5:在庫数 join1 key=1 $dir/POMPA/GENBAI - | #1:商品コード 2:原価 3:売価 4:売れ数 5:売り上げ 6:仕入れ数 7:在庫数 #0000048 331.2 480 93008 44697653 159336 117347 join1 key=1 $dir/POMPA/NAME - | #1:商品コード 2:商品名 3:原価 4:売価 5:売れ数 6:売り上げ 7:仕入れ数 8:在庫数 sort -k5,5nr | awk 'NR<='{rank_range} | juni | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 6:売れ数 7:売り上げ 8:仕入れ数 9:在庫数 awk '{print $0,$6/'$days'}' | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 #6:売れ数 7:売り上げ 8:仕入れ数 9:在庫数 10:平均売数 awk '{print $0,$10!=0?$9/$10:"N/A"}' | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 #6:売れ数 7:売り上げ 8:仕入れ数 9:在庫数 10:平均売数 11:在庫日数 awk '{print $0,$9*$5}' | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 #6:売れ数 7:売り上げ 8:仕入れ数 9:在庫数 10:平均売数 #11:在庫日数 12:在庫高 awk '{ara=$7-$4*$6;print $0,ara,ara*100/$7}' | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 #6:売れ数 7:売り上げ 8:仕入れ数 9:在庫数 10:平均売数 #11:在庫日数 12:在庫高 13:荒利 14:荒利率 self 1/6 8/11 7 12/14 | #1:順位 2:商品コード 3:商品名 4:原価 5:売価 #6:売れ数 7:仕入れ数 8:在庫数 9:平均売数 10:在庫日数 #11:売り上げ #12:在庫高 13:荒利 14:荒利率 awk '{for(i=11;i<=13;i++){$i=int($i/1000)};print}' | marume 4.1 9.0 10.1 14.1 | comma 6 7 8 9 11 12 13 | keta 2 7 -26 5 3 9 8 8 7 5 8 8 7 5 | awk '{print;if(NR%5==0){print "'$hbar'"}}' > $tmp-body [ $(plus ${PIPESTATUS[@]}) -eq 0 ] || ERROR_EXIT ########################################################## # ヘッダを作る echo $day_from $day_to | tarr | yobi -j 1 | self 1.1.4 1.5.2 1.7 2 | awk '{print $1"年"$2"月"$3"日("$4")"}' > $tmp-days kikan_from=$( head -n 1 $tmp-days) kikan_to=$( tail -n 1 $tmp-days) cat << FIN > $tmp-header [アイテムランキング表] 出力 : $(date) ユーザ : $USER 集計期間: $kikan_from ~ $kikan_to 店舗範囲: 全店 商品範囲: 全商品 ランキング順: $days 日間売数合計順 表示範囲:上位 $rank_range アイテム 順 在庫 荒利 位 商品コード 商品名 原価 売価 売数計 仕入数計 在庫数計 平均売数 日数 売上(千)在庫(千)荒利(千)率% ========================================================================================================================== FIN cat $tmp-header $tmp-body rm -f $tmp-* exit 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[usp@demo1 SHELL.草稿]$ ./ITEMRANKING 10 2>/dev/null [アイテムランキング表] 出力 : 2017年 2月 2日 木曜日 10:12:50 JST ユーザ : usp 集計期間: 2007年12月03日(月) ~ 2007年12月09日(日) 店舗範囲: 全店 商品範囲: 全商品 ランキング順: 7 日間売数合計順 表示範囲:上位 10 アイテム 順 在庫 荒利 位 商品コード 商品名 原価 売価 売数計 仕入数計 在庫数計 平均売数 日数 売上(千)在庫(千)荒利(千)率% ========================================================================================================================== 1 0000361 牛細切れ 512.4 610 290,087 510,778 299,129 41,441 7.2 177,089 182,468 28,448 16.1 2 0000087 マンゴー 617.7 870 267,497 422,354 212,295 38,214 5.6 232,846 184,696 67,613 29.0 3 0000194 深谷葱 705.0 940 256,844 464,458 276,025 36,692 7.5 241,569 259,463 60,494 25.0 4 0000433 薄口醤油 260.7 330 206,608 322,249 195,773 29,515 6.6 68,269 64,605 14,407 21.1 5 0000234 鰻 268.6 340 205,464 320,276 172,009 29,352 5.9 69,947 58,483 14,760 21.1 -------------------------------------------------------------------------------------------------------------------------- 6 0000254 メバル 405.0 540 188,840 310,516 174,906 26,977 6.5 102,059 94,449 25,579 25.1 7 0000291 アナゴ 773.5 910 185,427 315,415 202,536 26,490 7.6 168,824 184,307 25,396 15.0 8 0000584 絹豆腐 604.8 840 182,628 314,490 190,176 26,090 7.3 153,493 159,747 43,040 28.0 9 0000122 苺 198.0 220 181,308 263,982 148,368 25,901 5.7 39,983 32,640 4,084 10.2 10 0000268 マアジ 598.4 680 180,947 338,653 219,838 25,850 8.5 123,149 149,489 14,871 12.1 -------------------------------------------------------------------------------------------------------------------------- |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ run ./ITEMRANKING 1-27 (中略) day_from=20071203 + day_from=20071203 day_to=20071209 + day_to=20071209 rank_range=$1 + rank_range= [ "_$rank_range" = "_" ] && rank_range=50 + '[' _ = _ ']' + rank_range=50 exit 0 + exit 0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ run "./ITEMRANKING 10" 1-27 (中略) day_from=20071203 + day_from=20071203 day_to=20071209 + day_to=20071209 rank_range=$1 + rank_range=10 [ "_$rank_range" = "_" ] && rank_range=50 + '[' _10 = _ ']' exit 0 + exit 0 |
1 2 3 4 |
$ run --log errlog "./ITEMRANKING" 1-35 | head -3 | keta 0001 0000007 20071201 117 8335 -145 0001 0000007 20071203 221 15470 0 0001 0000007 20071205 85 5950 0 |
1 2 3 4 5 6 7 8 |
$ run --log errlog "./ITEMRANKING" 1-38 | head -7 | keta 0001 0000007 20071203 221 15470 0 0001 0000007 20071205 85 5950 0 0001 0000007 20071206 293 20527 -17 0001 0000007 20071207 445 31150 0 0001 0000007 20071208 325 22750 0 0001 0000007 20071210 320 22400 0 0001 0000007 20071212 219 16517 -1187 |
1 2 3 4 5 6 7 8 |
$ run --log errlog "./ITEMRANKING" 1-40 | head -7 | keta 0001 0000007 20071203 221 15470 0 0001 0000007 20071205 85 5950 0 0001 0000007 20071206 293 20527 -17 0001 0000007 20071207 445 31150 0 0001 0000007 20071208 325 22750 0 0002 0000007 20071203 588 41160 0 0002 0000007 20071204 444 31080 0 |
1 2 3 4 5 6 7 8 9 10 11 |
$ mkdir /tmp/okada $ run --var tmp=/tmp/okada/tmp "./ITEMRANKING" 1-43 (略) tmp=/tmp/okada/tmp + tmp=/tmp/okada/tmp (略) sm2 1 1 2 3 > $tmp-ure (略) $ head -2 /tmp/okada/tmp-ure 0000007 101071 7114796 0000017 100305 17089138 |
1 2 3 4 5 6 7 8 9 10 11 12 |
$ run --log errlog --var tmp=/tmp/okada/tmp "./ITEMRANKING" 50-56 ls /tmp/okada tmp-sire tmp-ure $ head -2 /tmp/okada/tmp-sire 0000007 161093 0000017 141954 $ run --log errlog --var tmp=/tmp/okada/tmp "./ITEMRANKING" 63-66 $ ls /tmp/okada tmp-sire tmp-ure tmp-zaiko $ head -2 /tmp/okada/tmp-zaiko 0000007 115314 0000017 101649 |
1 2 3 4 |
$ run --log errlog --var tmp=/tmp/okada/tmp "./ITEMRANKING" 76-76 | head -3 | keta 0000007 101071 7114796 161093 115314 0000017 100305 17089138 141954 101649 0000021 86718 18253232 140204 114968 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
$ run Usage : run [option] "<対象SHELL 引数...>" [<開始行>-<終了行>] Version : Wed Oct 7 23:51:15 JST 2015 Edition : 0 option一覧: --log <ファイル名> ログ出力先を変える。 --var <変数名>=<値> 変数代入値を差し替える。 --stop upcnt UPCNT出力を止める。 --stop sem SEMAPHORE生成を止める。 --stop clean 関連の削除を止める(対象はSHELLとrunの両方)。 --break <行数> ブレークポイントを入れる。 --debug run自身のdebug情報を出力する 使い方例: run SCRIPT # SCRIPTをそのまま実行 run "SCRIPT A B" # SCRIPTに引数を与えて実行 run SCRIPT 4-6 # SCRIPTの4~6行目を実行 run --log errlog SCRIPT 4-6 # 出力ログを"errlog"に保存 run --var tmp=/tmp/okada/tmp SCRIPT 4-6 # 変数tmpに/tmp/okada/tmpを代入 run --var dir=/home/usp,tmp=/tmp/okada/tmp SCRIPT 4-6 # 複数の変数に代入。 run --stop upcnt SCRIPT 4-6 # UPCNTへ出力しないで実行。 run --stop upcnt,sem SCRIPT 4-6 # UPCNTとセマフォ出力しないで実行。 run --stop clean SCRIPT 4-6 # 末尾の rm -f -* を実行しない。 run --break 15,19,20 SCRIPT # 15,19,20行目にブレークポイントを入れる。 |