È ansible utilizzare awk invece?

Vorrei get il numero dal rating come output da questo

 # nc localhost 9571 language: language:en_ZA.UTF-8 language:en_ZW.UTF-8 session-with-name:Ubuntu Classic (No effects):gnome-session --session=2d-gnome session-with-name:Ubuntu (Safe Mode):gnome-session -f --session=2d-gnome session-with-name:Ubuntu Classic:gnome-session --session=classic-gnome xsession:/etc/X11/Xsession rating:94 

Posso farlo così

  • Quale metrica devo utilizzare per determinare quando un server è basso nella memory?
  • I processi sciacquati consumano troppa CPU
  • Linux: è necessario un MTA?
  • Come viene spamassasin chiamato da amavisd-new?
  • Dopo aver svuotato una directory con 60.000 piccoli file, ls -l mostra ancora grandi size della directory?
  • DRBD Non sincronizzazione tra i miei nodes
  •  # nc localhost 9571 | grep rating | cut -d: -f2 94 

    ma potrebbe essere utilizzato invece per una soluzione più semplice?

    8 Solutions collect form web for “È ansible utilizzare awk invece?”

     $ nc localhost 9571 | awk -F: '/rating/ { print $2 }' 

    Quanta mi ha battuto, ma includo una variante sed se sei così incline:

     nc localhost 9571 | sed -ne 's/^rating://p' 

    Così come ha detto MadHatter. La tua soluzione attuale è perfettamente sana. (Anche se avrei fatto grep per "^rating:" piuttosto che solo la parola per assicurarvi di get solo la linea che vuoi.)

    È anche ansible utilizzare la shell:

     nc localhost 9571 | while IFS=: read key val; do [[ $key = "rating" ]] && echo "$val"; done 

    sì, puoi (e dovrebbe) usare (uno) awk invece di (due) grep e tagliare:

     $ nc localhost 9571 | awk -F: '/^rating:/ { print $2 }' 

    Assicurati di abbinare la linea come buona come è ansible per evitare fastidiosi bug.

    • /rating/ works,
    • /^rating/ è meglio (più sicuro),
    • /^rating:/ è meglio (in questo caso).

    Può:

     nc localhost 9571 | awk -F: '{ if ($1 == "rating") print $2 }' 

    (Non so cosa stai facendo con localhost sopra, quindi hai usato la tua output come input al mio command awk, poi ha sostituito il "gatto" con "nc …" – ma va bene.)

    Ma perché lo faresti? Il modo UNIX è quello di avere un sacco di piccoli strumenti, ognuno dei quali fa bene una cosa, mescolato insieme via condutture, piuttosto che utilizzando più grandi strumenti multifunzionali. È necessario select una singola linea di corrispondenza, seleziona un field da esso: grep seleziona linee con corrispondenze e cut seleziona i campi dalle righe di input; sono perfetti per il task. Ma se davvero vuoi farlo tutto in uno con awk, beh, ci va.

    Mentre la risposta di quanta è la cosa più semplice e quella che scrivo anche io, scommetto che non sapevi che GNU awk (gawk) può fare anche la networking ? Puoi scrivere tutta la cosa con awk se vuoi veramente:

     BEGIN { FS = ":" f = "/inet/tcp/0/127.0.0.1/9571" while ((f |& getline) > 0) if ($1 ~ /^rating$/) {print $2} } 

    Questo potrebbe essere utile se un server non dispone di nc installato, nc ha permessi limitati, o se ti piace veramente awk.

    È anche ansible utilizzare sed,

    nc localhost 9571 | sed -n "s/^rating:\([\d]*\)/\1/p"

    Ciò assicurerà che la "valutazione" avvia la row e che le cifre seguano la rating:

    Se Perl è un'opzione:

    nc localhost 9571 | perl -F: -lane 'print $F[1] if /rating/'

    -a autosplisse each row nell'alline @F
    -F: utilizza : come separatore di field, anziché il valore predefinito dello spazio bianco
    /rating/ restituisce true se si trova la regex
    $F[1] è il secondo elemento dell'arrays @F .
    Gli arrays Perl iniziano con l'elemento 0, mentre awk inizia con $ 1

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.