Отправляет email-рассылки с помощью сервиса Sendsay

Bash. Помогите написать скрипт

Пишу следуещее:
nbtscan -s : -f ./list.ip -t 20 | awk -F : '{print
$1"|"tolower($2)"|"tolower($4)"|"strftime("%d/%m/%y %H:%M") }' > file
Вывод в файл:
172.26.x.x |Hostname1 |Usermane1 |05/07/05 08:33
172.26.x.y |Hostname2 |Usermane2 |05/07/05 08:33
172.26.x.z |Hostname3 |Usermane3 |05/07/05 08:33
172.26.x.h |Hostname4 |Usermane3 |05/07/05 08:33
Как сделать чтобы при следующем запуске
1. Проверялось есть ли в файле совпадения IP Hoctname Username и если
нету то добавить.
2. Удалять все записи старше 10 дней.

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 19708; Возраст листа: 712; Участников: 1399
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/396447

Ответить   Tue, 5 Jul 2005 09:44:13 +0600 (#396447)

 

Ответы:

On Tue, 5 Jul 2005 09:44:13 +0600
loewa <loe***@m*****.ru> wrote:

Для более простой сортировке по дате измени на %y/%m/%d. Потом будет проще
обрабатывать.

Если честно, то не совсем коректно поставлен вопрос.

не обойтись. Выловить неповторяющиеся можно примерно так:
start file.awk #!/bin/awk -f
BEGIN {
FS="|";
}
{
adres[NR] = $1 $2 $3;
date[NR]=$4;
set[NR]=1;
}
END {
count = NR;
flag = 0;
for(x=1;x<count-1;x++){
for(y=x+1;y<count;y++){
if(adres[x]==adres[y]){
if(set[x]>0){
set[x]++;
set[y]=0;}
if(date[x]<date[y]) {
date[x]=date[y];
}
}
}
}
for(x=1;x<count;x++){
if(set[x]>0){
print(adres[x] date[x]);
}
}
}
end file.awk Используем так:
# ./file.awk list > list.new

В list.new будут все неповторяющиеся вхождения ip, host, user.

Кстати date[x] в файле создано именно для отбора по дате.
Допиши сам (или сама).

Ответить   Fri, 8 Jul 2005 21:09:46 +0700 (#397967)

 

On 7/5/05, loewa <loe***@m*****.ru> wrote:

На bash-е, конечно, можно, но будет некоторый гимор с преображованием
дат. Вообще-то, задача тянет на небольшое программирование. Может
удобнее сделать на питоне? Что-то вроде:

#!/bin/env python
import time
import popen2
import os
import pickle

# где найти nbtscan, какие дать ему ключи, куда сохранять данные между запусками
whereNbd = "/mnt/nmdraid/efremov_work/TESTS/nbtscan-1.5.1a/nbtscan"
nbdOpt = " -s : 192.168.4.1/24"
file2Save = "qqq1.p"

fin, fou = popen2.popen2(whereNbd + nbdOpt)
strList = fin.read().split('\n')

if os.path.isfile(file2Save):
f = open(file2Save, 'r')
# Вместо pickle можно было бы ипользовать запись в файл строк
# Это если промежуточный файл должен быть читаем
savedHosts = pickle.load(f)
f.close()
else:
savedHosts = {}

for h in strList:
curHst = h.split(':')
try:
key = (curHst[0].strip(), curHst[1].lower().strip(),
curHst[3].lower().strip())
except IndexError:
# Это для исключения пустой строки в конце. Ну и вообще, на всякий случай
continue
tWas = savedHosts.get(key)
tCur = time.time()
if tWas:
# this host was present
# 3600*24*10 = 10 дней (вроде...)
if tCur - tWas > 3600*24*10:
del savedHosts[key]
else:
savedHosts[key] = tCur

#saving our job:
f = open(file2Save, 'w')
pickle.dump(savedHosts, f)
f.close()

hostsList = savedHosts.keys()
hostsList.sort() # тут можно по-разному сортировать ;)
for h in hostsList:
t = savedHosts[h]
print "%15s | %10s | %10s | %s" % (h[0], h[1], h[2],
time.strftime("%d %b %Y %H:%M:%S", time.localtime(t)))

Вывод можно перенаправить в файл отчёта, или прид1ёт по почте, если
через cron запускать.
На bash всё это тоже можно изобразить, но получится наверное несколько
длиннее и запутанней (мне так кажется).

Ответить   Fri, 8 Jul 2005 18:31:41 +0400 (#397979)