2015-11-06 21 views
11

Dato il seguente script di shell, qualcuno sarebbe così gentile da spiegare l'espressione regolare grep -Po per favore?Cosa significa ' K' in questa espressione regolare?

#!/bin/bash 
# Issue the request for a bearer token, json is returned 
raw_json=`curl -s -X POST -d "username=name&password=secret&client_id=security-admin-console" http://localhost:8081/auth/realms/master/tokens/grants/access` 
# Strip away all but the "access_token" field's value using a Python regular expression 
bearerToken=`echo $raw_json | grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)'` 
echo "The bearer token is:" 
echo $bearerToken 

Quindi nello specifico, mi interessa capire le parti del regex

grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)'` 

e come funziona. Perché tante citazioni? A cosa serve la "K"? Ho qualche esperienza con regex di grep ma questo mi confonde.

Questo è l'output effettivo del comando arricciato e lo script di shell (grep) funziona come desiderato restituendo solo il contenuto del valore "access_token".

{"access_token":"eyJhbGciOiJSandNoThisIsntRealndmbS1yZWFsbSI6eyJyb2xlcyI6WyJtYW5hZ2UtY2xpZW50cyIsInZpZXctcmVhbG0iLCJtYW5hZ2UtZXZlbnRzIiwidmlldy1ldmVudHMiLCJ2aWV3LWFwcGxpY2F0aW9ucyIsInZpZXctdXNlcnMiLCJ2aWV3LWNsaWVudHMiLCJtYW5hZ2UtdXNlcnMiLCJtYW5hZ2UtYXBwbGljYXRpb25zIiwibWFuYWdlLXJlYWxtIl19LCJtYXN0ZXItcmVhbG0iOnsicm9sZXMiOlsibWFuYWdlLWV2ZW50cyIsIm1hbmFnZS1jbGllbnRzIiwidmlldy1yZWFsbSIsInZpZXctZXZlbnRzIiwidmlldy1hcHBsaWNhdGlvbnMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLXJlYWxtIiwibWFuYWdlLXVzZXJzIiwibWFuYWdlLWFwcGxpY2F0aW9ucyJdfX19.fQmQKn-xatvflHPAaxCfrrVow3ynpw0sREho7__jZo2d0g1SwZV7Lf4C26CcweNLlb3wmKHHo63HRz35qRxJ7BXyiZwHgXokvDJj13yuOb6Sirg9z02n6fwGy8Iog30pUvffnDaVnUWHfVL-h_R4-OZNf-_YUK5RcL2DHt0zUXI","expires_in":60,"refresh_expires_in":1800,"refresh_token":"eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJlNWFmYTZiOC04ZjM5LTQ5MjUtOWZiMC00MmY3MTM4YzUzMGIiLCJleHAiOjE0NDY4Mjk3OTksIm5iZiI6MCwAreYouKiddingIwouldnotputSOmethigRealHereNpb25fc3RhdGUiOiI2MmVmYzA1Yy0xYmY1LTRmNTUtYjc0OS01ZTBlZmY5NDE1NWIiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiYWRtaW4iLCJjcmVhdGUtcmVhbG0iXX0sInJlc291cmNlX2FjY2VzcyI6eyJ3Zm0tcmVhbG0iOnsicm9sZXMiOlsibWFuYWdlLWV2ZW50cyIsInZpZXctcmVhbG0iLCJtYW5hZ2UtY2xpZW50cyIsInZpZXctYXBwbGljYXRpb25zIiwidmlldy1ldmVudHMiLCJ2aWV3LXVzZXJzIiwidmlldy1jbGllbnRzIiwibWFuYWdlLXJlYWxtIiwibWFuYWdlLWFwcGxpY2F0aW9ucyIsIm1hbmFnZS11c2VycyJdfSwibWFzdGVyLXJlYWxtIjp7InJvbGVzIjpbInZpZXctcmVhbG0iLCJtYW5hZ2UtY2xpZW50cyIsIm1hbmFnZS1ldmVudHMiLCJ2aWV3LWFwcGxpY2F0aW9ucyIsInZpZXctZXZlbnRzIiwidmlldy11c2VycyIsInZpZXctY2xpZW50cyIsIm1hbmFnZS1hcHBsaWNhdGlvbnMiLCJtYW5hZ2UtdXNlcnMiLCJtYW5hZ2UtcmVhbG0iXX19fQ.WeiJOC1jQ52aKgnW8UN2Lv9rJ_yKZiOhijOYKLN2EEOkYF8rvRZsSKbTPFKTIUvjnwy2A7V_N-GhhJH4C-T7F5__QPNofSXbCNyvATj52jGLxk9V0Afvk-Z5QAWi55PJRTC0qteeMRcO2Frw-0KtKYe9o3UcGICJubxhZHsXBLA","token_type":"bearer","id_token":"eyJhbGciOiJSUzI1NiJ9.eyJuYW1lIjoiIiwianRpIjoiMGIyMGI0ODctOTI4OS00YTFhLTgyNmMtM2NiOTg0MDJkMzVkIiwiZXhwIjoxNDQ2ODI4MDU5LCJuYmYiOjAsImlhdCI6MTQ0NjgyNzk5OIwouldhaveToBeNutsUiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJhZG1pbiIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZX0.DmG8Lm4niL1djzNrLsZ2CrsB1ZzUPnR2Nm7IZnrwrmkXsrPxjl6pyXKCWSj6pbk2sgVI8NNFqrGIJmEJ7gkTZWm328VGGpJsmMuJBki0KbqBRKORGQSgkas_34rwzhcTE3Iki8h_YVs2vvNIx_eZSOvIzyEcP3IGHuBoxcR6W3E","not-before-policy":0,"session-state":"62efc05c-1bf5-4f55-b749-5e0eff94155b"}


Nel caso in cui qualcuno trova questo post, questo è quello che ho finito per usare:

if hash jq 2>/dev/null; then # Use the jq command to safely parse json bearerToken=$(echo $raw_json | jq -r '.access_token') else # Strip away all but the "access_token" field's value using a perl regular expression bearerToken=$(echo $raw_json | grep -Po '"'"access_token"'"\s*:\s*"\K([^"]*)') fi

+1

Si noti che 'grep' non è il migliore (o anche un buon) strumento per lavorare con JSON. Ottieni invece qualcosa come ['jq'] (https://stedolan.github.io/jq/), che sa già come analizzare JSON. 'bearerToken = $ (echo" $ raw_json "| jq '.accessToken')' è di gran lunga migliore. – chepner

+0

@chepner Grazie. Sono in un ambiente vagabondo/fantoccio/centrista. Forse posso yum installare jq. –

+0

@chepner 'sudo yum install jq' in soccorso. Grazie! –

risposta

21

Poiché non tutti i sapori regex supportano lookbehind, Perl ha introdotto il \K. In generale, quando si dispone di:

a\Kb 

Quando “b” è abbinata, \K indica al motore di far finta che il tentativo partita è cominciata in questa posizione.

Nel tuo esempio, vuoi far finta che il tentativo di corrispondenza sia iniziato in quello che appare dopo "" access_token ":" testo.

Questo esempio meglio dimostrare la \K utilizzo:

~$ echo 'hello world' | grep -oP 'hello \K(world)' 
world 
~$ echo 'hello world' | grep -oP 'hello (world)' 
hello world 
+0

Grazie. Sono anche curioso dello spam delle doppie virgolette e delle virgolette singole. Funziona, ma non sono sicuro di come –

+1

L'espressione regolare è un po 'sovrascritta. Comincia con ''"' ', che è una singola virgoletta doppia in una stringa a virgolette singole.Viene poi una stringa a virgolette contenente 'access_token', le due stringhe sono semplicemente concatenate insieme. stringa quotata che contiene alcune virgolette doppie: la shell concatena il contenuto di tre stringhe insieme, ad esempio "foo" "bar" "baz'" rappresenta la stessa cosa di "foobarbaz". essere scritto più semplicemente ''" access_token "\ s *: \ s *" \ K ([^ "] *)''. – chepner

Problemi correlati