5
votes

Utilisez sed, grep ou awk sans perl pour répliquer un lookbehind positif

Je dois extraire RJ3fadfiasdUYBxF6z de:

(?<=authToken\":\")(\w+)

regex avec PCRP fonctionne très bien

 {"user":{"id":1325135,"uuid":"134513451","email":"ansdfaha@aol.com","joined_at":"2012-01-01T013:511:124.000Z","username":"testicl","title":"testli","thumb":"https://plex.tv/user/avatar?c=","hasPassword":true,"authToken":"RJ3fadfiasdUYBxF6z","authentication_token":"RJ3fadfiasdUYBxF6z","subscription":{"active":false,"status":"Inactive","plan":null,"features":["adaptive_bitrate","collections","photos-metadata-edition","radio","photos-favorites","federated-auth","Android - PiP","publishing_platform","news","kevin-bacon","client-radio-stations","TREBLE-show-features","web_server_dashboard","conan_redirect_qa","conan_redirect_alpha","conan_redirect_beta","transcoder_cache"]},"roles":{"roles":[]},"entitlements":[],"confirmedAt":"2012-01-01T13:31:31.000Z","forumId":23573,"rememberMe":false}}

Comment puis-je extraire RJ3fadfiasdUYBxF6z en utilisant soit awk , sed , ou grep sans regard positif? Je n'ai pas de support Perl.
Je fais cela à partir d'un script bash sur un routeur openwrt.


2 commentaires

C'est le format de fichier JSON. Avez-vous un outil qui peut analyser JSON?


Je fais cela à partir d'un script bash sur un routeur openwrt, donc je ne pense pas? Essayer de le garder aussi léger que possible. Je suis un super nouveau.


5 Réponses :


4
votes

Il semble que grep est un jeu équitable

grep -Po '(?<=authToken\":\")(\w+)' file

Remarque: Cela nécessite une bibliothèque supplémentaire, libpcre , pour grep .


9 commentaires

Cela n'a pas besoin de Perl? C'est le support PCRE dans grep ... (ou utilise-t-il Perl?)


Hmm, je pensais que PCRE était compatible avec Perl? J'ai BusyBox v1.28.4 et grep ne me donne pas l'option de mettre le drapeau -P.


Je vois. Alors peut-être qu'il a besoin de Perl pour cela - je pensais que grep avait ce support nativement intégré, sans Perl, mais je suppose que non.


Ce ne est pas. Il nécessite un package spécial pour la prise en charge native de PCRE, libpcre -ash: pcregrep: not found


@stinkybummer Ah, bien sûr, cela a du sens; il ne peut pas dépendre de Perl mais il a besoin d'une bibliothèque. Merci de l'avoir découvert, nous avons appris le bit supplémentaire dont grep a besoin pour cela :).


J'ai pcregrep dans mon RHEL


@ stack0114106 Il semble qu'ils ne l'ont pas. Je trouve sur un CentOS7: pcre , pcre2 et pcre-devel (mais pas le programme pcregrep particulier, uniquement pcre-config ).


@zdim .. oui c'est là dans notre Enterprise RHEL 6.1


@zdim .. merci d'avoir regardé 55104792, une autre solution à cela? .. la première fois que j'utilise \ B !!!



4
votes

Vous pouvez utiliser la commande sed suivante:

sed 's/.*"authToken":"\([^"]*\)".*/\1/' file


0 commentaires

1
votes

Une solution awk (testée sous openwrt):

awk -F: -v RS=, '$1=="\"authToken\""{gsub("\"","",$2);print $2}' file
RJ3fadfiasdUYBxF6z

Ou pour une correspondance plus précise, utilisez égal == :

awk -F: -v RS=, '$1~/"authToken"/{gsub("\"","",$2);print $2}' file
RJ3fadfiasdUYBxF6z

$ 1 == "\" authToken \ "" est fonctionnellement égal à $ 1 ~ / ^ "authToken" $ / mais est un peu plus rapide.


0 commentaires

4
votes

Peut-être pourriez-vous installer jq et l'utiliser?

jq .user.authToken < a.json
"RJ3fadfiasdUYBxF6z"


1 commentaires

Pour se débarrasser des guillemets, ajoutez l'option -r . < n'est pas nécessaire.



2
votes

Certaines versions de Linux sont livrées avec pcregrep où vous pouvez utiliser les lookarounds ..

Vérifiez ceci

$ pcregrep --version
pcregrep version 7.8 2008-09-05
$ 

Voici la version dans mon RHEL.

$ pcregrep -o '(?<=authToken\":\")(\w+)' json.test 
RJ3fadfiasdUYBxF6z
$ 


1 commentaires

En fait, nous avons parlé de pcregrep dans les commentaires et il s'avère que openwrt n'est pas livré avec, cependant pcregrep est un bon choix lorsqu'il est pris en charge: )