Sziasztok!
Van egy ilyen kimenetem:
{'network_port': 'Port 4', 'status': 'Unknown', 'port_description': 'HPE FlxFbrc 10Gb 4p 536FLR-T Adptr', 'location': 'Embedded', 'mac_address': 'f4:03:43:9f:a6:66', 'ip_address': 'N/A'}
{'network_port': 'Port 1', 'status': 'OK', 'port_description': 'HPE FlxFbrc 10Gb 4p 536FLR-T Adptr', 'location': 'Embedded', 'mac_address': 'f4:03:43:9f:a6:60', 'ip_address': 'N/A'}
{'network_port': 'Port 3', 'status': 'Unknown', 'port_description': 'HPE FlxFbrc 10Gb 4p 536FLR-T Adptr', 'location': 'Embedded', 'mac_address': 'f4:03:43:9f:a6:64', 'ip_address': 'N/A'}
{'network_port': 'Port 2', 'status': 'OK', 'port_description': 'HPE FlxFbrc 10Gb 4p 536FLR-T Adptr', 'location': 'Embedded', 'mac_address': 'f4:03:43:9f:a6:62', 'ip_address': 'N/A'}
Ki szeretnem szedni ebbol a mac addresst azokbol a sorokbol, ahol szerepel OK.
Valamiert a kovetkezo nem mukodik, pedig kiszedi a macet, de a az elejere beteszem a .*-ot, akkor nem jelenit meg semmit a kimeneten.
sed "/OK/ s/.*'mac_address': '\(.*\)', .*/\1/g"
- 1663 megtekintés
Hozzászólások
grep "'status': 'OK'"|sed -e "s/^.*'mac_address': '\([0-9a-fA-F:]*\)'.*$/\1/"
vagy csak sed-et hasznalva:
sed -n -e "/'status': 'OK'/ p"|sed -e "s/^.*'mac_address': '\([0-9a-fA-F:]*\)'.*$/\1/"
--
A strange game. The only winning move is not to play. How about a nice game of chess? - Wargames
- A hozzászóláshoz be kell jelentkezni
vagy egyben:
sed -n "/OK/ { s/.*'mac_address': '\(.*\)', .*/\1/g; p }"
- A hozzászóláshoz be kell jelentkezni
off
Hogyan lehet lezárni utólag elszúrt code tag-et?
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Na ez nagyon el van szurva :) sima lezaro tag eleg kene legyen.
- A hozzászóláshoz be kell jelentkezni
a ".*" nem jó, mert a last match-ig megy, tehát benne van a whitespace és a következő elem is. nem véletlenül volt "[a-zA-Z0-9:]*" írva, mint regex. Azonban ha több formátumra akarsz match-elni, akkor ez jobb: "[A-Za-z0-9:-\.]+"
- A hozzászóláshoz be kell jelentkezni
nem regexppel kene, hanem valami normalis nyelven, pl:
$ cat get_mac.py
import sys
import json
if __name__ == '__main__':
for line in sys.stdin:
data = json.loads(line.replace('\'', '"'))
if data.get('status') == 'OK':
print(data.get('mac_address'))
$ python get_mac.py < input.txt
f4:03:43:9f:a6:60
f4:03:43:9f:a6:62
- A hozzászóláshoz be kell jelentkezni
awk -F, '/\47OK\47/ {sub(/.mac_address.: ./,"",$5);sub(/.$/,"",$5);print $5}'
- A hozzászóláshoz be kell jelentkezni
vagy grep és cut
- A hozzászóláshoz be kell jelentkezni
+1
Akkor külön nem írom le.
---
"A megoldásra kell koncentrálni nem a problémára."
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
+1
t
- A hozzászóláshoz be kell jelentkezni
# jq -c '.[] | select(.status | contains("OK"))' json.txt | jq
{
"network_port": "Port 1",
"status": "OK",
"port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr",
"location": "Embedded",
"mac_address": "f4:03:43:9f:a6:60",
"ip_address": "N/A"
}
{
"network_port": "Port 2",
"status": "OK",
"port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr",
"location": "Embedded",
"mac_address": "f4:03:43:9f:a6:62",
"ip_address": "N/A"
}
t
- A hozzászóláshoz be kell jelentkezni
Szimpatikus ez a jq - mint elméletileg a problémára testreszabott megoldás - de az árnyalja a képet, hogy sem a 10 perccel ezelőttig meglévő 1.4-es, sem az 1.5-ös nem képes megbírkózni a feladattal.
Az rendben, hogy az aposztrófot visszautasítja egy félrevezető üzenettel (parse error: Invalid numeric literal at line 1, column 16), elvégre a json spec szerint idézőjel az idézőjel, de az átírás utáni hibájára (jq: error (at input:1): Cannot index string with string "status") rákeresve már-már flamewarba hajló eszmecserék folynak arról, hogy a jq bugos, a lib, amivel fordították vagy alapból mindenki hülye.
Ennél azért mindegyik shell tool stabilabban vezet eredményre pár évtizede.
- A hozzászóláshoz be kell jelentkezni
mert nem valid az OP json-ja (hianyzik a [] es a ,.
igy valid:
[{"network_port": "Port 4", "status": "Unknown", "port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr", "location": "Embedded", "mac_address": "f4:03:43:9f:a6:66", "ip_address": "N/A"},{"network_port": "Port 1", "status": "OK", "port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr", "location": "Embedded", "mac_address": "f4:03:43:9f:a6:60", "ip_address": "N/A"},{"network_port": "Port 3", "status": "Unknown", "port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr", "location": "Embedded", "mac_address": "f4:03:43:9f:a6:64", "ip_address": "N/A"},{"network_port": "Port 2", "status": "OK", "port_description": "HPE FlxFbrc 10Gb 4p 536FLR-T Adptr", "location": "Embedded", "mac_address": "f4:03:43:9f:a6:62", "ip_address": "N/A"}]
t
- A hozzászóláshoz be kell jelentkezni
Korrekt, köszi!
Így máris jobban megértem a nemtommikori-nemtommilyenapropóból eljáró énemet, hogy letöltötte és betette az 1.4-et a $HOME/binbe.
- A hozzászóláshoz be kell jelentkezni
sajnos az ilyen parzerek elég hülye hibaüzeneteket tudnak kiböfögni, de ezen szerintem nem nagyon van mit flamelni. Az eredeti kimenet köré jsonul kell egy lista, vagyis be kell tenni szögletes zárójelbe, és az ojjektumok közé vesszőket kell tenni.
Egyébként mea culpa, telefonon nem néztem, hogy az input nem egészen valid json.
- A hozzászóláshoz be kell jelentkezni
Észre kellett volna a hiányt (a vesszőkét is), csak túlságosan beleálltam az üzenetekbe.
Mindegy ettől szép ez a biznisz... általában... olykor... van úgy is...
- A hozzászóláshoz be kell jelentkezni
mondjuk az üzenet meg lehetne az, hogy "itt bazmeg listának vagy string literalnak kellene lenni" :)
Sajnos sokszor nem érti a programozó, hogy mitől lesz használható egy hibaüzenet.
- A hozzászóláshoz be kell jelentkezni
Most fedeztem fel ezt a jq-t, és ebben a kommentben látom az előfordulását. Jó kis eszköz! Oktatóanyag is van: https://stedolan.github.io/jq/tutorial/
- A hozzászóláshoz be kell jelentkezni
Így pedig kb. mindegy az elemek sorrendje, amennyiben csak egy mac létezik rekordonként:
awk '/\047OK\047/ && match($0, /[[:xdigit:]]+(:[[:xdigit:]]+)+/) {print substr($0,RSTART,RLENGTH)}'
- A hozzászóláshoz be kell jelentkezni