2015-11-06 21 views
11

Với kịch bản lệnh shell sau đây, ai đó có thể giải thích như vậy để xin giải thích về các quy tắc grep -Po?' K' có nghĩa là gì trong regex này?

#!/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 

Vì vậy, đặc biệt, tôi quan tâm trong việc tìm hiểu các bộ phận của regex

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

và làm thế nào nó hoạt động. Tại sao rất nhiều dấu ngoặc kép? "K" là gì? Tôi đã có một số kinh nghiệm với grep regex nhưng điều này gây nhầm lẫn cho tôi.

Đây là đầu ra thực tế của lệnh curl và tập lệnh shell (grep) hoạt động như mong muốn chỉ trả lại nội dung của giá trị "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"}


Trong trường hợp có ai tìm thấy bài viết này, đây là những gì tôi đã kết thúc bằng:

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

Lưu ý rằng 'grep' không phải là tốt nhất (hoặc thậm chí là một tốt) công cụ để làm việc với JSON. Nhận một cái gì đó như ['jq'] (https://stedolan.github.io/jq/) thay vào đó, đã biết cách phân tích cú pháp JSON. 'bearerToken = $ (echo" $ raw_json "| jq '.accessToken')' là tốt hơn nhiều. – chepner

+0

@chepner Cảm ơn. Tôi đang ở trong một môi trường lang thang/con rối/centos. Có lẽ tôi có thể cài đặt jum. –

+0

@chepner 'sudo yum cài đặt jq' để giải cứu. Cảm ơn! –

Trả lời

21

Vì không phải tất cả các hương vị regex hỗ trợ lookbehind, Perl giới thiệu \K. Nói chung khi bạn có:

a\Kb 

Khi “b” là phù hợp, \K kể động cơ để giả vờ rằng các nỗ lực trận đấu bắt đầu tại vị trí này.

Trong ví dụ của bạn, bạn muốn giả vờ rằng nỗ lực đối sánh bắt đầu từ nội dung xuất hiện sau văn bản "" access_token ":".

Ví dụ này sẽ chứng minh rõ hơn về \K sử dụng:

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

Cảm ơn. Tôi cũng tò mò về thư rác của các dấu ngoặc kép và dấu nháy đơn. Nó không hoạt động, nhưng tôi không chắc chắn làm thế nào –

+1

Cụm từ thông dụng là một chút bị overquoted. Nó bắt đầu bằng ''"' ', mà chỉ là một dấu ngoặc kép đơn trong một chuỗi được trích dẫn duy nhất. Tiếp theo là một chuỗi được trích dẫn kép chứa' access_token', hai chuỗi được ghép nối với nhau một cách đơn giản. chuỗi được trích dẫn có chứa một vài dấu ngoặc kép, bao gồm các nội dung của ba chuỗi với nhau, ví dụ, ''foo' 'bar' 'baz'' đại diện cho cùng một thứ như' "foobarbaz" '. được viết đơn giản hơn '' "access_token" \ s *: \ s * "\ K ([^"] *) ''. – chepner

Các vấn đề liên quan