Мне нужно количество строк между двумя совпадающими шаблонами

Добавьте -E и удалите квадратные скобки:

$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;

Примечания:

  1. + не поддерживается в основных регулярных выражениях. -E включает расширенное регулярное выражение, которое поддерживает + .

  2. \ w + соответствует одному или нескольким символам слова. [\ w +] соответствует любому из \ , w или + .

  3. \ w не переносится. Для совместимости с POSIX используйте:

     $ sed -E 's / fastcgi_param WP_ENV [[: alnum:]] + / fastcgi_param WP_ENV production / g' file 
    fastcgi_param WP_ENV production; 
     
  4. Вы можете избежать двойного ввода строки, используя группу захвата:

     $ sed -E 's / (fastcgi_param WP_ENV) [[: alnum:]] + / \ 1 production / g' file {{1} } fastcgi_param WP_ENV production; 
     
2
13.07.2016, 01:43
3 ответа

echo выдаст только одну строку, а wc будет считать эту строку.

Обратите внимание, что конечная временная метка не существует 13:41:43, а используемые якоря (^ и $) слишком ограничительны.

Удалите echo и попробуйте следующее:

sed -n '/13:40:43/,/13:41:49/p' somelogfile.log | wc -l
5
27.01.2020, 21:54

Рассмотрим эту команду:

echo sed -n '/^13:40:43$/,/^13:41:43$/ p' somelogfile.log | wc -l
  • Рассмотрим, что делает echo и что идет через трубу к wc (просто попробуйте без wc). Это объясняет, почему вы всегда получаете 1.

  • Написанные вами регексы привязаны к началу ^ и концу $ строки, но, конечно, эти временные метки - не единственное, что есть в строке, поэтому вам следует убрать якоря.

  • Условие end ищет временную метку, которой нет в вашей выборке, поэтому диапазон совпадений никогда не закончится, печатая все, начиная с первого совпадения.

Что-то вроде этого может сделать примерно то, что вы просите (вывод 3 с входным файлом, показанным в вопросе)

sed -ne '/13:40:47/,/13:41:48/p' somelogfile.log | wc -l
1
27.01.2020, 21:54

Если хронологический порядок совпадает с лексическим, можно просто сделать:

awk '$0>="[11/Jul/2016:13:40:00" && $0<="[11/Jul/2016:13:41:59"' file | wc -l

Здесь проверяется, больше или равно ли значение первой дате и меньше или равно второй дате. Если в awk не задана команда, awk просто выводит строку.

1
27.01.2020, 21:54

Теги

Похожие вопросы