grep несколько строк, считайте строки, эхо произведенный для каждой строки

Существует много факторов, которые могли бы заставить часы программного обеспечения отставать или убегать. Отмечает время прихода на работу виртуальные серверы особенно подвержены целому классу этих проблем. 12 секунд в день довольно плохи, пока Вы не сталкиваетесь с виртуальными полями с часами, которые достигают на 180-200%-й скорости! Отмечает время прихода на работу ноутбуки, которые приостанавливают, может пострадать от хронометрирования проблем также.

Необходимо рассмотреть отбрасывание ntupdate в пользу ntpd. Имя пакета ntp на Debian (и по-видимому Ubuntu также). Демон NTP сохраняет Ваше время в синхронизации намного больше заранее, чем задание крона, синхронизирующееся с одним или несколькими другими серверами NTP и сохраняющее Ваши часы намного более точный. Это - другая реализация того же протокола ntpdate использование, кроме ntpd контролирует время непрерывно.

Если Вы не хотите (очень маленькие) издержки ntpd, Вы могли бы рассмотреть выполнение ntpdate раз в час. Принятие Вы - 0,5 с от каждого часа, который должен быть достаточным.

3
15.01.2013, 17:52
2 ответа

Необходимо проверить grep -c, это делает точно, что Вы описываете. При необходимости в большей гибкости Вы могли бы, вероятно, использовать awk. Попробуйте что-то вроде этого (введенный непосредственно в браузере и не протестированные):

dir=$1
# add tests to check if $1 exists (-d) and/or is non null (-n)

find "${dir}" | awk <<\EOF

BEGIN {
   pat1 = 0;
   pat2 = 0;
   ...
}

/pattern/ { pat1 += 1;}
/otherpattern/ {pat2 += 2;}
...

END {
   print "pattern", pat1;
   print "otherpattern", pat2;
   ...
}
EOF

Я оставлю его до Вас для разработки деталей find команда или awk сценарий.

4
27.01.2020, 21:14
  • 1
    Спасибо за это. Я ничего не знаю о awk таким образом, это - совершенно новая территория. Я предполагаю, что надеялся for цикл работал бы, и я не должен буду использовать что-то как awk. –  karavan 15.01.2013, 18:39
  • 2
    Конечно, for цикл может работать. Попробуйте это for pat in 'pat1' 'pat2' 'pat3'; do echo $pat $(grep -E -rc "$pat" $1); done. В зависимости от версии grep Вы используете, Вы, возможно, должны настроить эту команду a (крошечный) бит. Я только упомянул awk так, чтобы Вы циклично выполнились только однажды по subdirs (в случае, если существуют слишком многие), и Вы хотите управлять выводом или добавить некоторое вычисление. awk сценарий, который я записал, является несколько неполным, но должен дать Вам общее представление о том, как он работает. Попытайтесь считать его, я держал пари, что Вы узнаете awk не так твердо, как это разобрано, чтобы быть :) –  rahmu 15.01.2013, 18:40
  • 3
    Спасибо, я сделаю мой awk домашняя работа :) –  karavan 15.01.2013, 19:04
  • 4
    Попытка выяснить, почему for цикл от @rahmu выше не работает. Я сделал: for pat in 'text1' 'text2' 'text3'; do echo $(grep -E -rc '$pat' $1); done' Результат - что-то вроде этого для каждого файла в каталоге (существуют тысячи): "/data/dir1/file:0". То, что я ожидаю, "text1=10, text2=20, text3=32". Мысли? –  karavan 15.01.2013, 20:52

Следующие циклы сценария по шаблону и печати общее количество соответствий для каждого шаблона. Это ищет в соответствии с каталогом, имя которого передается как аргумент, или под текущим каталогом, если Вы не передаете аргумент.

#!/bin/sh
for p in 'Pattern 1' 'Pattern 2' 'Pattern 3; do
  printf '%s = ' "$p"; grep -E -r -e "$p" "${1:-.}/data" | wc -l
done
2
27.01.2020, 21:14
  • 1
    Это - точно это!Спасибо! Я проголосовал бы за Ваш ответ, но у меня нет достаточного количества точек репутации :). Можно ли объяснить это ${1:-.} немного? Я понимаю, что это - переменная от arguement, но что делает :- ? –  karavan 16.01.2013, 18:58
  • 2
    @karavan: Это - синтаксис для определения значения по умолчанию. Если $1 пусто (если никакие параметры командной строки не предоставляются), то используйте для значения .. man bash и быстрый поиск :- объяснило бы это лучше всего. –  rahmu 19.01.2013, 17:08

Теги

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