У меня есть скрипт, который ищет 404 кода состояния HTTP в моем журнале доступа. Тем не менее, команда безопасности имеет скрипт, который ищет уязвимости, которые вызывают 100 из 404 записей в моих журналах. Я отфильтровываю IP-адрес их тестовых блоков, чтобы избежать ложных срабатываний. Но они недавно добавили новый сервер. Проблема в том, что IP-адрес этого нового сервера имеет только 2 цифры для последней части. (т.е. 10.1.1.18 - это не IP, но вы поняли).
Как получить awk или grep, чтобы игнорировать IP-адрес, заканчивающийся 18, а не действительные IP-адреса 180-189, которые мне нужно искать?
Для тех, кто не знаком с содержимым журнала доступа HTTP, приведу следующий пример:
10.1.1.18 - - [12 / май / 2018: 01: 25: 07 -0600] "GET /xampp/cgi.cgi HTTP / 1.1" 404 909
Я попытался процитировать IP-адрес, чтобы включить пробел после 18, например:
cat access.log | grep -v "10.10.10.230" | grep -v "10.10.11.116" | grep -v "10.1.1.18" | awk -f report_errors.awk
Но тогда я не получаю вывод из скрипта awk. Почему пробел в цитируемом исключении grep может привести к смерти awk? Когда я удаляю команду awk с конца, я получаю правильное содержимое файла access.log (что означает, что записи тестового сервера были правильно удалены).
Я не знаю, что я делаю не так. Ниже приведен файл report_errors.awk:
BEGIN {
FS = "\""
title = "HTTP sslaccess_log:\n"
flag = 0
error = 0
error400 = 0
error408 = 0
error500 = 0
site = 0
separator = ""
allERRORS = ""
}
function qsortA(array,min,max) {
if (min > max) {
return
}
m = min
for (knx = (min + 1) ; knx <= max ; knx++) {
if (array[knx] < array[min]) {
swap(array,++m,knx)
swap(array,min,m)
}
}
qsortA(array,min,(m - 1))
qsortA(array,(m + 1),max)
}
function swap(array,ind1,ind2) {
sw = array[ind1]
array[ind1] = array[ind2]
array[ind2] = sw
}
$3 ~ / 404 / {
printf( "%s", title)
if ( $2 ~ /site/ || $2 ~ /dot.gif/ || $2 ~ /maintenance/ || $2 ~ /graypixel.gif/ || $2 ~ /.css/ || $2 ~ /crossdomain.xml/ || $2 ~ /OPTIONS/ )
{
split( $2, name, " " )
msg = substr(name[1],0,1) " " name[2]
if ( index( allERRORS, msg) == 0 )
{
allERRORS = allERRORS separator msg
separator = ","
}
arrCOUNT[msg]++
site=1
}
else
{
print " - " $0
error++
}
title = ""
flag++
}
$3 ~ / 400 / {
error400++
}
$3 ~ / 408 / {
error408++
}
$3 ~ / 500 / {
# printf( "%s", title)
# print " - " $0
error500++
# title = ""
# flag++
}
END {
if (flag > 0) {
if (error > 0) {
printf("---- %4d: basic errors\n", error)
printf("---- %4d: 400 errors\n", error400)
printf("---- %4d: 408 errors\n", error408)
printf("---- %4d: 500 errors\n", error500)
}
if (site = 1)
{
split( allERRORS, arrERRORS, "," )
jnx = 0
for ( inx in arrERRORS )
{
arrNew[++jnx] = arrERRORS[inx]
}
qsortA(arrNew,1,jnx)
inx = 0
while ( inx < jnx )
{
printf("---- %4d: %s\n",arrCOUNT[arrNew[++inx]],arrNew[inx])
}
}
printf("---- %4d: Total 404 Errors\n",flag)
}
}
Любой совет?