[+] Bash, niezapisywanie istniej

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
markossx
Beginner
Posty: 489
Rejestracja: 26 maja 2007, 16:01
Lokalizacja: Polska

[+] Bash, niezapisywanie istniejących informacji w pliku

Post autor: markossx »

Próbuję napisać skrypt, który wybiera numery IP z loga i zapisuje do pliku.

Problem mam taki, że nie chciałbym zapisywać do pliku łańcucha (ang. string), który jest już w pliku.

Jak to ugryźć?

W MySQL też mogę to trzymać.
Awatar użytkownika
DaVidoSS
Junior Member
Posty: 875
Rejestracja: 06 marca 2010, 11:26
Lokalizacja: ~/

Post autor: DaVidoSS »

Spróbuj tak:

Kod: Zaznacz cały

#!/bin/bash


PLIK=$(echo "$PWD/plik.list")   #sciezka do pliku wyjsciowego
LOG=$(echo "$PWD/plik.log")  #sciezka do LOG

STRING=$(grep -w "192.134.45.34" $LOG)
 
if  [[ ! $(grep -w "$STRING" $PLIK) ]]; then

echo $STRING >> $PLIK

fi

Z wyszukiwaniem adresów IP tak:

Kod: Zaznacz cały

#!/bin/bash

#pliki

PLIK=$(echo "$PWD/plik.list")   #sciezka do pliku wyjsciowego
LOG=$(echo "$PWD/plik.log")  #sciezka do LOG


# generownie adresow ip do pliku w celach testowych

#X=0
#if [[ -z $( cat $LOG 2>/dev/null ) ]]; then
#    until [[ $X = 100 ]]; do
#        IP=$(echo "$((RANDOM%100+155)).$((RANDOM%100+155)).$((RANDOM%100+155)).$((RANDOM%100+155))")
#        X=$(( X + 1 ))
#        echo $X
#        echo $IP >> $LOG
#    done
#else
#    echo " $LOG wystepuje i zawiera  $( grep -w '[[:digit:]].[[:digit:]].[[:digit:]].[[:digit:]]' $LOG | wc -l ) adresow IP" 
#fi
#sleep 4



#pozyskiwanie nowych adresow IP z pliku log do zmiennej STRING

while read LINE; do

    STRING=$(echo $LINE | grep -w '[[:digit:]].[[:digit:]].[[:digit:]].[[:digit:]]')

        if [[ -n  $STRING ]]; then

            if [[ ! $(grep "$STRING" $PLIK) ]]; then

                echo $STRING >> $PLIK

            else

                echo "$STRING wystepuje juz w $PLIK"
            fi

        else

            echo "$LINE nie zawiera adresu ip"


        fi

done < $LOG
exit 0
Awatar użytkownika
markossx
Beginner
Posty: 489
Rejestracja: 26 maja 2007, 16:01
Lokalizacja: Polska

Post autor: markossx »

Dziękuję DaVidoSS za zainteresowanie. Twój przykład działa, jednak przy kolejnym uruchomieniu skryptu wyłapuje $STRING z loga, ale nie ładuje go do $PLIK.

Idąc za Twoją koncepcją zrobiłem ostatecznie tak:

Kod: Zaznacz cały

#!/bin/bash -x
PLIK=$(echo "$PWD/ip.txt")
LOG=$(echo "$PWD/mail.log.10")
STRING=$(grep -i -w test $LOG | awk '{ print $10 }' | egrep -o -e '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' | uniq)
echo "$STRING" | grep -v -f $PLIK >> $PLIK

Po kilkunastu testach wydaje się działać poprawnie i jest w miarę optymalne. Gdybym poczynił jakieś zmiany - zaktualizuję post.

Pozdrawiam.
ODPOWIEDZ