gpt4 book ai didi

ruby - 通过 ARGV/ARGF 接受多个命令行参数

转载 作者:太空宇宙 更新时间:2023-11-03 17:50:38 26 4
gpt4 key购买 nike

我试图让我的代码能够接受来自命令行输入的多个日志文件,以根据不同的分隔符进行解析,并接受命令来解析某个日志文件的所有步骤。

它目前一次只能接受一个命令,它解析的日志文件是在代码中确定的,而不是变量@log_file下的命令行输入:

@log_file = "07-07-14 to 07-13-14_debug.log"
@log_levels = ['DEBUG', 'INFO ', 'WARN ', 'ERROR', 'FATAL']

def error_sort
@log_levels.each do |log_level|
File.readlines(@log_file).each do |line|
if (line =~ /<#{log_level}>/ .. line =~ /<(?!#{log_level}).+>/) && line !~ /<(?!#{log_level}).+>/
File.open("#{log_level}.txt", "a") << line
end
end
end
end

def read_log(step)
File.readlines(@log_file).each do |line|
if line.match /Recording dut_serial_number/
File.open("step_#{step}", "a") << line
elsif (line =~ /Beginning step ##{step} / .. line =~ /Beginning step #(?!#{step}).+ /) && line !~ /Beginning step #(?!#{step}).+ /
File.open("step_#{step}", "a") << line
else
nil
end
end
end

command_line = ARGV[0..1]

ARGV.each do |num|
if command_line == ["--step", "#{num}"]
read_log("#{num}".to_i)
elsif command_line == ["--sort"]
error_sort
else
nil
end
end

想法?

最佳答案

这可以使用命令行参数解析库(如 OptionParser)轻松完成。

require 'optparse'

LOG_LEVELS = ['DEBUG', 'INFO ', 'WARN ', 'ERROR', 'FATAL']

def error_sort(log_file)
LOG_LEVELS.each do |log_level|
File.readlines(log_file).each do |line|
if (line =~ /<#{log_level}>/ .. line =~ /<(?!#{log_level}).+>/) && line !~ /<(?!#{log_level}).+>/
File.open("#{log_level}.txt", "a") << line
end
end
end
end

def read_log(log_file, step)
File.readlines(log_file).each do |line|
if line.match /Recording dut_serial_number/
File.open("step_#{step}", "a") << line
elsif (line =~ /Beginning step ##{step} / .. line =~ /Beginning step #(?!#{step}).+ /) && line !~ /Beginning step #(?!#{step}).+ /
File.open("step_#{step}", "a") << line
else
nil
end
end
end

options = {}

optparse = OptionParser.new do |opts|
opts.on("--sort", "Explain what this option does here.") do
options[:sort] = true
end

opts.on("--step NUM", Integer, "Explain what this option does here.") do |num|
options[:step] = num # num is automatically converted to an Integer
end
end

optparse.parse! # all non-option arguments remain in ARGV

log_file = ARGV[0]

if options[:sort]; error_sort(log_file); end
if options[:step]; read_log(log_file, options[:step]); end

关于 OptionParser 的更多信息:

编辑:

为了允许使用相同的标志两次,例如--step 3 --step 5,我们可以将 options 映射中的 :step 条目更改为指定数字的数组,例如这个:

options = {:step => []}

optparse = OptionParser.new do |opts|
...

opts.on("--step NUM", Integer, "Explain what this option does here.") do |num|
options[:step] << num
end
end

然后用 :step 参数改变你的程序的语义,它现在是一个数组而不是单个数字:

unless options[:step].empty?
options[:step].each {|n| read_log(log_file, n)}
end

所有非选项参数都保留在 ARGV 中,因此您可以轻松启用多个文件处理:

ARGV.each do |log_file|
if options[:sort]
error_sort(log_file)
end

unless options[:step].empty?
options[:step].each {|n| read_log(log_file, n)}
end
end

关于ruby - 通过 ARGV/ARGF 接受多个命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25410165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com