コマンドラインをレベルアップ-RubyでFu
コマンドラインを実際に習得するには、数十(数百ではないにしても)の小さなユーティリティプログラムを習得する必要があります。これらはそれぞれ、動作が少し異なります。それはかなり圧倒される可能性があります。
幸い、これらの単一目的のツールの多くを、Rubyのような汎用プログラミング言語に置き換えることができます。そうすれば、コマンドライン-fuをレベルアップするためにすでに必要なRubyの知識を使用できます。
この投稿では、Rubyをコマンドラインのスイスアーミーナイフとして使用するための基本について説明します。私は賢いワンライナーであなたを攻撃するつもりはありません。代わりに、実際にどのように機能するかを見ていきます。そうすれば、これらの手法を適用して自分の問題を解決できるようになることを願っています。
次のようにコマンドラインからRubyプログラムを実行できることをご存知だと思います。
$ ruby myprogram.rb
しかし、Rubyで実行するコードをパイプできることをご存知ですか?
$ echo "puts 2+2" | ruby
4
さらに便利なのは、コマンドライン引数としてコードを渡す機能です。これが私たちが今日時間を費やすものです。
$ ruby -e 'puts 2+2'
4
上記の例はちょっと紛らわしいですか?パイプとリダイレクトに慣れていないことが原因である可能性があります。良いイントロについては、この投稿をチェックしてください。以下では、パイプを多く使用します。
ほとんどのコマンドラインツールは、一部のデータを取り込んで処理し、吐き出します。
入力を取得するための2つの優れたオプションがあります。コマンドライン引数とSTDINです。それぞれを見てみましょう。
スクリプトには、必要な数のコマンドライン引数を送信できます。他のすべての後に置くだけです:
$ ruby -e '<your code here>' arg1 arg2 arg3 etc
これらの引数は、ARGV
内に格納されます 配列。以下の例では、配列全体をダンプしているので、配列の内容を確認できます。
$ ruby -e 'puts ARGV.inspect' apples bananas pears oranges
["apples", "bananas", "pears", "oranges"]
これがまさにRubyが常に動作する方法であることに注意してください。コマンドラインを使用しているからといって、魔法が発生することはありません。詳細については、ARGVに関するこの投稿を確認してください。
私が超自我的であると少し想像してみてください。私にとって最も重要なことは、私の名前がWeb上で何回言及されているかを知ることです。これまで見てきた手法を使用すると、ワンライナーを簡単に作成して、任意のWebページでこれを計算できます。
$ ruby -e "require 'open-uri'; puts open(ARGV.first).read.scan(/starr/i).count" <url here>
STDIN
コマンドライン引数は優れていますが、値が短い場合にのみ有効です。それらを使用して、たとえば、MobyDickの簡略化されていないテキストを入力することは望ましくありません。そのために、STDINを使用します。
STDINに慣れていない場合でも、恐れることはありません。ここでの目的では、読み取り用に開いている他のファイルと同じように動作します。
これが私の言いたいことです。以下の例では、テキストをRubyにパイプしています。私たちのRubyスクリプトは、STDINからそれを読み取り、画面に出力しています。
echo "bananas!" | ruby -e "puts STDIN.read"
bananas!
cat
を使用すると、大量のデータを簡単に入力できます。 。以下の例では、first
を使用しています テキストの最初の数行を取得するために任意のファイルで使用できるメソッド:
cat moby.txt | ruby -e "puts STDIN.first(3)"
Call me Ishmael. Some years ago--never mind how long precisely--having
little or no money in my purse, and nothing particular to interest me on
shore, I thought I would sail about a little and see the watery part of
STDINの使用方法がわかったので、上からダムの例を書き直してみましょう。 Rubyを使用してWebページをフェッチする代わりに、curl
を使用できます。 パターンマッチングにはRubyのみを使用してください。
curl <MY URL> | ruby -e "puts STDIN.read.scan(/starr/i).size"
STDINとシンタックスシュガー!
STDINを使用している場合、入力の各行をループする必要があるのは非常に一般的です。ディレクトリ内のすべてのファイルのファイル拡張子を取得したいとします。通常のSTDINループを使用してこれを行う方法は次のとおりです。
ls | ruby -e 'STDIN.each_line { |l| puts l.split(".").last }'
rb
rb
csv
STDINループは非常に一般的であるため、Rubyは省略形を提供します。 -n
を使用してスクリプトを実行する場合 フラグを立てると、RubyはSTDINの各行を自動的にループします。現在の行はグローバル変数$_
にあります 。
したがって、上記の例を次のように書き直すことができます。
ls | ruby -n -e 'puts $_.split(".").last'
速記を使用するかどうかはあなた次第です。それは確かにあなたがより少ないコードを書かなければならないことを意味しますが、それはまたあなたが-n
のようなもっと恣意的な事実を覚えなければならないことを意味します および$_
。
このような状況では、通常、出力をSTDOUTに書き込みたいと思うでしょう。これにより、出力を他のプログラムにパイプしたり、必要に応じてディスクにリダイレクトしたりできるため、柔軟性が最も高くなります。
幸いなことに、おそらく非常によく知っているのと同じ印刷コマンドを使用できるようになります。ただし、注意すべきことの1つは、puts
改行を追加します。これは、希望するものである場合とそうでない場合があります。
puts "hello world" # sends "hello world\n" to STDOUT
print "hello world" # doesn't add a newline"
Honeybadgerは、米国のワシントン州に拠点を置いています。つまり、ワシントンに住んでいるすべての支払い顧客に消費税を支払う特権があるということです。
これをかなり単純化しましたが、基本的には、その年のすべてのトランザクションを含むCSVファイルがあります。次のようになります:
1/1/2015,100.00,WA
1/1/2015,50.00,NY
したがって、ワシントンでのすべての取引の合計をすばやく取得するには、次のようなワンライナーを使用できます。
$ cat cc.csv | ruby -e 'puts STDIN.inject(0) { |sum, x| date, amount, state = x.split(","); state.strip == "WA" ? sum + amount.to_f : sum }'
これはCSVファイルを解析するためのひどくずさんな方法であることに注意してください。私はこのコードを実際に送信することは決してありません。しかし、1回限りの問題を解決するための小さなプログラムを作成することの喜びの1つは、すべてのエッジケースを無視できることです。それが私がここでやろうとしていることです。
-
Rubyでパーサーを構築する方法
構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ
-
ID ウォッチドッグで ID を保護
彼らについて ID ウォッチドッグは、個人情報の盗難が常に不可能であることを保証する市場での過去 13 年間の存在を証明してきました。クレイグ・ラムゼイ氏は、2005 年 6 月にコロラド州デンバーにある信用専門家のグループと共にこの会社を設立し、ID 盗難保護サービスの国内有数の上位 5 社にその名前を登録しました。 ID Watchdog は当初、法執行機関、銀行、クレジット会社、司法代理人、および情報プライバシーのリーダーとの協議に 2 年間を費やしました。 ID 保護とは別に、ID Watchdog は 2007 年に公式プラットフォームをリリースし、個人向けサービス、保険パートナー