Minden szám ami nem IP

Sziasztok,

Nem jutok előrébb, egy log fájlból kellene kiszednem paracssorban minden számot ami min 9 karakter hosszú. (lehet benne space, ".", és "-") de nem az IP.

Arra gondoltam valahogy szűrnöm kellene az IP 4-es formátumot, de nem tudom ,hogy lehetne ráilleszteni a kifejezésre.

Ezt ne nézze /((\d{1,3}\.){3}(\d{1,3}))/

de ezt keresse /([\d \(\)\.\-]{6,})/

Lehetséges, hogy ezt nem lehet egy lépésben megoldani?

 

Ahogy néztem nem lehet csak 2-es csoportot kinyerni grep-el.

grep -E "(([0-9]{1,3}\.){3}[0-9]{1,3})|([0-9 \(\)\.\-]{6,})" data.log

Hozzászólások

Én két lépcsőben csinálnám.

Előbb kiszűrném belőle az összes "talán" megfelelőt, majd ebből eldobnám azokat, amelyekben pontosan három, számok közé zárt pont van, de nincs "-".

Nem olyan bonyolult, de lehet, most újat mutatok: :)

/(?!(\d{1,3}\.){3}(\d{1,3}))([\d \(\)\.\-]{6,})/

Ha kipróbálod ezen a pár soron, akkor kiderül, hogy nem jó.
 

25  33 197 176 44444
143325425
61.206.184
33.180.227 33.180.227
127.33.195.149
61.65.93
25  31.197.176.444
,143325425
23	61.206.184
33 "33.180.227.1 33.180.227
33;33.195.149
61.65.93

https://regex101.com/r/fOe9gp/1

Én nem néztem, hogy jó-e, mindössze megmutattam, hogy lehet a két kifejezést összevonni. Aztán rájöttem, hogy persze, nem elég ennyi.

Ez elvileg az, amit szeretnél, de valljuk be, tipikusan ilyenkor mondom azt, hogy nem biztos, hogy jó ötlet egy kifejezést használni:

(?<![\d.-])(?:(?!(?:\d{1,3}\.){3}(?:\d{1,3}))[\d \(\)\.\-]){6,}

(Közben rájöttem, hogy még ez sem tökéletes, mert nem illeszkedik a "0.0.0.0.0" kifejezésre, pedig a specifikációd szerint erre kellene.)

Nem tudom gondoltál-e arra, hogy az IPV6 címeket kell-e kezelned?

Szerkesztve: 2020. 04. 01., sze - 16:23

Az IP cím nem szám, szóval ha eleve csak számokra szűrsz, akkor IP cím nem lehet benne.

A valódi problémád neked szerintem az, hogy először definiáld, hogy neked mi jelent az, hogy szám.

Az 12e3 egy szám lehet, ha megengedjük az ún. tudományos jelölést. De lehet, hogy csak egy négykarakteres azonosító.
Az IP cím csak számokból áll, de nem szám. A YYYY-mm-dd formátumú dátum is számokból áll, de nem szám. Őt meg kéne találnod?

A TAJ számok sem számok, csak számjegyekből álló stringek. Azért nem számok, mert például olyan szám nincsen, hogy "009 045 045". Őt meg kéne találnod?

A verziószámokat meg kéne találnod? Az, hogy 1.2.3, az nem szám, csak számokból áll, és hasonlít az IP címekhez.  Őt meg kéne találnod?

Az IP cím nem szám, ugyanis vannak olyan számok a 0-2^32-1 intervallumban, amik nem valid IP címek, nem használhatók IP fejlécben forrásként, vagy célként. Az IP címnek van struktúrája, az egyes biteknek van jelentése, nem csak lineáris címek a 0..2^32-1 intervallumban.

Az, hogy a valid IP címek 32 bites számként is reprezentálhatók, az más kérdés.

Én meg ezt:

egy log fájlból

A log fájlba valami program ír. Hány programot ismersz, ami integer, hexa, oktális, bináris, vagy az általad felsorolt akármilyen formatterrel fog IP címet logolni? Lehet, hogy erős feltételezés a részemről, de én majdnem 100%-nak venném azt az esetet, hogy dotted quadként fogja minden kiírni.

Innentől kezdve pedig ez a thread teljesen értelmetlen.

Fogalmam sincs, mert nem írta milyen log fájl. Ahogy azt sem, hogy mi értelme az egésznek. Ha felhasználó àltal bevitt címek (is) naplózásra kerülnek, akkor lehet közöttük ilyen. Egy adatfolyamot is lehet naplózni. Igazából szerintem ha leírná pontosan mit naplóz, mire kell az egész, akkor egy triviális megoldás lenne rá..

Valojaban szam jellegu stringekre szur adott megkotesekkel (space, dot, dash lehet a szamkarakterek kozott), es ebbol meg ki szeretne dobni az IPv4 formatumu szam jellegu sorozatokat.
De igen, nem pontos az eredeti megfogalmazas, hogy pontosan milyen strukturaju stringeket keres (a min. 9 mire vonatkozik? csak a szamkarakterek mennyisege, vagy a teljes string elvalaszto karakterekkel?):
 

számot ami min 9 karakter hosszú. (lehet benne space, ".", és "-") 

Én perl-el szaladnék neki a dolognak, az IP::Net csomaggal

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

2 greppel: grep -v IP ¦ grep JÓ. Ez gyorsabb is lehet, mint egy rosszul megírt regex.

Szerkesztve: 2020. 04. 02., cs - 14:59

Csak az IP címek kiszűrése: (Viszont ebben ilyen sorok is benne lesznek: 999192.168.1.255999 !!!)

grep -P '(((2(5[0-5]|[0-4][0-9])|(1[0-9]|[1-9])?[0-9])\.){3}((?3)))' data.log

 

Ezt meg lehet fordítani (-v -vel)... és ezt lehet arra a kritériumra szűrni, hogy minimum 6 karakteres, szököz is lehet benne, stb...

 

De szerintem ebben azt kellene első körben tisztázni, hogy mi számít IP címnek... Pontosabban mikor tudod eldönteni, hogy a szövegben nen IP cím van... :)

Debian Linux rulez... :D
RIP Ian Murdock

Nincs valami szerkezete a log fájlnak? Pl. ha ilyesmi:

"IP cím: 1.1.1.1, kérések száma: 3"

és ebből csak a 3-ra vagy kíváncsi, akkor a szöveges részre is lehetne építeni.