Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
シェルで繰り返し処理
USP友の会 @papiron
繰り返し処理
• コンピュータの得意技
• データ処理の基本
• プログラミング言語に必ず搭載
繰り返し処理
• シェルスクリプトでは?
• ワンライナーでは?
• フィルタとは?
• 高速処理するには?
お題
右のような
連続する文字列を
出力をする方法を
考えてみる
羊が1匹
羊が2匹
・・
・・
羊が99匹
羊が100匹
制御構造を使う(1)
$ n=1;while [ $n -le 100 ]; do echo '羊が'$n'匹';
n=`expr $n + 1`; done
羊が1匹
羊が2匹
..
..
羊が99匹
羊が100匹
シェルでも制御構造が使える...
制御構造を使う(1)
#!/bin/sh
n=1
while [ $n -le 100 ]
do
echo '羊が'$n'匹'
n=`expr $n + 1`
done
ワンライナでは見にくいので
シェルスクリプトで記載
数列データ作成の方法
$ seq 1 100
1
2
..
100
bashのブレース展開
を使う
$ echo {1..100}
1 2 3 .. 99 100
seqコマンドを使う
制御構造を使う(2)
$ for n in `seq 100`; do echo '羊が'$n'匹'; done
$ for n in {1..100} ; do echo '羊が'$n'匹'; done
1から100の数列を準備
繰り返し処理...
制御構造を使う(2)
#!/bin/sh
for n in `seq 100`
do
echo '羊が'$n'匹'
done
ワンライナでは見にくいので
シェルスクリプトで記載
制御構造を使う(3)
$ seq 100 | while read n; do echo '羊が'$n'匹'; done
1から100の数列を準備
繰り返し処理のwhileループにパイプ接続
制御構造を使う(3)
#!/bin/sh
seq 100 |
while read n
do
echo '羊が'$n'匹'
done
ワンライナでは見にくいので
シェルスクリプトで記載
xargsを使う(1)
$ seq 100 | xargs printf '羊が%d匹n'
1から100の数列を準備
xargsにパイプ接続してprintfコマンドへ
printf '羊が%d匹' 1 2 3 4 .. 99 100
実質は下記...
xargsを使う(2)
$ seq 100 | xargs -I@ echo '羊が@匹'
1から100の数列を準備
xargsの-Iオプションを利用
echo '羊が1匹'
echo '羊が2匹'
..
echo '羊が100匹'
実質は右記...
シェルにコマンド列を
$ seq -f 'echo 羊が%g匹' 100 | sh
下記のようなコマンド列を作成
シェルにパイプで渡して実行
echo 羊が1匹
echo 羊が2匹
..
echo 羊が99匹
echo 羊が100匹
パイプ
シ...
フィルタコマンドで
$ seq 100 | sed 's/^/羊が/' | sed 's/$/匹/'
1から100の数列を準備
パイプでsedに渡して処理
sedがフィルタとして動作
コマンドの繰り返し実行が無いため
高速な処理が期待出来る
繰り返し処理の考え方
• 処理したいデータリストを準備
• 1行1レコードなテキストデータ
• データファイル名一覧
• コマンドの出力
繰り返し処理の考え方
• 処理するコマンドのデザイン
• フィルタとして動作するか?
• GNU dateはオプションでフィルタ動作
• 複数の引数が指定出来るか?
• lsコマンド、fileコマンドなど
繰り返し処理の考え方
• フィルタとして動作する
• これが出来れば理想的
• パイプで高速処理の可能性
繰り返し処理の考え方
• 複数の引数が指定出来る
• xargsの利用を検討する
• xargsは引数が長すぎても大丈夫
繰り返し処理の考え方
• フィルタも複数引数もダメ
• 制御構造を考える
• xargsの-nや-Iオプションの利用を考える
Upcoming SlideShare
Loading in …5
×

シェルで繰り返し処理

649 views

Published on

22回シェル芸勉強会、福岡サテライト会場午前の部で説名した内容です。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

シェルで繰り返し処理

  1. 1. シェルで繰り返し処理 USP友の会 @papiron
  2. 2. 繰り返し処理 • コンピュータの得意技 • データ処理の基本 • プログラミング言語に必ず搭載
  3. 3. 繰り返し処理 • シェルスクリプトでは? • ワンライナーでは? • フィルタとは? • 高速処理するには?
  4. 4. お題 右のような 連続する文字列を 出力をする方法を 考えてみる 羊が1匹 羊が2匹 ・・ ・・ 羊が99匹 羊が100匹
  5. 5. 制御構造を使う(1) $ n=1;while [ $n -le 100 ]; do echo '羊が'$n'匹'; n=`expr $n + 1`; done 羊が1匹 羊が2匹 .. .. 羊が99匹 羊が100匹 シェルでも制御構造が使える whileループで繰り返し処理
  6. 6. 制御構造を使う(1) #!/bin/sh n=1 while [ $n -le 100 ] do echo '羊が'$n'匹' n=`expr $n + 1` done ワンライナでは見にくいので シェルスクリプトで記載
  7. 7. 数列データ作成の方法 $ seq 1 100 1 2 .. 100 bashのブレース展開 を使う $ echo {1..100} 1 2 3 .. 99 100 seqコマンドを使う
  8. 8. 制御構造を使う(2) $ for n in `seq 100`; do echo '羊が'$n'匹'; done $ for n in {1..100} ; do echo '羊が'$n'匹'; done 1から100の数列を準備 繰り返し処理はforループを使用 `seq 100`はシェルのコマンド置換機能
  9. 9. 制御構造を使う(2) #!/bin/sh for n in `seq 100` do echo '羊が'$n'匹' done ワンライナでは見にくいので シェルスクリプトで記載
  10. 10. 制御構造を使う(3) $ seq 100 | while read n; do echo '羊が'$n'匹'; done 1から100の数列を準備 繰り返し処理のwhileループにパイプ接続
  11. 11. 制御構造を使う(3) #!/bin/sh seq 100 | while read n do echo '羊が'$n'匹' done ワンライナでは見にくいので シェルスクリプトで記載
  12. 12. xargsを使う(1) $ seq 100 | xargs printf '羊が%d匹n' 1から100の数列を準備 xargsにパイプ接続してprintfコマンドへ printf '羊が%d匹' 1 2 3 4 .. 99 100 実質は下記のコマンドが実行 繰り返し実行が無いため高速処理が期待
  13. 13. xargsを使う(2) $ seq 100 | xargs -I@ echo '羊が@匹' 1から100の数列を準備 xargsの-Iオプションを利用 echo '羊が1匹' echo '羊が2匹' .. echo '羊が100匹' 実質は右記のコマンドが 実行されている
  14. 14. シェルにコマンド列を $ seq -f 'echo 羊が%g匹' 100 | sh 下記のようなコマンド列を作成 シェルにパイプで渡して実行 echo 羊が1匹 echo 羊が2匹 .. echo 羊が99匹 echo 羊が100匹 パイプ シェ ル
  15. 15. フィルタコマンドで $ seq 100 | sed 's/^/羊が/' | sed 's/$/匹/' 1から100の数列を準備 パイプでsedに渡して処理 sedがフィルタとして動作 コマンドの繰り返し実行が無いため 高速な処理が期待出来る
  16. 16. 繰り返し処理の考え方 • 処理したいデータリストを準備 • 1行1レコードなテキストデータ • データファイル名一覧 • コマンドの出力
  17. 17. 繰り返し処理の考え方 • 処理するコマンドのデザイン • フィルタとして動作するか? • GNU dateはオプションでフィルタ動作 • 複数の引数が指定出来るか? • lsコマンド、fileコマンドなど
  18. 18. 繰り返し処理の考え方 • フィルタとして動作する • これが出来れば理想的 • パイプで高速処理の可能性
  19. 19. 繰り返し処理の考え方 • 複数の引数が指定出来る • xargsの利用を検討する • xargsは引数が長すぎても大丈夫
  20. 20. 繰り返し処理の考え方 • フィルタも複数引数もダメ • 制御構造を考える • xargsの-nや-Iオプションの利用を考える

×