Спасибо за помощь, ilkkachu, я постараюсь больше использовать функцию, чтобы получить более чистый код.
Наконец-то я поместил свою переменную в статус функции.:
status() {
local POSTGRES_STATUS=$(ssh -t root@myhost "ps -f -u process|grep postgres|grep -v UID")
echo -e "\n"
echo -e "$POSTGRES_STATUS"
Это позволит достичь желаемого эффекта:
awk -i inplace '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab
Это немного более конкретно, чем то, что вы просили — ,noatime
будет добавлено к четвертому полю, если это поле еще не содержит noatime
, оно не смотрит на целая линия.
-i inplace
специфичен для Gawk -; если не поддерживается, записать результат в новый файл:
awk '$2 == "/" && !($4 ~ /noatime/) { sub(/[[:space:]]*([^[:space:]]+[[:space:]]+){3}[^[:space:]]+/,"&,noatime") }1' /etc/fstab > /etc/fstab.new && mv /etc/fstab{.new,}
В обоих случаях я предполагаю, что сценарии установки вашего сервера выполняются от имени пользователя root.
(Спасибо Эду Мортону за надежную замену текста, позволяющую избежать проблем с потенциальными регулярными выражениями в четвертом поле при использовании sub
!)
Вы можете сделать это, если GNU sed работает в расширенном режиме регулярных выражений (-E ). Он будет смотреть на строки, второе поле которых представляет собой одинокую косую черту '/' И четвертое поле еще не содержит целого слова 'noatime', тогда оно должно добавляться к четвертому слову.
sed -E -e '
\:^\s*\S+\s+/\s:!b
s/\S+/\n&\n/4
/\n(.*,)?noatime(,.*)?\n/!s/\n/,noatime/2
s/\n//g
' /etc/fstab