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

Я нахожусь в csh FreeBSD. Я хочу создать строку с доменами одного пользователя, а затем использовать эту строку для фильтрации exim maillog, чтобы получать только почту из доменов этого пользователя.

Я написал сценарий для создания строки из списка DirectAdmin-доменов:

#!/bin/sh user="some-user" list=$(cat /usr/local/directadmin/data/users/$user/domains.list) domaincount=$(echo $list|wc -w) echo $list| tr ' ' '|' 

Выполнение этого скрипта возвращает строки с такими доменами: 'domain.com' или это: 'domain1.com|domain2.net'

Теперь я хочу использовать это как аргумент grep , но

 cat /var/log/exim/mainlog |egrep `/path/to/rowscript` 

ничего не возвращает, при замене вручную /path/to/rowscript результат возвращает то, что я хочу видеть.

Пытался использовать

 grep -E "`/path/to/rowscript`", egrep '`/path/to/rowscript`' egrep `/bin/sh /path/to/rowscript` egrep $(/path/to/rowscript) getting "Illegal variable name." 

и т. д., но все равно не повезло.

BTW, date в backticks хорошо работает:

 cat /var/log/exim/mainlog | grep `date +%Y-%m-%d` 

Что я делаю не так?

One Solution collect form web for “Как использовать значение, возвращаемое скриптом в grep-фильтре?”

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

 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 
  • Найдите количество всех типизированных команд, которые содержат строку, используя grep
  • Как запустить команду SSH для установки StrictHostKeyChecking = no?
  • Почтовое оповещение с сообщением «tar: Удаление ведущих` / 'из имен участников »
  • Как интегрировать несколько сценариев Python / Perl для исполнения в одном сценарии bash?
  • Как передать аргумент из сценария bash в 'x-terminal-emulator -e bash -c'?
  • grep для извлечения подстрок в строке
  • Безопасно ли удалить файл сценария из этого скрипта?
  • Статус последнего выхода из скрипта без источника
  • Bash: увеличивать переменную в цикле while?
  • Оператор if и else с использованием diff -q
  • Команда ZSH запускается в оболочке, но не в скрипте
  • Linux и Unix - лучшая ОС в мире.