日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

シェルスクリプトマガジン記事の補足情報

この度シェルスクリプトマガジンに「Personal Tukubaiを使ってみた」という題目で記事を寄稿させていただいた。補足情報や記事内に記載したリンクなどを記載しておこうと思う。後編の記事に関する記載を追記した。(2016年7月24日)

シェルスクリプトマガジンの紹介とご購入

Personal Tukubai

インストール方法

付属のINSTALL_JP.TXTドキュメントなどを参考にインストールする。(実際はファイルのコピーとパスの設定)

Open usp Tukubai

利用するにはPython2.x系が必要。MacやLinuxには標準で入っている。

インストール方法

こちらのUECサイトを参考に
Open usp Tukubai インストール

基本的なインストール方法は、適当な作業ディレクトリで下記を実行する。

$ git clone git://github.com/usp-engineers-community/Open-usp-Tukubai.git
$ cd Open-usp-Tukubai
$ sudo make install
$ cd ..
$ rm -rf Open-usp-Tukubai

Macの方はHomebrewでインストール可。下記を参照。
http://papiro.hatenablog.jp/entry/2016/05/25/215608

Personal TukubaiとOpen usp Tukubai併用時の注意点

Mac版ではPersonal Tukubaiにloopjコマンドが現在含まれていないため、Open usp Tukubaiのloopjコマンドを使う必要がある。このためMacの場合はOpen usp TukubaiとPersonal Tukubaiを併用することになる。

この時、Personal Tukubaiに付属の/etc/paths.d/tukubai.shでパスの設定をすると、/usr/local/binの後にパスが追加される。このためOpen usp Tukubaiのコマンドが優先的に実行されてしまう。

Personal Tukubaiを優先的に実行するには、/etc/paths.d/tukubai.shを消して.bash_profileを使ってパスを設定すると良い。

$ sudo rm /etc/paths.d/tukubai.sh
$ vi .bash_profile
PATH=~/bin:/opt/local/uspTukubai/TOOL:/opt/local/uspTukubai/UTL:$PATH; export $PATH

もしくは、Open usp Tukubaiのloopjコマンドを~/bin以下にコピーして、~/binにパスを通すというやり方でも良い。

前編補足事項

リンク集

後編補足事項

リンク集

記事内のコードなど

(P35)最後の方に記載した並列化のワンライナー。Personal Tukubaiのコマンドを使った真・マイナンバーシェル芸10並列版。

$ seq 0 9 | xargs -I@ -P10 sh -c "yes '<(seq 0 9)' | head -n 10 | yarr | sed 's/^/loopx <(echo @) /' | bash | lcalc '\$0,\$1*6+\$2*5+\$3*4+\$4*3+\$5*2+\$6*7+\$7*6+\$8*5+\$9*4+\$10*3+\$11*2' | lcalc '\$[1:11],\$12%11<=1?0:11-\$12%11' | gtr -d ' '"

(P37)アクセスログデータのダウンロード方法(上田さんのサイトより)

$ mkdir LOG
$ wget http://blog.ueda.asia/misc/access_log.nasa.gz
$ mv access_log.nasa.gz LOG

(P37)最後の方に記載した事前処理のワンライナー。MacやFreeBSD向けなので、Linuxな方はgzcat gtr gdate gpaste ggrep の各コマンドの頭のgを消したコマンドで。

$ gzcat LOG/access_log.nasa.gz | self 4.2 | gtr '/' '-' | sed 's/:/ /' | gdate -f - '+%Y%m%d %H%M%S' | gpaste -d ' ' - <(gzcat LOG/access_log.nasa.gz) | tee LOG/access_log_all | LANG=C ggrep ' 200 [0-9][0-9]*$' | LANG=C ggrep -iEv '\.gif|\.jpe*g|\.xbm|\.mpg|\.wav|.pl' | tee LOG/access_log | LANG=C ggrep -F '/history/apollo/' > LOG/access_log_history_apollo

(P38)集計のシェルスクリプト。クロス集計、補完、Excelデータの扱い。

#!/bin/bash -xv

tmp=/tmp/tmp-$$
log=LOG/access_log_history_apollo
day_hour_txt='web_access.txt'
day_hour_cross_txt='web_access_cross_tabulation.txt'
xlsx_template='web_access_cross_tabulation_template.xlsx'
xlsx_out='web_access_cross_tabulation.xlsx'

trap 'rm -f $tmp-*' 2

# ログファイルの日付範囲を取得
from_day=$(head -n 1 $log | self 1)
to_day=$(tail -n 1 $log | self 1)

# アクセスが無い日時は0を出力するため補完用データ作成
mdate -e $from_day $to_day                                 |
tarr                                                       |
loopx - <(seq -w 00 23) > $tmp-dayhourlist
# 1.日付(yyyymmdd) 2.時間帯(HH)

cat $log                                                   |
self 1 2.1.2                                               |
# 1.日付(yyyymmdd) 2.時間帯(HH)
# 日付と時刻でアクセス数を集計
count 1 2                                                  |
# 1.日付(yyyymmdd) 2.時間帯(HH) 3.アクセス数
# アクセスが無い日時は0で補完
loopj num=2 $tmp-dayhourlist -                             |
tee $day_hour_txt                                          |
# 1.日付(yyyymmdd) 2.時間帯(HH) 3.アクセス数
yobi -j 1                                                  |
# 1.日付(yyyymmdd) 2.曜日 3.時間帯(HH) 4.アクセス数
dayslash yyyy年mm月dd日 1                                  |
# 1.日付(yyyy年mm月dd日) 2.曜日 3.時間帯(HH) 4.アクセス数
# 日付と曜日、時間帯でクロス集計
map num=2                                                  |
# 1日分のアクセス数合計を計算
ysum +h num=2                                              |
# クロス集計の結果を整形してテキストファイルに保存
tee >( keta 14 2 4xNF-3 5 > $day_hour_cross_txt)           |
# Excel保存用にヘッダを削除
sed 1d                                                     |
# Excelファイルに保存
wexcelx $xlsx_template 1 A2 > $xlsx_out

rm -f $tmp-*