Ruby File I/O
Reading Files
File reading patterns
content = File.read("/etc/hostname")
lines = File.readlines("/etc/resolv.conf", chomp: true)
# Block form (auto-closes)
File.open("/var/log/syslog") do |f|
f.each_line do |line|
puts line if line.include?("error")
end
end
# First N lines
File.foreach("/var/log/auth.log").first(10).each { |l| puts l }
Writing Files
File writing patterns
File.write("/tmp/hosts.txt", "vault-01\nise-01\n")
File.write("/tmp/scan.log", "#{Time.now} done\n", mode: "a") # append
File.open("/tmp/report.csv", "w") do |f|
f.puts "hostname,ip,status"
devices.each { |d| f.puts "#{d.hostname},#{d.ip},#{d.status}" }
end
File Operations
Metadata and path manipulation
File.exist?("/etc/hosts")
File.file?("/etc/hosts")
File.directory?("/etc")
File.size("/var/log/syslog")
File.mtime("/etc/hosts")
File.basename("/etc/ssl/certs/ca.pem") # => "ca.pem"
File.dirname("/etc/ssl/certs/ca.pem") # => "/etc/ssl/certs"
File.extname("config.yml") # => ".yml"
File.expand_path("~/atelier")
File.join("etc", "ssl", "certs") # => "etc/ssl/certs"
Directory operations
require "fileutils"
Dir.glob("/etc/ssl/**/*.pem")
Dir["/var/log/*.log"]
FileUtils.mkdir_p("/tmp/reports/2026/04")
FileUtils.cp("src.conf", "dst.conf")
FileUtils.rm_rf("/tmp/stale_cache")
Dir.mktmpdir("scan-") do |tmpdir|
File.write("#{tmpdir}/results.json", data.to_json)
end
CSV and JSON
Structured data I/O
require "csv"
CSV.foreach("/tmp/devices.csv", headers: true) do |row|
puts "#{row['hostname']} => #{row['ip']}"
end
require "json"
data = JSON.parse(File.read("config.json"), symbolize_names: true)
File.write("output.json", JSON.pretty_generate(data))
IO and Streams
External commands
output = `hostname -f`.strip
success = system("ping -c 1 10.50.1.1")
require "open3"
stdout, stderr, status = Open3.capture3("openssl version")
puts stdout if status.success?
IO.popen("grep -c error /var/log/syslog") do |io|
count = io.read.strip.to_i
end