如何限制 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
:
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")
在 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
:
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")