2011-05-30 66 views
0

我有一个命令行脚本,返回类似:使用Ruby在命令行中,如何采取具体列遍历每个

col1 col2 col3 col4 col5 
a b c d e 
a1 b2 c2 d2 e2 
a3 b3 c3 d3 e3 
.. 
.. 
. 

现在,我想借此从COL3的值,然后调用列3中每一行的另一个命令行脚本。

我知道ruby有一个系统(“..”)函数,它将在控制台中运行脚本。

我的命令行脚本是非常相似,调用类似:

system("ls -l") 

现在我怎么能捕获列#3,遍历每个值,并触发了另一个脚本传递从山坳#3的值一个参数?

+1

“为每列值的行”,“每第3列中的行“,”具有9列的信息行“,”第3列和迭代每个值“:这些表达式难以理解。 – sawa 2011-05-30 21:32:02

+0

sawa我已经更新了它,你的权利措词令人困惑,希望这会更好。 – Blankman 2011-05-30 21:40:59

回答

2
IO.popen('ls -l').lines.map(&:split)[1..-1].transpose[2].each do |e| 
    puts '>>' + e + '<<' 
end 

我要提醒你,如果你拿这个去很明显,下一步,构建调用“系统”或块内甚至popen,您将创建代码注入风险。在这种特定情况下,只有文件所有者只能使用字母数字结果,只是简单地过滤这些字符应该足够好。

+0

我在本地运行,并且所有输入都是可信的。 – Blankman 2011-05-31 02:14:53

+0

当然,我很怀疑。我宁愿没有说什么,只是在这里发表一个简单的解释,所以我总是不得不说出这样的警告,因为它有时会引发一场安全寻找女巫的行为。我应该保持准备就绪,只要将它粘贴进来。为了公平地对待调查者,多年来一些答案*被访问了很多,我们必须考虑未来的访问者将会看到什么...... – DigitalRoss 2011-05-31 02:44:45

+0

这是非常周到的你到interwebs :) – Blankman 2011-06-11 01:34:32

0

你可以只somehing像

#!/usr/bin/env ruby 
cols, take_col = ARGV[0],ARGV[1] 
puts $stdin.read.split.drop(cols).select.with_index{|x, i| i % cols == take_col - 1} 
在一个文件中,比如

,命名take-col,并与管使用它,就像

$ ls-like-cmd | take-col 5 3 | next-cmd