Intereting Posts
Отправка сценария в TORQUE `qsub`: строки PBS до или после строки shebang? Как включить% использования процессора в уведомлении? на каком уровне сетевого стека tcpdump получает информацию? Irssi: использование ALT + # для переключения окон работает для всех окон, но первое Лучшая практика для установки времени в локальной сети с использованием NTP Как определить, находится ли окно в фокусе? Нужна дополнительная информация о уведомлении о работе KDE Как добавить горизонтальное разделение на окно tmux, которое охватывает всю ширину родительского окна? Переименование файлов в каталоге Как создать файл deflate, подходящий для HTTP? Цикл между открытыми окнами с wmctrl симулировать ввод ключа в Ansible Является ли он частью любого стандарта (например, POSIX), что системные файлы должны быть более строчными? ls, mv, cp, cat, vi, команда не найдена Отправка почты Sendmail / procmail / Exchange

тройник и grep одновременно (оболочка)?

Я пытаюсь запустить сервер, который записывает в $ log (txt-файл), а затем находит весь текст в файле журнала, который начинается с «[1]» и помещает его в другой файл. Вот моя попытка. tee -a $log работает вместе со всем остальным. Однако команда grep не работает.

 run="tail -n0 -f -s 0.01 $cmds | (while true; do $tron --userconfigdir $userconfigdir --userdatadir $userdatadir --vardir $var; done) | tee -a $log | grep '^[1]' > ${var}logs/chatlogs.log" 

Что можно сделать, чтобы скопировать весь текст из tee -a $log начиная с '[1]' в другой файл?

Не помещайте команды в строки. Функции для определения составных команд – это функции.

Затем запомните самое важное правило программирования оболочки: всегда ставьте двойные кавычки вокруг подстановок переменных, например "$foo" .

У вас есть следующий код (полагающийся на переменные cmds , log , tron , userconfigdir , userdatadir и var ):

 run () { tail -n0 -f -s 0.01 "$cmds" | while true; do "$tron" --userconfigdir "$userconfigdir" --userdatadir "$userdatadir" --vardir "$var" done | tee -a "$log" | grep '^[1]' > "${var}logs/chatlogs.log" } 

Теперь, когда код находится в читаемой форме, вы можете видеть, что $tron выполняется в бесконечном цикле. Я не знаю, что вы на самом деле хотите сделать, но вам нужно поставить условие завершения в этом цикле.

[...] являются операторами для списков символов. Вероятно, вы захотите сделать grep '^\[1\]' .

Я думаю, этого должно быть достаточно, если вы избежите квадратных скобок: grep '^\[1\]'

Прежде всего, используйте параметр set -vx оболочки set -vx чтобы узнать, как / когда vars и т. Д. Оцениваются.

Извините, но почему у вас есть такая настройка кода, как

  run="..."? 

потому что позже вы будете использовать переменную $run ?

Если это так, то вам почти наверняка нужно сделать

 eval "$run" 

который открывает целую новую червь червей, избегая специальных символов. Как указывает другой комментатор, вам не нужно просто скрывать нужные символы, вам придется вдвойне избежать их. Когда я привык работать так, я мог бы \\\\\ с такими побегами, как \\\\\ (5!), Чтобы заставить все работать.

Без дальнейшего объяснения контекста для этого кода моя рекомендация состоит в том, чтобы исключить материал run= и просто запустить tail -n0 -f -s 0.01 $cmds |.... как есть.

Кроме того, за комментарий Gilles, и для усиления на нем, вся ваша линия трубопроводов не имеет большого смысла,

  tail -n0 -f -s 0.01 $cmds | (while true; do $tron .... 

$cmds Мы не знаем, что такое $cmds

B. Я ничего не вижу внутри суб-оболочки (while true; ...) которая считывает вывод хвоста cmd. Если вы говорите, что он передается в последующий tee после окончания while , то я узнал что-то новое.

C. Вы действительно хотите выполнить команду $ tron ​​так быстро, как можете, в бесконечном цикле? На многих системах это приведет к потреблению как минимум 1 процессорной емкости в полной емкости. Может быть, sleep 1 ?

Добавление большего контекста о том, что вы пытаетесь выполнить, поможет нам вам помочь! Удачи.