Как использовать значение, возвращенное сценарием в фильтре grep?

Это могло быть вызвано скосом времени. Удостоверьтесь, что все машины получают время от интернет-сервера времени.

3
23.01.2012, 04:24
1 ответ

Ваш сценарий не должен производить одинарные кавычки. Когда Вы пишете

egrep 'foo|bar'

одинарные кавычки являются частью синтаксиса оболочки. Они защищают символы в них против расширения. Если одинарные кавычки появятся в выводе Вашего сценария, то они будут взяты в качестве обычных символов. Просто опустите их.

Существует намного более легкий способ записать Ваш сценарий: замените новые строки символами вертикальной черты и удалите последний.

list=$(</usr/local/directadmin/data/users/$user/domains.list tr '\n' '|')
echo "${list%|}"

Вы не должны делать этого при поиске фиксированного набора строк. Вместо этого используйте -F опция к grep сказать этому искать фиксированные строки, и -f опция сказать этому читать список шаблонов из файла.

grep -Ff /usr/local/directadmin/data/users/bob/domains.list

Обратите внимание на это, если Вы имеете domain.com в том файле поиск также возвратит хиты для более длинных строк такой как otherdomain.com. Таким образом, можно хотеть использовать сценарий для создания шаблона, который имеет привязки вначале и в конце, поэтому избегайте побочного соответствия. Я не знаю, какую пунктуацию журнал exim имеет; например, если бы имена окружаются пробелом, Вы хотели бы что-то как

#!/bin/sh
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
echo " (${list%|}) "

и назовите его как

</var/log/exim/mainlog grep -E `/path/to/rowscript bob`

Или выполните вызов сценария grep:

#!/bin/sh
shift
list=$(</usr/local/directadmin/data/users/$1/domains.list tr '\n' '|')
grep -E " (${list%|}) " -- "$@"

названный как

</var/log/exim/mainlog /path/to/rowscript bob
3
27.01.2020, 21:24
  • 1
    1) я уже протестировал сценарий, который я отправил сначала и упростил его. 2) Simply omit them. Хорошо, я пытался опустить их ранее и теперь также. Затем я добавил галочки к egrep'/script/row'и все еще не имейте никакой удачи 3) спасибо за grep -Ff! Это работает довольно хорошее. –  Drey 13.11.2011, 22:14
  • 2
    @Drey Ваша исправленная версия все еще имеет одинарные кавычки: изменение echo "'"$list"'" кому: echo "$list". –  Gilles 'SO- stop being evil' 13.11.2011, 22:30
  • 3
    я уже удалил эти кавычки из сценария, но все еще разве использую сценарий, не может произвести как –  Drey 13.11.2011, 22:49
  • 4
    @Drey фильтра, На что похож Ваш входной файл? На что похож вывод Вашего сценария (и какую версию Вашего сценария Вы используете, Вы внесли несколько изменений, и я потерял след)? –  Gilles 'SO- stop being evil' 13.11.2011, 22:52
  • 5
    @Drey Снова, отбросьте одинарные кавычки: … | grep -E `/scripts/domainsrow` Видеть Различие между 'и "на командной строке (удар)? (но обратите внимание, что csh имеет различные правила, таким образом, также читает csh руководство). –  Gilles 'SO- stop being evil' 13.11.2011, 23:29

Теги

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