Ask Your Question
1

Jak vygrepovat ve formátu IP

asked 2014-12-15 20:24:42 +0100

Petr Gondek gravatar image

updated 2014-12-15 20:28:31 +0100

Jak napsat grep, aby našel IP adresy ve správném formátu? (* == znak [0-9])

tzn:
***.***.***.***
***.***.***.**
***.***.***.*
***.***.**.***
***.***.**.**
... atd
edit retag flag offensive close delete

2 Answers

Sort by » oldest newest most voted
2

answered 2014-12-15 21:10:43 +0100

Josef Kokeš gravatar image

updated 2014-12-15 21:27:45 +0100

  1. Jak v regulárním výrazu vyznačíte číslici?
  2. Jak v regulárním výrazu vyznačíte, že předcházející symbol se má opakovat jednou až třikrát?
  3. Jak v regulárním výrazu vyznačíte tečku?
  4. Jak v regulárním výrazu vyznačíte mezeru?
  5. Nasypeme do hrnce, zamícháme a máme požadovaný regulární výraz.
  6. Ne že by grep nějak pomohl, protože grep pouze hledá řádky, které výrazu vyhoví, ale nedokáže z nich vytáhnout kousky. K tomu slouží jiné nástroje, třeba sed.

Jenom pro úplnost, zapsat IP adresu regulárním výrazem stoprocentně není úplně jednoduchá úloha. I když se omezíme jen na IPv4, měli bychom v zásadě řešit to, že zdaleka ne všechny výrazy tvořené 1-3 číslicemi jsou v reálném světě platné (např. IP adresa tvořená číslem 345). IPv6 do toho zavádí další složitosti.

edit flag offensive delete publish link more

Comments

přesně bod číslo 2 nevím.

Petr Gondek ( 2014-12-15 21:17:51 +0100 )edit

{m,n} děkuji

Petr Gondek ( 2014-12-15 21:19:42 +0100 )edit

Tak vidíte, že víte :-)

Josef Kokeš ( 2014-12-15 21:23:49 +0100 )edit
1

a bacha na .

hody ( 2014-12-15 21:26:11 +0100 )edit

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

Petr Gondek ( 2014-12-15 21:27:51 +0100 )edit
1

Tak nějak. Záleží na tom, jakou variantu regexpů používáte. Basic RE například používá \{m,n\} a ne {m,n}.

Nezapomeňte také pokrýt začátek a konec adresu, to vaše řešení vybere také třeba 65536.666.666.16384.

Josef Kokeš ( 2014-12-15 21:30:06 +0100 )edit

ad 6) grep na Solarisu neumí ani -o? To je teda hodně chudý příbuzný GNU grepu :-)

MiB ( 2014-12-15 21:46:16 +0100 )edit

@MiB: Nemá. Kdyby měl, bez lookaroundů by stejně bylo problematické ho použít.

Josef Kokeš ( 2014-12-16 06:13:38 +0100 )edit

Záleží, co přesně může být okolo IP adresy. Pro běžné případy by podlě mě stačilo chytat se okraje slova (-w), což podporuje i grep na Solarisu.

MiB ( 2014-12-16 09:33:04 +0100 )edit
1

answered 2015-01-18 12:23:11 +0100

shejby gravatar image

Včera jsem jsem to potřeboval chtěl jsem se podívat na IP adresy v logu webservru. A stačilo mi toto: (výstup jsem kontroloval sám a byl jen pro účely hraní si -> do skriptu bych si to asi ještě rozmyslel)

grep -o -E [0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\}:[0-9a-f]\{4\} grep -o -E [0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\}

Problém je ovšem složitější, záleží v jakém formátu se IP adresy vyskytují, hlavně třeba ten zkracovaný IPv6 formát může mít mnoho podob. Ale stačí trochu googlit: how to filter ipv4 and IPv6 addresses. Pokud se ovšem zabýváme i validitou, tak se RV podstatně zesložití.

edit flag offensive delete publish link more

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Stats

Asked: 2014-12-15 20:24:42 +0100

Seen: 430 times

Last updated: Jan 18 '15