Как получить информацию о файле построчно с некоторым условием и без awk

у меня есть файл

192.168.10.1 - - [12/aug/20:23:30:41] "PUT /img.jpg" 200 - 
192.168.10.2 - - [10/aug/20:01:20:30] "PUT /img.jpg " 404 - 
192.168.10.2 - - [10/aug/20:12:10:15] "PUT /img.jpg " 200 2114 
192.168.10.3 - - [09/aug/20:06:20:12] "GET / img.jpg" 200 377 
192.168.10.1 - - [07/aug/20:12:40:20] "GET /img.jpg" 200 2114
192.168.10.1 - - [01/aug/20:06:45:50] "GET /img.jpg" 404 - 

Я хочу подсчитать каждую LIne в файле, в котором 2-е последние номера строки, начинающиеся с 2 , например, 192.168.10.1 существуют в файле 3 раза, но только 2 строки 192.168.10.1 - это 200 и 1 - 404. поэтому я хочу считать только 2 строки

192.168.10.1  2
192.168.10.2  1
192.168.10.3  1

person Zeeshan    schedule 12.09.2020    source источник
comment
Наш формат работает лучше всего, когда вы действительно пробовали что-то сами и у вас есть вопрос, почему это не сработало. Если вы не пробовали написать свой собственный код, столкнулись с определенной проблемой и искали другие вопросы по этой проблеме, обычно преждевременно задавать вопрос здесь.   -  person Charles Duffy    schedule 12.09.2020
comment
Тем не менее, как существующий экземпляр с ответом: сортировать уникальные IP-адреса в журнал апача   -  person Charles Duffy    schedule 12.09.2020
comment
Как определить попытку подключения?   -  person M. Nejat Aydin    schedule 12.09.2020
comment
@M.NejatAydin Попытка подключения с помощью кода состояния (начиная с 2). код состояния — это 2-е последние цифры каждой строки. Например, код состояния первой строки — 404, код состояния 2-й строки — 200.   -  person Zeeshan    schedule 12.09.2020
comment
@CharlesDuffy Мне нужны только те IP-адреса, код состояния которых начинается с 2 (код состояния — это 2-е последние цифры в каждой строке). Например, код состояния в первой строке — 404, код состояния во 2-й строке — 200.   -  person Zeeshan    schedule 12.09.2020
comment
..Здорово, что ты этого хочешь. Как вы пытались это сделать и с какой конкретной узкой проблемой столкнулись в процессе?   -  person Charles Duffy    schedule 12.09.2020
comment
Кстати, если бы вы использовали asql, вашим ограничением на код состояния было бы просто предложение WHERE STATUS>=200 AND STATUS<300 в вашем запрос.   -  person Charles Duffy    schedule 12.09.2020
comment
@CharlesDuffy Я пробовал с помощью этой команды cat thttpd.log | awk '{напечатать $1}' | сортировать | uniq -c, но проблема в том, что подсчитываются все IP-адреса, я хочу применить фильтр, который проверяет код состояния, начинающийся с 2, а затем подсчитывает. Я не знаю, как я могу сделать это в сценарии оболочки   -  person Zeeshan    schedule 12.09.2020
comment
Пожалуйста, не добавляйте дополнительные требования к комментариям. Ответы хороши, но очевидно, что вы будете нарушать их снова и снова, каждый раз, когда будете раскрывать новые секретные требования. Вы должны отредактировать свой вопрос. Вы должны четко определить, что означает попытка. Любая просьба - покушение на меня, а ты этого не хочешь. Вы хотите включить код статуса ответа или тип запроса? Вы должны предоставить точный ожидаемый результат для своего примера ввода. Вы должны включить во вход репрезентативные случаи для ваших требований.   -  person thanasisp    schedule 12.09.2020
comment
Вы хотите напечатать все строки с вхождениями или только первую? Обновите вопрос, либо напишите, что вам нужна только первая, либо добавьте еще 2 строки в вывод в соответствии с вашим вводом.   -  person thanasisp    schedule 13.09.2020
comment
@thanasisp обновил вопрос, мне нужны все строки   -  person Zeeshan    schedule 13.09.2020
comment
Очень хорошо, @Zeeshan, пожалуйста, подождите, пока еще один человек не откроет этот вопрос.   -  person thanasisp    schedule 13.09.2020
comment
@thanasisp также извините за дополнительные требования к комментариям. Я новичок здесь и не знаю правил и положений   -  person Zeeshan    schedule 13.09.2020


Ответы (2)


Это можно сделать разными способами, один из них — использовать комбинации команд awk, sort и uniq.

 awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' log_file.txt | sort | uniq -c | sort 

Объяснение:

  • awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' --› Это проверит, начинается ли второй последний столбец с 2, если да, он напечатает первый столбец, т. Е. IP-адреса
  • sort --› Сортирует вывод
  • uniq -c --› Сообщает, сколько раз повторялась строка, а также сколько раз она повторялась.
person Homer    schedule 12.09.2020
comment
Вам не нужно cat filename | command, а просто command <filename и в случае awk он с радостью принимает имена файлов в качестве аргументов, таких как awk -f ' ' '{print $1}' log_file.txt | sort | uniq -c | sort | cut -f2- - person Léa Gris; 12.09.2020
comment
@Homer Мне нужен только IP-адрес, код состояния которого начинается с 2 (код состояния — это 2-е последние цифры в каждой строке). Например, код состояния первой строки — 404, код состояния 2-й строки — 200. - person Zeeshan; 12.09.2020
comment
Чтобы удвоить то, что ЛеаГрис сказал ранее, cat filename | somecommand иногда на несколько порядков менее эффективен, чем somecommand <filename или (где это применимо) somecommand filename. Конкретные примеры включают tail (при подаче из cat он должен читать файл с самого начала; при наличии реального дескриптора он может перейти прямо в конец); sort (при наличии реального файла он может быть разделен на потоки, которые одновременно читают разные подмножества файла и сортируют их параллельно, тогда как канал из cat можно читать только спереди назад); и другие. - person Charles Duffy; 12.09.2020
comment
LéaGris/Charles, договорились, мы можем убрать кат. Спасибо. @Zeeshan, мы можем поместить условие в awk, чтобы проверить, начинается ли предпоследнее значение с 2, например: awk -F ' ' '$(NF-1) ~ /^2/ {print $1}' log_file.txt | сортировать | уникальный -c | Сортировать - person Homer; 12.09.2020

Использование утилит командной строки:

grep '^[^"]*"[^"]*" 2' logfile |
cut -d' ' -f1 | sort | uniq -c | sort -nr | head -n 10

В нем перечислены первые десять IP-адресов, упорядоченные по количеству попыток.

person M. Nejat Aydin    schedule 12.09.2020
comment
Это не работает - person Zeeshan; 12.09.2020
comment
Не работает, по сути, бесполезна в качестве описания — оно не предоставляет никакой информации, которую кто-то мог бы использовать для создания решения, которое действительно работает. Какая конкретная проблема возникла у вас при развертывании этого кода? - person Charles Duffy; 12.09.2020
comment
@Zeeshan Какой результат вы получаете? Я попробовал это на вашем образце, и это работает. - person M. Nejat Aydin; 12.09.2020
comment
@M.NejatAydin ничего - person Zeeshan; 12.09.2020
comment
@Zeeshan Тогда либо вы загружаете не тот файл, либо формат в вашем образце неверен. - person M. Nejat Aydin; 12.09.2020
comment
@M.NejatAydin да, вы правы, он работает в соответствии с приведенным выше файлом журнала, но мой фактический формат файла журнала ниже 172.16.0.3 - - [31/Mar/2002:19:30:41 +0200] GET / HTTP/1.1 200 123 Mozilla/5.0 (совместимый; Konqueror/2.2.2-2; Linux), когда я пробую этот формат, ничего не показывает, можете ли вы сказать мне, в чем проблема? - person Zeeshan; 12.09.2020
comment
@Zeeshan Я отредактировал ответ. - person M. Nejat Aydin; 12.09.2020
comment
@M.NejatAydin, вы жестко запрограммировали здесь GET 'GET [^]* 2', можем ли мы сделать это без жесткого закодирования, потому что в будущем, возможно, у нас будут некоторые строки с GET, некоторые с PUT, так как мы можем справиться с этим - person Zeeshan; 12.09.2020
comment
@ Зишан Да. Я отредактировал это снова. - person M. Nejat Aydin; 12.09.2020
comment
@M.NejatAydin, спасибо, не могли бы вы дать мне объяснение кода? - person Zeeshan; 12.09.2020
comment
@ M.NejatAydin также скажите мне, как мы можем изменить формат, приведенный выше код показывает количество попыток IP-адресов, если мы хотим первый IP-адрес, а затем подсчитываем количество попыток IP-адресов. - person Zeeshan; 12.09.2020