我正在编写一个程序,它将从who命令中提取信息并格式化输出。
正常的who命令:
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)
user ip date (ip)我对who命令的新看法是:
user
user
user
user
user
user
user
user
user
user
user为了做到这一点,我必须使用gsub和其他一些东西完全删除数字,整行如下所示:
`who`.gsub!(/\d+/, "").gsub!(/\..../, "").gsub!(/\(/, "").gsub(/\Dec/, "").gsub(/\:/, "").gsub(/\pts/, "").gsub(/\//, "").gsub(/\./, "").gsub(/\)/, "").gsub(/\localhost/, "").gsub(/\Nov/, "").squeeze(" ").strip有没有更好的方法来编写这个正则表达式没有所有这些gsub的?
编辑:
可接受答案的更新who输出:puts `who`.gsub(/[ \t].*/,"")
输出现在如下所示:
John
Jim
Jake
Steve
Josh
Eric
etc..发布于 2015-12-24 20:34:07
这里有三种方法。首先,尝试users命令。:)
第二:
who | sed -e 's/[ \t].*//g'第三:
puts `who`.gsub(/[ \t].*/,"")这三种方法都要短得多,也简单得多。
发布于 2015-12-24 20:35:38
没有正则表达式怎么样?
users = `who`.each_line.map do |line|
line.split.first
end或者,如果这是整个实用程序,它可能只是:
who | awk '{ print $1 }'@DavidHoelzer是对的,请使用users。=)
发布于 2015-12-24 22:25:13
我经常看到的一件事是,人们希望通过删除不属于自己的东西来提取信息,而不是简单地获取他们想要的东西。拿你想要的东西比删除你不想要的东西要快,特别是在处理大量文本的时候,它会产生更容易遵循的代码。
如果我想用一行中的第一个单词,我想要所有的东西都到第一个空格。很容易就能抓到:
who_out = <<EOT
user1 tty7 2012-08-07 05:33 (:0)
user2 192.168.0.1 2012-08-07 06:47 (:0.0)
user3 127.0.0.1 2012-08-07 07:58 (:0.0)
EOT
who_out.lines.map{ |l| l[/^\S+/] } # => ["user1", "user2", "user3"]
who_out.lines.map{ |l| l[/\A\S+/] } # => ["user1", "user2", "user3"]
who_out.scan(/^\S+/) # => ["user1", "user2", "user3"]
who_out.scan(/^\w+/) # => ["user1", "user2", "user3"]
who_out.lines.map{ |l| l.split.first } # => ["user1", "user2", "user3"]前两个查找行的开头(^和\A),并将所有非空白(\S+)的内容返回到第一个空白。
scan查找行开始(^),并在每一行中找到相同的第一个空格。\w与[a-zA-Z0-9_]相匹配,这几乎就是我们想要的用户名,因为它们通常是大写和小写字符加上数字和_。
最后一个问题应该很容易理解。
https://stackoverflow.com/questions/34457653
复制相似问题