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.

Ruby のワンライナーについて

456 views

Published on

2019-02-20 Otemachi.rb #14 発表資料

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Ruby のワンライナーについて

  1. 1. Ruby のワンライナーについて 2019/02/20 大手町.rb #14
  2. 2. 大手町.rb #14 「Rubyのワンライナーについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も! Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大手町.rb の中の人 毎月 大手町.rb の開催を予定 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット
  3. 3. 大手町.rb #14 「Rubyのワンライナーについて」 今日のテーマ Ruby のワンライナーについて ワンライナーとは ruby –e など、一行でいろんなことを実現することです。 シェル上でさくっと実行できる使い捨てのスクリプト たった1行でたくさんのことを実施できます 2
  4. 4. 大手町.rb #14 「Rubyのワンライナーについて」 表示 -e オプションの引数を Ruby スクリプトと解釈します 計算・四則演算 順列組合せをすべて表示する Ruby にはイケてるメソッドがたくさん ワンライナーで実行することで、shell のコマンド履歴 に残る あとで、もう一度使いたいときに検索しやすい ワンライナーの基本 3 ruby -e 'puts 70/(1.75*1.75)' # 体重70Kg、身長 175cm の BMI ruby -e 'puts "Hello, World!"' ruby -e 'puts [1,2,3].permutation(2).map{|a| a.join(",")}'
  5. 5. 大手町.rb #14 「Rubyのワンライナーについて」 拡張ライブラリの利用 -r で拡張ライブラリを読み込めます ランダムな文字列を表示する -r のあとに半角空白を書いても書かなくても正しく動作します YAML を JSON に変換する -r を複数回書くこともできます 4 ruby -r securerandom -e 'puts SecureRandom.hex' #=> 99a92ed098bdfaac8a27816220b76c89 ruby -rsecurerandom -e 'puts SecureRandom.uuid' #=> d528c944-dfcd-4ccf-bc33-4431024b5cfc ruby -ryaml -rjson -e ¥ 'puts YAML.load_file("config/locales/ja.yml").to_json' #=> {"ja": 略 }
  6. 6. 大手町.rb #14 「Rubyのワンライナーについて」 ワンライナーで特に有用な un un (unix ライクコマンドのユーティリティ) Windows でも Unix と同様にワイルドカードを認識できる 特に httpd が他のマシンとのデータ交換などの目的で便利 5 ruby -run -e cp -- [-prv] SOURCE DEST ruby -run -e ln -- [-sfv] TARGET LINK_NAME ruby -run -e mv -- [-v] SOURCE DEST ruby -run -e rm -- [-frv] FILE ruby -run -e mkdir -- [-pv] DIRS ruby -run -e rmdir -- [-v] DIRS ruby -run -e install -- [-pv -m mode] SOURCE DEST ruby -run -e chmod -- [-v] OCTAL-MODE FILE ruby -run -e touch -- [-v] FILE ruby -run -e wait_writable -- [OPTION] FILE ruby -run -e mkmf -- [OPTION] EXTNAME [OPTION] ruby -run -e httpd -- [OPTION] DocumentRoot ruby -run -e help [COMMAND]
  7. 7. 大手町.rb #14 「Rubyのワンライナーについて」 -n : 入力を受け取り、順次処理する 正規表現にマッチする行を表示する 上と同じ。 「$_ =~」 は省略可。 -ne とも短縮可 print を使うと、引数 $_ を省略できる 6 ruby –n -e 'puts $_ if $_ =~ %r(18/Feb/2019)' ruby –ne 'puts $_ if %r(18/Feb/2019)' ruby –ne 'print if %r(18/Feb/2019)'
  8. 8. 大手町.rb #14 「Rubyのワンライナーについて」 -p : 入力を受け取り加工後出力する 大文字に変換する 各行の $_ の内容を表示する とはいえ、Ruby では単に puts を使う方が自然な気がする 7 echo -e "abc¥nabcde¥nabcdefg¥n" | ruby -pe '$_ = $_.upcase' ABC ABCDE ABCDEFG ruby -ne 'puts $_.upcase'
  9. 9. 大手町.rb #14 「Rubyのワンライナーについて」 -a : 空白区切りで配列として受け取る PPID が 1 のプロセスを一覧表示 空白区切りで分割した結果がグローバル変数 $F に入る $F は文字列の配列。 特定の IP アドレスからのユーザのアクセスを調査 上記の 6 とか 0 とかの部分はログフォーマットで異なるので 適宜修正してください。 $F[6] にアクセスしているパスが入っている想定です 8 ps -ef | ¥ ruby -ane 'puts $F.values_at(0,1,7).join(",") if $F[2] == "1"' cat log/nginx-access.log | ¥ ruby –ane 'puts $F[6] if $F[0] == "xxx.xxx.xx.xx"'
  10. 10. 大手町.rb #14 「Rubyのワンライナーについて」 -F : -a で区切るときの文字を指定する /etc/passwd で : で区切り、最初の要素を表示 $F[-1] で最後の要素にアクセスできる $F.last でも最後の要素にアクセスできる 9 cat /etc/passwd | ¥ ruby –anF: -e 'puts $F[0]' cat /etc/passwd | ¥ ruby –anF: -e 'puts $F[0] if $F[-1].chomp.end_with?("sh")' cat /etc/passwd | ¥ ruby –anF: -e 'puts $F[0] if $F.last.chomp.end_with?("sh")'
  11. 11. 大手町.rb #14 「Rubyのワンライナーについて」 -e を複数回書く場合 -e は複数回 書ける。 複数回書くと、それぞれが改行区切りで順にあるように 解釈される 上記のスクリプトを使うと最新の manifest ファイルで アセットの対応関係を表示することができる 10 ls -1t public/assets/manifest-*.json | ¥ head -n 1 | ¥ ruby -r json –e 'json = JSON.load(open(ARGF.read.chomp).read)' ¥ -e 'puts json["assets"].map{|v| v.join("¥t")}'
  12. 12. 大手町.rb #14 「Rubyのワンライナーについて」 BEGIN 、END BEGIN で前処理、END で後処理を書くことができる 下記の例では、BEGIN で変数の初期化 END で計算後の出力処理を実施している 11 aws cloudwatch get-metric-statistics ¥ --metric-name RequestCount ¥ --start-time $(date -u -d "1 hour ago" +%FT%H:00:00) ¥ --end-time $(date -u +%FT%H:00:00) ¥ --period 60 --namespace AWS/ELB --statistics Sum ¥ --dimensions Name=LoadBalancerName,Value=prod-front ¥ --query "Datapoints[]" --output text | ¥ ruby -ane 'BEGIN{ $min, $max = Float::INFINITY, 0 }' ¥ -e '$max, $max_time = $F[0].to_f, $F[1] if $max < $F[0].to_f' ¥ -e '$min, $min_time = $F[0].to_f, $F[1] if $min > $F[0].to_f' ¥ -e 'END{ puts "#{$max_time} max: #{$max}"; puts "#{$min_time} min: #{$min}"}'
  13. 13. 大手町.rb #14 「Rubyのワンライナーについて」 まとめ Ruby のワンライナーを作るときのテクを紹介しました ちょっとしたときにとても便利です コマンド実行履歴で検索できるのも、便利です。 キメるととても気持ちいい! 💊 Happy Engineer Life を! 12
  14. 14. ご清聴ありがとう ございました

×