как распечатать количество совпавших/несовпавших шаблонов и распечатать несколько шаблонов, разделенных линией

как распечатать количество совпавших/несовпавших шаблонов и распечатать несколько шаблонов, разделенных линией

как распечатать количество совпавших/несовпавших шаблонов и распечатать несколько шаблонов, разделенных строкой.

Пример ввода ( test.log):

This 23 line has eight 8888
This 11 line has three 3333
need 12 to separate eight and three 3333
eight 32 is greater than three 8888
three 13 is less than eight 3333
three 14 is printed more than eight 3333

Желаемый результат:

8888:4
3333:2
5555:0
This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

что я уже попробовал:

  1. чтобы получить количество строк:egrep -o '8888|3333|5555' test.log | sort| uniq -c

выход:

4 3333
2 8888

но это не печать, 0 5555указывающая на нулевое вхождение числа пять в файле test.log

желаемый результат:

4 3333
2 8888
0 5555
  1. egrep '8888|3333' test.log | sort -V

эта сортировка вывода в алфавитном порядке, а не в соответствии с ожидаемым выводом, как показано ниже:

This 11 line has three 3333
need 12 to separate eight and three 3333
three 13 is less than eight 3333
three 14 is printed more than eight 3333
============================================
This 23 line has eight 8888
eight 32 is greater than three 8888
==========================================

решение1

Программа, которую вы ищете и которая может легко сделать то, что вам нужно, называется awk. :-)

Он может выполнять запрограммированные действия по сопоставленным шаблонам RE.

Непроверенный, упрощенный, механический пример awkпрограммы, которая должна работать с вашим примером входных данных и указанными шаблонами:

BEGIN {
    eights = 0;
    fives = 0;
    threes = 0;
}
/8888/ {
    eightln[eights] = $0;
    eights++;
}
/5555/ {
    fiveln[fives] = $0;
    fives++;
}
/3333/ {
    threeln[threes] = $0;
    threes++;
}
# ... and so on
END {
    printf("%d 8888\n", eights);
    printf("%d 5555\n", fives);
    printf("%d 3333\n", threes);
    for (i = 0; i < eights; i++) {
        print eightln[i];
    }
    print "=========="
    for (i = 0; i < fives; i++) {
        print fiveln[i];
    }
    print "=========="
    for (i = 0; i < threes; i++) {
        print threeln[i];
    }
}

Связанный контент