Werte vertauschen
Dies geht ohne temporäre Variable.
Assert
Testet den Block und wirft bei false eine Exception im Debugmodus.
1
2
3
4
5
|
def assert
raise "Assertion failed" unless yield if $DEBUG
end
assert { self.is_a? Object } |
Für eine etwas umfangreichere Implementierung, die einen IRB-Prompt im passenden Kontext erzeugt, und weniger Overhead hat, wenn der Debugmodus deaktiviert ist, siehe auch http://ruby-breakpoint.rubyforge.org/doc/classes/Breakpoint.html#M000005.
Zeilen zusammenfassen
- -00 bestimmt ein Record Seperator der Länge Null, heißt gets liest absatzweise aus der Datei
- -n while(gets); ... ; end wrapt sich um das Skript
- -e bestimmt direkt einen String als Ruby-Skript
Mehrere Zeilen in einem Absatz werden zu einer Zeile zusammengefasst.
|
ruby -00 -ne 'puts $_.split("\n").join(" ")' Dateiname |
Zeilen suchen aka Ruby Grep
Druckt nur die Zeilen die den Regulären Ausdruck matchen.
|
ruby -00 -ne 'print if /Suchausdruck/' Dateiname |
Zufalls Array
Verteilt die Elemente eines Arrays neu nach Zufallsprinzip.
1
2
3
4
5
|
class Array
def shuffle
self.sort_by { rand }
end
end |
Zufalls Zeile
Hier kommen gleich ein paar Ruby-Tricks zum Einsatz.
- -ne sorgt für ein while(gets) Loop
- rand gibt eine Zufallszahl zwischen 0 und 1 zurück
- $. ist die aktuelle Zeilennummer. Startet bei 1.
- Der END-Block wird am Ende des Skripts ausgeführt.
|
ruby -ne 'line = $_ if rand < 1 / $. .to_f ; END { puts line }' </usr/share/dict/words |
Zeilen zählen
Ein banales aber irgendwie nettes Skript.
|
ruby -ne 'END {puts $.}' Dateiname |
Prüfsumme erstellen aka Ruby md5sum
Gibt die md5-Prüfsumme einer Datei aus:
|
ruby -r md5 -e "puts MD5.new(open(ARGV[0], 'rb').read).hexdigest" Dateiname |
größter gemeinsamer Teiler
gefunden in ruby-talk:
Rudolph Polzer
Sieht auch sehr schön aus, find ich.
Ermittelt den ggT(a,b), wobei das Ergebnis in a gespeichert wird.
|
a, b = b, a % b while b != 0 |
Text in vielen Dateien ersetzen
Sehr nützlich.
- -i verändert die Dateien direkt, optional kann man eine Erweiterung für Backups angeben, z.B. bak
- -pe führt in der while(gets) Schleife aus und schreibt $_ am Ende auf Standardoutput (wie z.B. sed).
- Kernel#gsub! operiert auf $_ , das durch gets gesetzt wurde
|
ruby -i -pe "gsub!(/ein regulärer Ausdruck/, 'zum Ersetzen')" Datei1 Datei2 ... |
Einbruchssicherung
Sucht nach root accounts in der Passwort-Datei.
Nützlich, da rootkits die Systemtools wie cat ersetzen.
Hier wiederum operiert /:0:/ auf $_
|
ruby -ne 'p if /:0:/' /etc/passwd |
Uhrzeit bitte...
|
ruby -e "loop { puts Time.now; sleep 1 }" |
oder...
|
ruby -e "loop {print Time.now; STDOUT.flush; sleep 1; print 8.chr*80}" |
oder...
|
ruby -e 'loop { print "\r#{Time.now}"; STDOUT.flush; sleep 1 }' |
Query-String in Hash konvertieren
1
2
3
|
query_string = 'arg1=val1&arg2=%2fval2%2f'
args = Hash[*query_string.scan(/(.+?)=(.*?)(?:&|$)/).flatten].each_value { |v| v.gsub!(/%([0-9a-f]{2})/i) { [$1.hex].pack 'C' } }
p args #-> {"arg1"=>"val1", "arg2"=>"/val2/"} |
Derzeit geöffnete Dateien
Um Dateien löschen zu können, dürfen diese nicht mehr geöffnet sein.
Manchmal ist es hilfreich, dazu alle derzeit geöffneten Dateien anzeigen zu lassen.
|
ObjectSpace.each_object( File ){|obj| p obj unless obj.closed?} |
Primzahlberechner
Berechnet alle Primzahlen von 1 bis Unendlich ;-)
Von hier.
|
i=l=1;(l%i+=1)>i-2&&p(i)while l*=i |