Strona 1 z 1
[+] Bash, niezapisywanie istniejących informacji w pliku
: 25 maja 2012, 17:39
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ć.
: 25 maja 2012, 18:00
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
: 27 maja 2012, 19:20
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.