Portál AbcLinuxu, 11. května 2025 21:07

Dotaz: Vypis IP adres ktere navstivili lokalni www

31.3.2007 20:01 Marek
Vypis IP adres ktere navstivili lokalni www
Přečteno: 221×
Odpovědět | Admin
Dobry den, potreboval bych nejak jednoduse zapisovat do souboru datum,cas a ip adresy ktere navstivili lokalni www stranky.Napada mne zjiskat tento seznam pomoci iptables nebo nejak grepnout soubor access.log co vytvari samotny apache. U toho jsem vsak skoncil protoze nevim jak to realizovat.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Fuky avatar 1.4.2007 00:02 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Vypis IP adres ktere navstivili lokalni www
Odpovědět | | Sbalit | Link | Blokovat | Admin

No moc nerozumím tomu co vlastně chceš, protože to vypadá, že chceš duplicitní soubor k access.log, ale s tím, že bude obsahovat pouze IP a čas, případně si vybereš část URL:
cat /var/log/access.log |grep "/~fuky/" |gawk '{ FS=" "; print $1 " " $4 $5 }'

Posílám Ti ukázkový skript, který vypíše počet přenesených dat pro každou IP, třeba se Ti bude hodit při řešení Tvého problému ;-)

#!/bin/bash

# Jestlize pocet argumentu neni roven 1 vypise napovedu
if [ $# -ne 1 ]; then
  echo "Usage: $0 access.log"
  exit
fi

# do promene URL ulozi seznam vsech url z logu
# cat vytiskne soubor na obrazovku
# gawk vytiskne prvni sloupec (FS=" " oddelovac sloupcu je mezera)
# sort setridi vstup
# uniq odstrani ze vstupu duplicitni radky
URL=$(cat $1 |gawk '{ FS=" "; print $1 }' |sort |uniq)

# pro kazdou url zjisti pocet prenesenych bajtu
# a nakonec cely vystup cyklu setridi numericky podle druheho sloupce
for name in $URL; do
  # do promene size ulozi pocet prenesenych bajtu pro danou url
  # cat vytiskne soubor na obrazovku
  # grep vytiskne pouze pozadovanou url
  # sed reguelni vyraz nam ze vstupu vyfiltruje pocet prenesenych bajtu
  # tr znaky konce radku nahradi znakem plus
  # sed posledni znak (tj. +) nahradi koncem radku
  size=$(cat $1 |grep $name |\
         sed -n 's/^.\+ - - \[.\+\] \".\+\" [0-9]\+ \([0-9]\+\) .\+$/\1/p' |\
         tr "\n" "+" |\
         sed 's/\(.\+\)./\1\n/')

  # provedeni souctu, lze pouzit treba i bc
  size_result=$(($size))

  # vytiskne promenou name zarovnanou vlevo na 40 znaku
  # a promenou size zarovnanou vpravo na 10 znaku
  printf "%-40s %10i\n" $name $size_result
done |sort -r -n -k "2"

-- RÁMO: psí tábor , ETriatlon: Výuka plavání
Josef Kufner avatar 1.4.2007 00:40 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Vypis IP adres ktere navstivili lokalni www
Pokud se ti tohle bude zdát děsně pomalé, tak se to dá nahradit zhruba tímto:
</var/log/apache2/access.log \
awk '{ n[$1] += 1 } END { for(i in n) { print n[i] "\t" i; } }'\
| sort -nr
Jednak ti klesne složitost z kvadratické na lineární a také nebudeš v každém průchodu smyčkou forkovat několik nových procesů ;-)

ps: Místo té jedničky si tam dej co potřebuješ – tohle ukáže počet přístupů.
Hello world ! Segmentation fault (core dumped)
Fuky avatar 1.4.2007 14:45 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Vypis IP adres ktere navstivili lokalni www

To se mi líbí ;-) Takže, aby to fungovalo stejně vypadalo by to takhle:

#!/bin/bash

< $1 awk '{
  size = gensub(/^.+ - - \[.+\] ".+" [0-9]+ ([0-9]+) .+$/, "\\1", $0)

  if (size != $0) {
    n[$1] += size
  }
} END { for(i in n) { print i "\t\t\t" n[i]; } }' | sort -nr -k "2"

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.