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

How to restrict rake routes output to URI Pattern and Controller#action columns?

在 rails 4.x 应用程序 Mac 上,我调用了 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}

我尝试了这些方法:

方法一:

> 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}是单独的列,因为默认字段分隔符是 space。同样,出于同样的原因,header 行从 URI Pattern 中删除了单词 URI。

方法二:

> bundle exec rake routes | awk '{=""; =""; 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)工作正常,但第二行就乱了,因为第一行是空白(前缀)列。

方法三:

我也在 rake 路由上寻找过滤器开关,(比如 top 命令有 -stats)?但是在 the routes rakefile 中,我找不到任何这样的选项。

方法四:

以下方法可行,但它使用了关于数据的不同事实——我们需要以第一个“/”开头的所有内容:

# rake_awk


#!/usr/bin/awk -f
{   
  search="/";
  n=split([=14=],array,search);
  if(n == 1) {
   print "\n", , , "\t\t\t\t\t\t\t", , "\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}

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

$ cat tst.awk
NR==1 { print ,  "\t" ; 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}

我使用所需输出以“/”开头的更新数据解决了这个问题。感谢问题评论中 shellter 的 link(我今天从 Ed Morton 和 shellter 的评论中学到了很多关于 awk 的知识):

# rake_awk

#!/usr/bin/awk -f
{   
  search="/";
  n=split([=10=],array,search);
  if(n == 1) {
   print "\n", , , "\t\t\t\t\t\t\t", , "\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}

awk 可能有点笨拙。可以,但是可以直接查询路由,比等待rake到运行要快很多。 Rails 5.

中介绍了操作方法

As a guide, take a look at the source code for 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")