Как использовать значение, возвращаемое скриптом в 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 
  • Создание одного файла из другого на основе условий поиска
  • сортировать файлы размером более 1000 байт в порядке убывания
  • exec cp не работает из сценария, но работает при выпуске напрямую
  • Diff, показать измененную строку только из правого файла
  • как сделать цикл с тестом md5sum на сценарии bash?
  • xdotool печатает 8 вместо Tab
  • лучше несколько заменить фигурные скобки
  • В чем разница между «==» и «= ~»?
  • Копирование больших файлов - создает ли пустым файл в пункте назначения?
  • Ubuntu 16.04 bash - можно открыть два интерактивных окна терминала в одном скрипте?
  • Сценарий не завершается, когда функция, назначенная переменной
  • Interesting Posts

    Как установить glibc.i686 с использованием rpm с разрешенной зависимостью

    Таблица отображения окна и столбец отображения экрана в Emacs

    Проблемы с загрузкой ядра ядра ядра 3.0.0-1 и NVIDIA

    grep и выводить целое слово

    Wi-Fi с аутентификацией WPA2-EAP MS-CHAPv2 (имя пользователя и пароль) во время установки Debian

    debootstrap от Intel Atom (i686) до AMD Sempron (AMD 64)

    Извлеките путь к каталогу, содержащий файл с соответствующей строкой

    каково различие между / media, / mnt и / run / mount?

    Как получить размер данных, которые еще не были записаны на диск?

    Диалоговое окно консоли консоли Bash с выходом команды

    Загрузитесь в терминал по умолчанию, но по-прежнему загружаете графический интерфейс в Debian?

    Как настроить встроенную цифровую клавиатуру на клавиатуре, используя linix mint?

    Как программно изменить режим командного режима Vim?

    Почему изменяется точка монтирования моей корневой файловой системы?

    Удалить последнюю запятую из строки bash для созданной петли строки

    Linux и Unix - лучшая ОС в мире.