sed kerdes

 ( Badb0y | 2017. július 15., szombat - 15:34 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

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

vagy egyben:
sed -n "/OK/ { s/.*'mac_address': '\(.*\)', .*/\1/g; p }"

off

Hogyan lehet lezárni utólag elszúrt code tag-et?


tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Na ez nagyon el van szurva :) sima lezaro tag eleg kene legyen.

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:-\.]+"

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

vagy grep és cut

+1
Akkor külön nem írom le.

---
"A megoldásra kell koncentrálni nem a problémára."

+1

t

# 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

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.

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.

É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...

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.

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