Вот еще одно чисто-Python решение, использующее в качестве ввода следующие данные: logfile.txt
:
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/jquery.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/jquery.jshowoff.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /2468.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /Abcd.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /abcd.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /aBcd.js HTTP/1.1" 200 25139
22.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET / asd.js HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/index.html HTTP/1.1" 200 25139
72.133.47.242 - - [25/Apr/2013:15:45:28 -0700] "GET /include/login.jsp HTTP/1.1" 200 25139
Все имена JavaScript хранятся в set
, так как вы хотите только уникальные ценности. Перед печатью они сортируются в алфавитном порядке.
Он перебирает каждую строку, находит индекс первого .js
, начиная с конца строки, затем находит индекс первого /
, начиная с откуда он нашел .js
, направляясь влево.
Строка разрезана с использованием этих 2 индексов, чтобы дать нам имя файла. Если .js
не найден, rfind
возвращает -1
, что не имеет значения, потому что в конце мы проверяем, заканчивается ли имя файла .js
, прежде чем добавить его в set
. Вы можете использовать rindex
, но вам нужно будет обработать ValueError
для строк, которые не имеют .js
.
filenames = set()
with open(r"C:\Users\Old Joe\Desktop\logfile.txt") as f:
for line in f:
end = line.rfind(".js") + 3 # 3 = len(".js")
start = line.rfind("/", 0, end) + 1 # 1 = len("/")
filename = line[start:end]
if filename.endswith(".js"):
filenames.add(filename)
for filename in sorted(filenames, key=str.lower):
print(filename)
Вывод:
asd.js
2468.js
aBcd.js
abcd.js
Abcd.js
jquery.js
jquery.jshowoff.js
login.js