În general, ar trebui să evitați utilizarea instrumentelor generice de analiză a textului pentru date structurate. Deoarece aveți un fișier json, este mai sigur și mai simplu să utilizați un parser json dedicat. În cazul dvs., ați dori să extrageți valoarea primului element al matricei argumente
care este el însuși primul element al matricei de nivel superior argumente
, copilul hashului de nivel superior $quer
:
$ jq '."$quer"."args"[0]["args"]' fișier.json
[
„selectați\n db1.table1 ca tab1,\n db1.table2 ca tab2,\n db1.table3 ca tab3\n din db1.table4 ca tab4”
]
De aici, nu mai ai date structurate și trebuie să apelezi la metode mai crude. Nu știu cum vrei să-ți identifici șirul țintă, nu ai explicat asta. Deci, în funcție de ceea ce doriți de fapt, puteți face:
Omite rândurile începând cu [
sau ]
și apoi tipăriți al doilea cuvânt din rândurile rămase:
$ jq '."$quer"."args"[0]["args"]' fișier.json | awk '/^[^][]/{printează $2}'
db1.table1
Tipăriți al doilea cuvânt din a doua linie
$ jq '."$quer"."args"[0]["args"]' fișier.json | awk 'NR==2{printează $2}'
db1.table1
Tipăriți cea mai lungă porțiune de non-spațiu alb după șir „selectați\n
:
$ jq '."$quer"."args"[0]["args"]' fișier.json | grep -oP '"select\n\s*\K\S*'
db1.table1
Dacă explicați exact cum ar trebui să știm ce șir să extragem, aș putea să vă dau un răspuns mai precis.
De dragul finalizării, în dvs specific exemplu, și subliniez că acest lucru nu va fi portabil și este aproape sigur că va eșua dacă datele dvs. de intrare se schimbă în vreun fel, puteți utiliza instrumente simple de text direct:
$ grep -oP „select\n\s*\K\S*” fișier.json
db1.table1
$ awk '$1=="\"select\n"{printează $2}' file.json
db1.table1
$ sed -nE 's/.*"select\n\s*(\S+).*/\1/p' file.json
db1.table1