シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」
TRANSCRIPT
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 1 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
jus 勉強会
シェルスクリプトワークショップ
「シェル芸」を極める
日本 GNU AWKユーザー会
斉藤博文
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 2 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
はじめに
自己紹介
「日本 GNU AWKユーザー会」会長
http://gauc.no-ip.org/awk-users-jp/
@hi_saito
USP Magazine, Codezineに連載中
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 3 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
2 日間、よろしくお願いします
勉強会で重要なこと
質問しよう
積極的に質問をしてください
振り返ろう
手を動かして実際に試そう
大したことないことを分かろう
自分もいつかは講師をしよう
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 4 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
特に難しいことは話しません
他の講義とダブる?
それは基本だからです
それは重要だからです
それは間違えやすいからです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 5 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
単に整合が取れていない言い訳かもしれません
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 6 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
シェル芸
シェル芸とは?
シェル芸とは、現代においてもっとも過激と
目される CLI ワンライナー原理主義の一派。
武田久美子を教祖とし、夏になると信者は女
も男も老いも若きも貝がらビキニで海辺を
ホーミタイする危険な思想である。
アンサイクロペディア
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 7 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
ネタが古くて 30 代後半でないと分からない上、違います!
シェル芸とは?
マウスも使わず、ソースコードも残さず、GUI
ツールを立ち上げる間もなく、あらゆる調
査・計算・テキスト処理を CLI 端末へのコマ
ンド入力一撃で終わらすこと。
シェル芸の定義バージョン 1.0
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 8 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
「USP友の会」の上田会長の定義です
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 9 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
今回のテーマ
今回のテーマはファイル
ファイルを拡張子で判断しない
file コマンドが便利です
ファイルのコピーや移動はどうすれば良いか
実行前に確認できるようにする
ファイルから必要な部分だけを抜き出す
HTML, XML の扱いはどうすれば良いか
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 10 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
今までのシェル芸勉強会にないネタです
重要なこと
できなくても構いません
得意、不得意があります
答えが違っても構いません
TIMTOWTDI の精神でやりましょう
手を動かしてください
頭ではなく手を動かしてください
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 11 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
頭もフル活用してください
最初に
以下のファイルを落としてください http://gauc.no-ip.org/~hi_saito/jus/jus_sample.tar.gz
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 12 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
できれば、CLI でお願いします
$ mkdir jus
$ cd !$
$ wget http://gauc.no-ip.org/~hi_saito/jus/jus_sample.tar.gz
$ tar xzvf jus_sample.tar.gz
List: CLI での落とし方
問題のツリー
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 13 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
できれば、CLI でお願いします
jus_sample/+--- all/| +--- test_01.jpg| +--- test_02.jpg| +--- test_01.png| +--- test_02.png| +--- test_01.txt| +--- test_02.txt| +--- test_01.html| +--- test_02.html+--- images/+--- text/+--- thumbnail/
List: 問題のディレクトリ構造
確認してください
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 14 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
問題 (6 問あります)
問題 1
画像ファイルだけを images/ ディレクトリに
移動してください
拡張子だけで判断しないでください
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 15 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 1
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 16 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find -type f |\xargs file |\grep 'image' |\awk -F':' '{print $1, $1}' |\awk '{sub(/all/, "images", $2); print $0}' |\awk '{print "mv " $0}' |\sh
List: 解答例 1
xargs コマンドの使い方を知ろう
file コマンドでファイル種類を判別
確認後に最後に Shell に渡して実行Demo
問題 2
テキストファイルだけを text/ ディレクトリ
にコピーしてください
拡張子だけで判断しないでください
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 17 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 2
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 18 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find -type f |\xargs file |\grep 'text' |\awk -F':' '{print $1, $1}' |\awk '{sub(/all/, "text", $2); print $0}' |\awk '{print "cp " $0}' |\sh
List: 解答例 2
xargs コマンドの使い方を知ろう
file コマンドでファイル種類を判別
確認後に最後に Shell に渡して実行Demo
問題 3
画像を 32 x 32 ピクセル PNG形式に変換して
thumbnail/ ディレクトリに作成してくださ
い
拡張子だけで判断しないでください
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 19 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 3
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 20 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find images/ -type f |\awk '{print $1, $1}' |\sed 's: images: thumbnail:' |\sed 's:^:convert -geometry 32x32! :' |\sed 's:$:.png:' |\sh
List: 解答例 3
sedの区切りは "/" ではなく、":" が便利
確認後に最後に Shell に渡して実行
Demo
問題 4
test_01.html, test_02.html のタイトルを
抜き出してください
改行の有無をどうするかがポイントです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 21 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 4
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 22 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find text/ -type f |\xargs file |\grep 'HTML' |\awk -F':' '{print $1}' |\xargs -n 1 cat |\tr -d '\n' |\grep -Eoi '<title>[^<]+</title>' |\sed -r 's:</?[^>]+>::g'
List: 解答例 4
XML, HTML は一旦改行を正しく付け直す
sedの区切りは "/" ではなく、":" が便利
Demo
問題 5
test_01.html, test_02.html の HTML タ
グを削除してください
改行の有無をどうするかがポイントです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 23 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 5
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 24 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find text/ -type f |\xargs file |\grep 'HTML' |\awk -F':' '{print $1}' |\xargs sed -r 's:</?[^>]+>::g' |\awk 'NF'
List: 解答例 5
sedでの最小一致を学ぼう
sedの区切りは "/" ではなく、":" が便利
余計な改行は AWKで削除
Demo
問題 6
できあがった階層構造をツリー表示してくだ
さい
tree コマンドは使用禁止です
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 25 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 6
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 26 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ find |\sort |\tr '/' ' ' |\sed -r 's:[^ ]+[ ]: +--- :g' |\sed -r 's:--- : :g' |\sed -r 's:[ ]\+[ ]: | :g'
List: 解答例 6
sedは GNU 拡張が便利
Demo
問題 X
以下の住所を横書きで TTF化してください
鳥取県鳥取市,若葉台北1-1-1,鳥取環境大学
いわゆる宛名書きです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 27 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 X
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 28 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ echo '鳥取県鳥取市,若葉台北1-1-1,鳥取環境 大学' |\sed 's:$:様:' |\tr ',' '\n' |\convert -pointsize 40 -font aoyagikouzanfont2.ttf \
label:@- jusyo.png
List: 解答例 X
覚える必要はありません。
Demo
問題 XX
以下の住所を縦書きで TTF化してください
鳥取県鳥取市,若葉台北1-1-1,鳥取環境大学
いわゆる宛名書きです
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 29 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
解答例 XX
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 30 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
$ echo '鳥取県鳥取市,若葉台北1-1-1,鳥取環境 大学' |\sed 's:$:様:' |\tr ',' '\n' |\tac |\xargs -n1 -I% sh -c ' \echo "%" |\grep -o '.' |\convert -pointsize 40 -font sazanami-mincho.ttf \
label:@- miff:-' \|\
convert - +append jusyo.png
List: 解答例 XX
覚える必要はありません。
Demo
http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 31 -
2014 年 12 月 13, 14 日シェルスクリプトワークショップ
@鳥取環境大学
質問はありますか?