如何将rake路由输出限制为URI Pattern和Controller#action列?

时间:2016-05-24 02:26:49

标签: ruby-on-rails awk routes rake

在我的Mac上的rails 4.x应用程序中,我调用rake路由,然后得到以下输出:

原始输出(没有awk):

> bundle exec rake routes
Prefix Verb   URI Pattern    Controller#Action                                                  
new_user_session GET    /users/sign_in(.:format)           devise/sessions#new                                       
                 PATCH  /users/password(.:format)          devise/passwords#update
new_api_user_session GET    /api/auth/sign_in(.:format)    devise_token_auth/sessions#new {:format=>:json}

我想调用rake路由,但只输出最后两列(URI Pattern和Controller#action)。事实上,最后两列以' /'开头,而前两列永远不会有' /'。

期望的输出:

> bundle exec rake routes | awk 'something'
URI Pattern    Controller#Action                                                  
/users/sign_in(.:format)           devise/sessions#new                                       
/users/password(.:format)          devise/passwords#update
/api/auth/sign_in(.:format)    devise_token_auth/sessions#new {:format=>:json}

我试过这些方法:

方法1:

> bundle exec rake routes | awk '{print $(NF-1),"\t",$NF}'
Pattern      Controller#Action
/users/sign_in(.:format)           devise/sessions#new                                       
/users/password(.:format)          devise/passwords#update
devise_token_auth/sessions#new     {:format=>:json}

前两行(/ users / sign_in和/ users / password)工作正常,但由于默认字段,第三行将devise_token_auth / sessions #new和{:format =>:json}视为单独的列分隔符是空间。此外,出于同样的原因,标题行从URI模式中删除了单词URI。

方法2:

> bundle exec rake routes | awk '{$1=""; $2=""; print}'
URI Pattern Controller#Action
/users/sign_in(.:format)           devise/sessions#new                                       
devise/passwords#update
/api/auth/sign_in(.:format)    devise_token_auth/sessions#new {:format=>:json}

在第二种方法中,它适用于第一行(/ users / sign_in)和第三行(/ api / auth / sign_in),但它在第二行中搞砸了,因为第一行是空白的(前缀) )专栏。

方法3:

我还在rake路线上寻找过滤器开关,(就像top命令有-stats一样)?但在the routes rakefile中,我无法找到任何此类选项。

方法4:

以下方法有效,但它使用了与数据不同的事实 - 我们需要以第一个' /'开头的所有内容:

# rake_awk


#!/usr/bin/awk -f
{   
  search="/";
  n=split($0,array,search);
  if(n == 1) {
   print "\n", $3, $4, "\t\t\t\t\t\t\t", $5, "\n";
  }
  else {
    for (i=2;i<=n;i++) {
        if (i < n) {
          printf("/%s", array[i]);
        }
        else {
          printf("/%s\n", array[i]);
        }
    }
  }
}

从命令行:

> bundle exec rake routes | /path/to/rake_awk

URI Pattern                         Controller#Action

/users/sign_in(.:format)           devise/sessions#new                                       
/users/password(.:format)          devise/passwords#update
/api/auth/sign_in(.:format)        devise_token_auth/sessions#new {:format=>:json}

3 个答案:

答案 0 :(得分:2)

根据您的最新要求和您发布的答案,这可能是您想要的:

$ cat tst.awk
NR==1 { print $3, $4 "\t" $5; next }
{ sub("[^/]+",""); sub(/ +/,"\t"); print }

$ awk -f tst.awk file
URI Pattern     Controller#Action
/users/sign_in(.:format)        devise/sessions#new
/users/password(.:format)       devise/passwords#update
/api/auth/sign_in(.:format)     devise_token_auth/sessions#new {:format=>:json}

$ awk -f tst.awk file | column -s $'\t' -t
URI Pattern                  Controller#Action
/users/sign_in(.:format)     devise/sessions#new
/users/password(.:format)    devise/passwords#update
/api/auth/sign_in(.:format)  devise_token_auth/sessions#new {:format=>:json}

答案 1 :(得分:1)

我使用更新的数据解决了所需的输出以&#39; /&#39;开头。感谢问题评论中的shellter链接(我今天从Ed Morton和shellter的评论中学到了很多关于awk的信息):

# rake_awk

#!/usr/bin/awk -f
{   
  search="/";
  n=split($0,array,search);
  if(n == 1) {
   print "\n", $3, $4, "\t\t\t\t\t\t\t", $5, "\n";
  }
  else {
    for (i=2;i<=n;i++) {
        if (i < n) {
          printf("/%s", array[i]);
        }
        else {
          printf("/%s\n", array[i]);
        }
    }
  }
}

从命令行:

> bundle exec rake routes | /path/to/rake_awk

URI Pattern                         Controller#Action

/users/sign_in(.:format)           devise/sessions#new                                       
/users/password(.:format)          devise/passwords#update
/api/auth/sign_in(.:format)        devise_token_auth/sessions#new {:format=>:json}

答案 2 :(得分:1)

Awk可能有点尴尬。它可以工作,但你可以直接查询路由,这比等待rake运行要快得多。以下是如何在Rails 5中执行此操作。

  

作为指南,请查看rake routes的源代码:

     

https://github.com/rails/rails/blob/b5db73076914e7103466bd76bec785cbcfe88875/actionpack/lib/action_dispatch/routing/inspector.rb#L104

all_routes = Rails.application.routes.routes

routes = all_routes.map do |route|
  ActionDispatch::Routing::RouteWrapper.new(route)
end

routes.reject!(&:internal?)

results = routes.map do |route|
  { name: route.name,
    verb: route.verb,
    path: route.path,
    reqs: route.reqs }
end

puts results.map{|r| "#{r[:path]}, #{r[:reqs]}"}.join("\n")