【問題集】第10回シェル芸勉強会

Pocket
LINEで送る

他の回の問題はこちら

シェル芸勉強会スライド一覧

続きを読む 【問題集】第10回シェル芸勉強会

Pocket
LINEで送る

かなりやさん感謝感謝デス

Pocket
LINEで送る

この前のシェル芸勉強会をまとめていただきました。そういえばかなりやさんを囲む会を企画しなければ・・・

Pocket
LINEで送る

【本番資料】第9回寒中シェル芸勉強会

Pocket
LINEで送る

問題です。スライドシェアから単なるHTMLにします。加工面倒なので。

ダブルクォートが「& quot;」に化けている・・・orz(2014/4/1修正)

USP友の会の公式ページに手抜き講評とリンク集を書きました。Ustreamもありますよ。

環境

Macで解答を作ったのでLinuxな方は次のようにコマンドの読み替えを

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac

イントロ

第1問

まず、次のようにファイルを作ってください。

$ touch apple avocado banana cinnamon melon
$ ls
apple  avocado  banana  cinnamon  melon

「a,b,c,m」というディレクトリを作って、1文字目が対応するファイルをそれぞれのディレクトリに移動してください。

###こうなったらOK###
$ ls *
a:
apple  avocado
 
b:
banana
 
c:
cinnamon
 
m:
melon

解答

$ ls | while read f ; do mkdir -p "${f:0:1}" ;
 mv $f "${f:0:1}" ; done
uedambp:20140214USPSTUDY ueda$ ls *
a:
apple  avocado

b:
banana

c:
cinnamon

m:
melon
###別解###
uedambp:20140214USPSTUDY ueda$ ls |
 awk '{print substr($1,1,1),$1}' |
 awk '{print "mkdir -p",$1, ";mv",$2,$1}' | sh

第2問

まず、次のように名前にスペースが入ったファイルを作ります。

$ touch "私は 蟹" "オシャレな 蟹" "足が 10本"
$ ls -l
total 0
-rw-r--r-- 1 ueda staff 0  2 14 11:22 私は 蟹
-rw-r--r-- 1 ueda staff 0  2 14 11:22 足が 10本
-rw-r--r-- 1 ueda staff 0  2 14 11:22 オシャレな 蟹

このままでは何かと扱いづらいので、間にアンダーバーを入れて次のように名前を変更してください。

$ ls -l
total 0
-rw-r--r-- 1 ueda staff 0  2 14 11:25 私は_蟹
-rw-r--r-- 1 ueda staff 0  2 14 11:25 足が_10本
-rw-r--r-- 1 ueda staff 0  2 14 11:25 オシャレな_蟹

解答

エスケープを正しく理解しているかがミソ。

$ ls | while read f ;
 do mv "$f" "$(echo $f | sed 's/ /_/g')" ; done
###別解###
$ ls |
 awk '{f="\"" $0 "\"";t=gensub(/ /,"_",$0);print "mv",f,t}' |
 sh

第3問

ディレクトリを適当に作って、20140101から20141231まで、日付に対応したファイルを作って下さい。各ファイルの中には各日付に対応するdateコマンドの出力を書き込んで下さい。

(ワンライナーが思いつかない場合は、とりあえず手作業でやってみてください。)

###こんな感じでどうぞ###
uedambp:20140214USPSTUDY ueda$ ls -l | head
total 1460
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140101
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140102
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140103
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140104
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140105
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140106
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140107
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140108
-rw-r--r-- 1 ueda staff 28  2 14 10:23 20140109
uedambp:20140214USPSTUDY ueda$ cat 20140101
水  1  1 00:00:00 JST 2014

解答

uedambp:20140214USPSTUDY ueda$ d=20140101 ;
 while [ $d -lt 20150101 ] ;
 do echo $d; d=$(gdate -d "$d 1 day" +%Y%m%d) ; done |
 while read d ; do gdate -d $d > $d ; done
###Tukubaiのmdateを使う###
uedambp:20140214USPSTUDY ueda$ for d
 in $(mdate -e 20140101 20141231) ;
 do gdate -d $d > $d ; done 

第4問

次のように4個ファイルを作って、a_ramenとa_curry、b_appleとb_tomatoのファイルの中身を入れ替えてください。

$ echo カレー > a_ramen
$ echo ラーメン > a_curry
$ echo トマト > b_apple
$ echo リンゴ > b_tomato
###(余談)各ファイルと中身は次のようにgrepで確認できる###
$ grep "" *
a_curry:ラーメン
a_ramen:カレー
b_apple:トマト
b_tomato:リンゴ

解答

$ grep "" * | tr ':' ' ' | xargs -n 4 |
 awk '{print $1,$4,$3,$2}' |
 xargs -n 2 | awk '{print "echo",$2,">",$1}' | sh
$ grep "" *
a_curry:カレー
a_ramen:ラーメン
b_apple:リンゴ
b_tomato:トマト
###別解###
$ echo * | gsed 's/b_/\nb_/' |
 while read f1 f2 ; do cat $f1 > tmp ;
 cat $f2 > $f1 ; cat tmp > $f2 ; done
$ grep "" *
a_curry:カレー
a_ramen:ラーメン
b_apple:リンゴ
b_tomato:トマト
tmp:トマト

第5問

各月ごとにtar.gzファイルにしてください。

###こんな感じで###
uedambp:20140214USPSTUDY ueda$ ls *.tar.gz
201401.tar.gz  201404.tar.gz  201407.tar.gz  201410.tar.gz
201402.tar.gz  201405.tar.gz  201408.tar.gz  201411.tar.gz
201403.tar.gz  201406.tar.gz  201409.tar.gz  201412.tar.gz

解答

uedambp:20140214USPSTUDY ueda$ seq 201401 201412 |
 while read m ; do tar zcvf $m.tar.gz $m* ; done

第6問

次のようなディレクトリ・ファイル操作を行って下さい。

###小問1: ディレクトリを作る###
 ~/a/a/a/.../a/a/ (aが百個)
###小問2: ファイルを作る###
 ~/a/a/a/.../a/a/b (aが百個、bはファイル)
###小問3:  ~/a/a/a/.../a/a/の底に移動###
uedambp:a ueda$ pwd
/Users/ueda/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a

解答

###小問1### 
uedambp:~ ueda$ seq 1 100 | awk '{print "a"}' | tr '\n' '/' |
 xargs mkdir -p
###小問2### 
uedambp:~ ueda$ seq 1 100 | awk '{print "a"}END{print "b"}' |
 xargs | tr ' ' '/' | xargs touch
###小問1,2を一気に###
uedambp:~ ueda$ seq 1 100 | awk '{print "a"}' |
 tr '\n' '/' | sed '1p' |
 awk 'NR==1{print "mkdir -p",$0}NR==2{print "touch",$0 "b"}' |
 sh
###小問3###
uedambp:~ ueda$ for x in {1..100} ; do cd a ; done
uedambp:a ueda$ pwd
/Users/ueda/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
###参考: サブシェルを起動すると移動できない###
uedambp:~ ueda$ seq 1 100 | while read n ; do cd a ; done
uedambp:~ ueda$ 

第7問

先ほど作ったファイルbを、50番目のaディレクトリに移動して下さい。

↓うまくできたかどうかの確認方法

###~から50番目のaに移動###
uedambp:~ ueda$ for a in {1..50} ; do cd a ; done
###bがあるか確認###
uedambp:a ueda$ pwd
/Users/ueda/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a
uedambp:a ueda$ ls
a  b
###さらに50個aを下る###
uedambp:a ueda$ for a in {1..50} ; do cd a ; done
uedambp:a ueda$ pwd
/Users/ueda/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a
/a/a
###なにもない###
uedambp:a ueda$ ls
uedambp:a ueda$ 

解問

uedambp:~ ueda$ seq 1 150 | xargs | gsed 's/100 /100\n/g' |
 sed 's/[0-9][0-9]*/a/g' | tr ' ' '/' |
 awk 'BEGIN{print "mv"}{print $0 "/b"}' | xargs | sh

第8問

先ほど作ったディレクトリについて、rm -rを使わずに~/a以下のディレクトリを消去してください。

解答

uedambp:~ ueda$ seq 1 100 |
 awk '{for(i=0;i<$1;i++){printf "a/"};print ""}' | tail -r |
 while read d ; do rm -f $d/b ; rmdir $d ; done
uedambp:~ ueda$ ls a
gls: cannot access a: No such file or directory

Pocket
LINEで送る

【問題集】第9回寒中シェル芸勉強会

Pocket
LINEで送る

解答はコッチ

環境

Macで解答を作ったのでLinuxな方は次のようにコマンドの読み替えを

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac

第1問

まず、次のようにファイルを作ってください。

$ touch apple avocado banana cinnamon melon
$ ls
apple  avocado  banana  cinnamon  melon

続きを読む 【問題集】第9回寒中シェル芸勉強会

Pocket
LINEで送る

イベントの告知でっす(シェル芸勉強会 & 1000Eng)

Pocket
LINEで送る

ある意味死んでいますが、死んでいません。上田です。とあるイベントの打ち合わせ中にちょろっと書いております。内職でしょうか?いいえ、マルチプロセスです。

第9回寒中シェル芸勉強会&第27回バナナで釘が打てますUSP友の会定例会

シェルワンライナーの勉強会です。今回はディレクトリ・ファイル操作のワンライナーを扱います。

1000 Speakers Conference in English 3

英語のスピーチ大会です。お題はなんでも。

景気も若干上向き、消費税対策もあって足が重たいと思いますが、ぜひ息抜き、生活に刺激を与えるために勉強会にお越し下さい。ぜひぜひご登録を。

Pocket
LINEで送る

20日(月曜日)に1000 Speakers Conference in English 2をやるんですが、しくじってしまったので・・・

Pocket
LINEで送る

こんばんわはわは。土曜の夜のビールスポンジ上田です。

私が用務員(?)を務める英語LT(lightning talk, 要はスピーチ)大会
1000 Speakers Conference in English 2
を20日(月)に行いますが、募集開始のタイミングを見誤ってちょっと焦っております。

この会、前回は5分間程度のスライドを持ち寄って英語でLTするというものです。練習の場なので当然下手でも上手でもOKです。また、聴講だけも可能なので、冷やかしでもよいのでぜひぜひご参加ください。話の内容は自由です。前回は英語勉強法、旅行、エクセル方眼紙英語万歳ブレゼンと見せかけてまさかのプロレス、デザイン等々の話題がありました。

特に、「来月アラスカに飛ばされる。しかも風船で」、「手話通訳をしなければいけないが大統領の言っていることがよく分からないので適当にやろうと思う」、「般若心経を英訳する仕事を受注したがどうしていいか分からない。」、「突然、新しい上司として宇宙人が来たが、英語しか話せないらしい」という方々、ぜひご参加を。

Pocket
LINEで送る

第8回シェル芸勉強会お疲れ様でしたー

Pocket
LINEで送る

公式ページは後日ということで、スライドシェアにアップしたのを貼り付けておきます。

各班チームリーダーの方々、会場準備の宮川さん、受付・会計の鎌星コンビ、最初の引き締まった挨拶担当の副会長、どうもどうもありがとうございました。

Pocket
LINEで送る

1000 Speakers Conference in English 1が無事に終わりましたのでご報告と感想

Pocket
LINEで送る

腹風邪で弱っている胃腸に油とアルコールを流し続けている上田です。こんぬつわ。

さて、一昨日は1000 Speakers Conference in English 1でした。私は学会で言うところのvice-chairmanみたいなこととlocal organizerをやりました。

よしおかさん(@hyoshiok)が三週間前に「やりましょう!」と呼びかけて、一昨日6日に日が置かれ、「準備期間短い!」とか言いながら、大学の方々の助けを借りてなんとか準備に協力できました。短いと言いつつも、準備期間が短い方が余計なことをせずにうまく行くのは私も経験上知っていることなので、なんとなく出来レース感があってやりやすかったです。

腹風邪で弱っている胃腸に油とアルコールを流し続けている上田です。こんぬつわ。

さて、一昨日は1000 Speakers Conference in English 1でした。

よしおかさん(@hyoshiok)が三週間前に「やりましょう!」と呼びかけて、一昨日6日に日が置かれ、「備期間短い!」とか言いながら、大学の方々の助けを借りてなんとか準備に協力できました。短いと言いつつも、準備期間が短い方がうまく行くのは私も経験上知っていることなので、なんとなく出来レース感があってやりやすかったです。

参加者は18人、うち発表者が10人、懇親会には16名のご参加がありました。私個人の反省を述べるともう少し学生さま方にリーチする術があればもうちょっと人が呼べたかも。一方、この会は聴講するよりも発表者の方が面白いので、発表者の方が10人もいらっしゃったのを喜ぶべきかもしれません。

ところで私は「英語話そう」という訴えや風潮が嫌いだと方々で話しているのですが、このような会を開くことは大変有意義だと考えております。実際に必要であったり、学びたいものに対して場を提供するということは大事で、

会の本編

まず1分程度の自己紹介があり、5分のLTを10人が行いました。これを書くのがいいのか悪いのか分かりませんが、自己紹介、皆さん普通に喋っていらっしゃるのでビビリました。

次にLT。私が最初にやりました。よしおかさん構想では、話した人が1000人になることを目標とするということで、話した人に番号がつくそうです。ということは私はNo.1ですので、労せずしてあとの999人の頂点に立ったのであります(おい)。英語なのでちょーーとまずいかもしれないが。

I just say, I’m loving Chungking Mansions.

他の方の発表について

その他の方の発表は、言語を超えて楽しめました。かとうさんのエクセルの話はエクセル方眼紙の実物が出てきて大変説得力があり、やっぱりこの方やり手だなと勝手に感心し、おかまつさんは英語勉強しましょうという話に見せかけて結局プロレスの話に滑らかに移行するというWWE的な超絶技法を炸裂させておりました。カマタ師は相変わらずの突撃英語でこれはこれでよいことだと思います。

私が一番英語を話していた20代後半のときには自分は話せる方でしたが、それ以上の年代になると普通レベルに落ちているのを認識できたので、私的にはかなり刺激のある会となりました。また来月開催の予定です。 続きを読む 1000 Speakers Conference in English 1が無事に終わりましたのでご報告と感想

Pocket
LINEで送る