Почему эти две команды GREP дают разные результаты? - PullRequest
1 голос
/ 23 сентября 2019

У меня есть большой файл журнала, содержащий строки для конкретной задачи следующим образом:

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

Я хочу подсчитать количество зарегистрированных "My task" уникальных.Которая в этом случае должна быть 3.

Я использовал эти две команды, которые, на мой взгляд, должны давать одинаковые и правильные результаты:

grep 'My Task :' | uniq | wc -l
grep -E 'My Task :' | sort --unique | grep -cE 'My Task :'

Две команды дают одинаковые результатына маленьких тестовых файлах я создаю, но разные результаты на большом лог-файле на сервере.Я не могу понять почему.Точнее, первая команда дает счет ~ 33k, а вторая дает ~ 15k.Какая команда из двух, если таковая есть, правильна?И что я в идеале должен делать?

Ответы [ 3 ]

2 голосов
/ 23 сентября 2019

Возможно, это происходит потому, что uniq может найти только последовательных идентичных строк.Скажем, если ваш файл выглядит так:

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

[info] My task : 123
[info] Other task : 111
[info] My task : 456
[info] My task : 456
[info] My task : 789

результаты будут другими:

$ grep 'My task :' FILE | uniq | wc -l
15
$ grep -E 'My task :' FILE | sort --unique  | wc -l
3
0 голосов
/ 23 сентября 2019

Нет необходимости в нескольких командах для подсчета уникального номера.

awk '/My task/ {a[$NF]++;c+=a[$NF]==1?1:0} END {print c}' file
3
  • /My task/ строка содержит My task, если да:
    • a[$NF]++ создать массив с номером в качестве ключа.Первый раз, когда будет найдено значение, будет 1, во второй раз 2, в третий раз будет найдено то же значение, что и 3 и т.д.
    • c+=a[$NF]==1?1:0, если массив [число] равен 1 (первый раз найден), увеличить c с помощью 1, иначе добавить 0
  • {print c} напечатать числоуникальный номер из переменной c
0 голосов
/ 23 сентября 2019

Проблема: uniq и sort -u

Они должны быть эквивалентны в простом случае, но будут вести себя иначе, если вы используете опцию -k дляопределить только определенные поля строки ввода для использования в качестве ключей сортировки.В этом случае sort -u будет подавлять строки, имеющие одинаковый ключ , даже если другие части строки различаются, тогда как uniq будет подавлять только строки, которые абсолютно идентичны .

** Разница между двумя командами **

1-я команда grep 'My Task :' | uniq | wc -l: выводит количество строк, уникальных для «Моей задачи»

2-я команда grep -E 'My Task :' | sort --unique | grep -cE 'My Task': печатается счетчик соответствующего шаблона 'Моя задача'

Несоответствие ч / б двум зависит от содержимого вашего файла журнала.

Чтобы ответить на ваш вопрос, какой из них использовать: Когда вы используете grep with -E, как вы пытались создать подходящий шаблон, а затем сосчитать строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...