在我的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}
答案 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
的源代码:
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")