Итак, что происходит, так это то, что readlines делает, что он хлебает весь текстовый файл.
Таким образом, у вас есть массив с содержимым текстового файла, разделенного новой строкой (и новая строка сохраняется в каждой строкев массиве).
После этого вы создаете файл lines.each, который выдает счетчик. Затем вы вызываете .match на перечислителе вместо самой строки
Правильный способ сделать это будет
lines.each { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }
Однако вышеприведенное на самом деле ничего не сделает, потому что всевы выполняете итерацию каждого элемента и проверяете, соответствует ли он REGEX.Если вы хотите, чтобы он действительно что-то делал, попробуйте ...
matches = lines.map { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }
Помните, что метод match работает только со строками. Если match совпадает с чем-либо, он возвращает объект класса MatchData, иначе, если он ничего не соответствует - ноль.