在ruby脚本中使用grep

时间:2012-09-04 16:31:29

标签: ruby bash grep

我有一个简单的脚本,它会抓取一个网页并将内容行放到屏幕上,然后我只需将它管道输出到grep以输出我想要的内容,然后将其输送到更少的内容。

myscript.rb scrape-term | grep argument | less

我更改了脚本以使用以下内容,而不是在命令行上添加额外的参数;

%x[ #{my-text-output} | grep argument | less ]

但现在我收到了错误;

sh: 0: command not found

我已经尝试了here找到的其他变体,但没有任何效果!

2 个答案:

答案 0 :(得分:0)

您需要做的是打开grep的句柄,而不是将输出卡在那里。黑客解决方案是将输出转储到Tempfile中,并通过grep从中读取,但实际上这是一团糟。

理想情况下,您所做的只是通过过滤发出与您的模式匹配的输出:

while (...)
  # ...

  if (output.match(/#{argument}/))
    puts argument
  end
end

如果需要,可以将其引导至less

请记住,对于Array中的任何内容,Ruby中还有一个grep方法。例如,如果您创建了一个名为output的数组,其中包含以下行:

output.grep(/#{argument}/).each do |line|
  puts line
end

答案 1 :(得分:-1)

因为你要在shell中运行它,因为less命令,所以可以试试这个:

%x[ echo #{my-text-output} | grep argument | less ]

您还可以尝试echo -e \n作为换行符等。

(理想情况下,您的文字在每行的末尾都应该有\n个字符。)

修改

忘记""变量。尽管Unknown Command不想与我合作,但不会再出现less错误。我现在有这个script.rb:

text = "foo
foobar
foobaraski
bar
barski"

a = %x[ echo "#{text}" | grep foo]

print a

它给了我:

shell> ruby script.rb 
foo
foobar
foobaraski

编辑2:

现在它起作用了:

text = "foo
foobar
foobaraski
bar
barski"
system "echo '#{text}' | grep foo | less"

使用三行打开较少,就像bash命令一样。