sed kerdes

Fórumok

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"

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

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
awk -F, '/\47OK\47/ {sub(/.mac_address.: ./,"",$5);sub(/.$/,"",$5);print $5}'

# 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

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.

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

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.

Í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)}'