2016-05-24 2 views
0

In meiner Schienen 4.x-Anwendung auf einem Mac, nenne ich Rake Routen, und ich bekomme die folgende Ausgabe:Wie kann man die Ausgabe von Rake-Routen auf URI-Muster- und Controller-Aktionsspalten beschränken?

Raw Ausgabe (ohne 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} 

ich Rake nennen wollen Routen, aber geben nur die letzten zwei Spalten aus (URI Pattern und Controller # Aktion). Es ist auch eine Tatsache, dass die letzten zwei Spalten mit einem '/' beginnen, während die ersten beiden Spalten niemals ein '/' haben.

gewünschter Ausgang:

> 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} 

habe ich versucht, diese Ansätze:

Ansatz 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} 

die ersten beiden Reihen (/ users/sign_in und/users/Passwort) funktionieren, aber der dritte behandelt devise_token_auth/sessions # new und {: format =>: json} als separat Die Spalten sind aufgrund des Standardfeldtrennzeichens Leerzeichen. Aus demselben Grund schnitt die Kopfzeile das Wort URI aus dem URI-Muster heraus.

Ansatz 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} 

Im zweiten Ansatz, es funktioniert gut für den ersten (/ Benutzer/sign_in) und dritten (/ api/Auth/sign_in) Reihen, aber es ist verkorkst in der zweiten Reihe, weil es eine leere erste (Präfix) Spalte gibt.

Ansatz 3:

ich auch für einen Filterschalter auf Rake Routen sah, (wie oben Befehl hat -stats)? aber in the routes rakefile konnte ich keine solche Option finden.

Ansatz 4:

Der folgende Ansatz funktioniert, aber es verwendet eine andere Tatsache über die Daten -, dass wir alle müssen den Inhalt mit dem ersten ‚/‘ beginnen:

# 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]); 
     } 
    } 
    } 
} 

Und von der Kommandozeile:

> 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

@EdMorton ich die Frage aktualisiert mit der Baseline und mehr Details - Ruby on Rails (ein Web-App-Framework) hat einen Rake ('Ruby make'), der eine gemeinsame Rakefile (analog zu Makefile) namens routes hat. Der Befehl "Rake-Routen" gibt eine Reihe von Web-Routen in meiner Web-App aus. Der erste Ausschnitt zeigt die Grundlinienausgabe. Ich versuche, nur die letzten beiden Ausgabespalten zu drucken. Weitere Informationen finden Sie in der aktualisierten Frage. – Anand

+0

hilft es, Ihr Q wie, A. Beispiel-Eingabedaten, B/erforderliche Ausgabe von gleichen Daten, C. aktuelle Ausgabe. D. Aktuelle beste Schätzung bei codierter Lösung, E. Es werden Fehlermeldungen generiert. ### Sie können auch andere Informationen hinzufügen, die Benutzern helfen, Ihr Problem in ihrer Umgebung zu replizieren, und Kommentare dazu, warum Sie die derzeit in Ihrem Code verwendete Methode verwenden. Wie es ist, kann diese Information da sein, aber es ist schwer, die Informationen in Ihrem Q zu "parsen". Viel Glück. – shellter

+0

@shellter - Ich habe die Frage mit den meisten dieser Details aktualisiert. – Anand

Antwort

2

Angesichts Ihren aktuellen Anforderungen und die Antwort, die Sie geschrieben, kann das sein, was Sie wollen:

$ 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} 
+0

Danke! Ich habe deine Lösung oben versucht, aber es funktioniert nicht. Vielleicht ist es meine Unfähigkeit, das genaue Format genauer zu formulieren. Ich ging mit einem einfacheren string-basierten Ansatz - basierend auf der Tatsache, dass ich den gesamten Inhalt über das erste Vorkommen von '/' hinaus ausgeben musste - siehe Ansatz 4 in der Frage (wird es in einer Sekunde aktualisieren). – Anand

+0

Ich habe auch Ansatz 4 als Antwort hinzugefügt, wie es funktioniert. – Anand

+0

Ich habe 175 Zeilen, von denen die meisten in die obigen drei Beispielmuster fallen. Wenn ich deinen zweiten (visuell ausgerichteten) awk Befehl oben ausgeführt habe, die Zeile in der rohen Eingabe, die so aussieht: (es gibt> 20 Leerzeichen am Anfang, die ich nicht als Code mit Backticks formatieren kann) - 'DELETE/users (. : format) devise/registrations # destroy 'gibt einfach' devise/registrations # destroy' statt '/users(.:format) devise/registrations # destroy' zurück (es gibt keine Tabs in der Eingabezeile) – Anand

1

Ich löste es mithilfe der aktualisierten Daten, dass die erforderliche Ausgabe mit einem '/' beginnt. Dank Shellter den Link in der Frage Kommentare (habe ich viel gelernt über awk heute von Ed Morton und Shellter Kommentare):

# 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]); 
     } 
    } 
    } 
} 

Und von der Kommandozeile:

> 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} 
+1

Um alles vom ersten '/' on zu drucken, ist nur '{sub ("^[^ /] +/"," "); drucken} '. Keine Notwendigkeit für Splits, Schleifen usw. Die Art und Weise, die geschriebene Schleife zu schreiben, wenn sie benötigt wird, ist nur 'für (i = 2; i <= n; i ++) printf" /% s% s ", Array [ i], (i

+1

@EdMorton Das ist eine äußerst nützliche Information. Vielen Dank! – Anand

0

Awk sein kann, ein wenig sein peinlich.Es funktioniert, aber Sie können die Routen direkt abfragen, was viel schneller ist, als auf rake zu warten. Hier ist, wie es in Rails zu tun 5.

Als Anhaltspunkt, einen Blick auf den Quellcode für 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") 
Verwandte Themen