Я бы использовал Python. В настоящее время на каждом linux ststem установлен python2.
Добавьте каждый IP-адрес в ассоциативный массив dict ()в виде пар ключ=значение, т. е. {"12.34.56.78" :1, "87.76.43.21" :3}.
Вы «проверяете» IP-адрес как ключ и увеличиваете значение на 1. Если вы используете defaultdict («ip» ), если ключ не существует, он создается со значением по умолчанию 0. Если ключ уже существует, defaultdict ничего не делает. Значение увеличивается на следующей строке.
#!/usr/bin/python2
infile = open("file.txt","r")
iplist = {} # create an empty dict
for line in infile:
line = line.strip() # remove newline.
if line: # if not a blank line.
iplist.setdefault(line, 0) # check for ip and add with default value of 0
iplist[line] += 1 # increment
outfile = open("out.txt","w") #open output file
for key in iplist.keys():
line = "%-15s = %s" % (key, iplist[key])
print line # print uf desired.
outfile.write(line + "\n")
исходящий файл:
cat out.txt
27.33.65.2 = 2
58.161.137.7 = 1
121.50.198.5 = 1
184.173.187.1 = 3
Я знаю, что вы искали решение с командной строкой, но, как видите, это элегантно отформатированное отображение, занимающее всего около дюжины строк. Python — отличный инструмент для администрирования.
Конечно, мы можем предоставить вам решение. Но где веселье?
Позвольте мне сказать, что ваши требования кажутся мне опасными, так как каждая папка, не входящая в csv, будет удалена (представьте себе опечатку, неправильный формат файла/окончание строки или конечные пробелы)
Тем не менее, я познакомлю вас с тремя друзьями обработки текстовых файлов в сценарии оболочки ()
grep
ядро текстового поиска -утилита (содержимое файла, только чтение)find
ядро поиска файлов -утилита (имя файла)Никогда не используйте код, который вы не полностью понимаете!
#!/bin/sh
csvfile='index.txt'
csvseparator=','
cut -d ',' -f6,26 file.csv > index.txt
for subdir in./*/*/
do
subdir=${subdir%/}
dir=${subdir%/*}
parent=${dir%/*}
subdir=${subdir##*/}
dir=${dir##*/}
if grep -Fxq "${dir%_*}$csvseparator$subdir" "$csvfile"
then
echo "ok: $parent/$dir/$subdir"
elif grep -wq "^${dir%_*}" "$csvfile"
then
echo "no: $parent/$dir/$subdir"
# find "$parent/$dir/$subdir" -delete
fi
done