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

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

Вот несколько способов:


С помощью awk получить _ или . разделенное второе последнее поле:

awk -F '[_.]' '{print $(NF-1)}' file.txt

grep с PCRE (-P):

grep -Po '\d+(?=[^_]*$)' file.txt
  • -o получает только совпадающую часть

  • \d+ совпадает одна или несколько цифр

  • Положительный заголовок нулевой ширины, (? =[^_]*$), гарантирует, что ни один _ не следует до конца строки


С sed:

sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
  • . *_ соответствует всему до последнего _

  • ([[:цифра:]]+) соответствует нужным цифрам и помещается в захваченную группу

  • . * соответствует остальным

  • При замене используется только захваченная группа, \1


С perl, логика та же, что и с sed:

perl -pe 's/.*_(\d+).*/$1/' file.txt 

Если вы должны использовать cut, сделайте это в два шага, сначала получите _ разделенное 4-е поле, а затем получите разделенное 1-е поле:

cut -d_ -f4 file.txt | cut -d. -f1

Это не рекомендуется, так как требует жесткого кодирования номеров полей.


Если бы это была строка, я бы сделал это с помощью расширения параметров оболочки:

% str='1.raw_bank_details_211.trg'

% str=${str##*_} 

% echo "${str%%.*}"
211

Вы можете использовать конструкцию while и брать каждую строку в переменную и делать это, но это будет медленно для большого файла. Также в качестве альтернативы можно использовать _. в качестве IFS и получить вместо этого жестко закодированное поле (например, cut), если хотите.


Пример:

% cat file.txt                          
1.raw_bank_details_211.trg
2.raw_bank_details_222.trg

% awk -F '[_.]' '{print $(NF-1)}' file.txt
211
222

% grep -Po '\d+(?=[^_]*$)' file.txt         
211
222

% sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
211
222

% perl -pe 's/.*_(\d+).*/$1/' file.txt 
211
222

% cut -d_ -f4 file.txt | cut -d. -f1
211
222
1
01.09.2017, 02:41
1 ответ

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

Если вы хотите немедленно применить членство в группе, снова войдите в систему, например, с помощью ssh localhost. Это не работает для уже запущенных программ.

0
28.01.2020, 00:49

Теги

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