O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
シェルで繰り返し処理
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オプションの利用を考える
Próximos SlideShares
Carregando em…5
×

シェルで繰り返し処理

633 visualizações

Publicada em

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

Publicada em: Tecnologia
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

シェルで繰り返し処理

  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オプションの利用を考える

×