シェルスクリプトワークショップ資料 - 上級者向け「シェル芸」

32
http://gauc.no-ip.org/awk-users-jp/ 日本 GNU AWK ユーザー会 斉藤 @hi_saito -1- 2014 12 13, 14 シェルスクリプトワークショップ @鳥取環境大学 jus 勉強会 シェルスクリプトワークショップ シェル芸」を極める 日本 GNU AWK ユーザー会 斉藤 博文

Upload: hirofumi-saito

Post on 20-Jul-2015

12.843 views

Category:

Engineering


3 download

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/

[email protected]

@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 日シェルスクリプトワークショップ

@鳥取環境大学

質問はありますか?

http://gauc.no-ip.org/awk-users-jp/日本 GNU AWK ユーザー会斉藤 @hi_saito - 32 -

2014 年 12 月 13, 14 日シェルスクリプトワークショップ

@鳥取環境大学

ご清聴ありがとうございました