Использование команды grep с массивом слов

User=someuserв системной службе определяет системную службу, которая не запускается от имени пользователя root. Системная служба будет работать независимо от входа пользователя в систему; он будет продолжать работать, даже если никто не войдет в систему. Запуск служб на выделенных учетных записях служб, когда это возможно, является хорошей защитой, но иногда службы должны запускаться с правами root и переходить на учетную запись службы самостоятельно, возможно, после выполнения некоторых начальных операций, которые традиционно требуют доступа с правами root, например открытие порта TCP или UDP. с номером порта ниже 1024.

--userсервисы запускаются для зарегистрированных -пользователей. По умолчанию предполагается, что все пользовательские службы останавливаются, когда пользователь, которому они принадлежат, выходит из своего последнего оставшегося сеанса в системе; однако системный администратор может разрешить пользовательские процессы оставаться после выхода из системы. В некоторых дистрибутивах это даже разрешено по умолчанию, потому что системы Unix/Linux исторически не были строгими в отношении пользовательских процессов во время выхода из журнала -, и пользователи могут ожидать, что они могут оставить фоновые процессы запущенными при выходе из системы. не делая ничегоsystemd-конкретного.

(С другой стороны, администраторам многопользовательских -систем традиционно приходилось внедрять различные решения для очистки -старых пользовательских процессов, т.е. когда пользователь ноутбука на самом деле не выходит из системы, а просто закрывает крышку ноутбука и уходит со своим ноутбуком. systemdпозволяет при необходимости точно нацелить процессы каждого сеанса на завершение,но в результате системный администратор должен будет принять политическое решение о том, нужна ли и когда требуется автоматическая очистка сеанса -.)

Если один и тот же пользователь входит в несколько сеансов одновременно, у него будет запущена только одна копия их --userслужб. Таким образом, службы --userна самом деле не связаны с каким-либо конкретным сеансом пользователя, а только с самим пользователем.

Я думаю, что наличие службы --user, работающей от кого-то другого, кроме вошедшего в систему -пользователя, сеансу которого она принадлежит, было бы полезно только в очень ограниченных случаях. Если доступ к службе должен быть ограничен только какой-либо общей учетной записью, то я думаю, что обычно лучше сделать ее системной службой, чтобы была возможность поделиться доступом для администрирования службы (и, следовательно, для администрирования. ответственность )перед другими, имеющими доступ к общей учетной записи, если это необходимо.

1
10.09.2020, 16:32
2 ответа

Во-первых, вы можете просто использовать сам файл. Это намного проще, чем пытаться использовать массив оболочки :

.
grep -f file1.txt file2.txt

Это напечатает любые строки из file2.txt, которые соответствуют любым строкам в file1.txt.

Если вы по какой-то причине должны использовать массив, все становится сложнее. Вы не можете просто сделать grep "${array[*]}" Textfile, потому что "${array[*]}"расширится до списка элементов в массиве, разделенных пробелом:

$ array=("foo" "bar" "baz")
$ echo "${array[*]}"
foo bar baz

Это означает, что ваша grepкоманда станет:

grep 'foo bar baz' file

И это означает "grep для foo bar bazв файле file". Что вы хотите сделать, так это найти foo, или bar, илиbaz. Это можно сделать с помощью опции -E в grepи объединения паттернов, которые вы хотите найти, с помощью |:

.
grep -E 'foo|bar|baz' file

Для этого вам нужно будет сделать что-то сложное, например:

grep -E "$(printf '%s|' "${array[@]}" | sed 's/|$//')" file

Или, может быть,:

grep -E "$(export IFS="|"; echo "${array[*]}")" file

В целом, просто лучше, быстрее и проще использовать файл и забыть о массиве.

4
18.03.2021, 23:05
grep "${array[*]}" Textfile

Будет работать до тех пор, пока вы установите IFSна новую строку (или что-то, что начинается с новой строки ), и используйте --или -e, чтобы убедиться, что это все еще работает, даже если первый элемент начинается с -.

"${array[*]}"в оболочках Korn -, подобно "$*"в оболочках POSIX, расширяется до списка элементов, объединенных первым символом $IFS. Значение по умолчанию для $IFSравно<SPC><TAB><NL>(<SPC><TAB><NL><NUL>в zsh), поэтому по умолчанию вы получите элемент, объединенный символами SPC. Для grepвам нужно, чтобы разные регулярные выражения были разделены новой строкой, чтобы grepзацикливалось для каждого из них по очереди.

IFS=$'\n'
grep -e "${array[*]}" file

В zshвыполнениеgrep -e "${(pj:\n:)array}" file(явного jперехода с новой строки вместо изменения $IFSглобального )илиgrep -e$^array file(расширения массива в стиле fish/ rc-, где становится grep -efirst -esecond file, что является еще одним способом предоставления нескольких шаблонов для grep), который был бы чище.

Другой вариант — сделать:

printf '%s\n' "${array[@]}" | grep -f - file

На этот раз список шаблонов с разделителями -передаётся через стандартный ввод grep, а не через аргумент.

Эти подходы будут работать независимо от того, являются ли шаблоны фиксированными строками (с -F), расширенными регулярными выражениями (с-E)или базовыми регулярными выражениями (по умолчанию ).

Вы можете убедиться, что список паттернов не пуст:

(( ${#array[@]} > 0 )) && grep...

Вызов grepс пустым шаблоном дает разные результаты в зависимости от реализации grepи, как правило, не то, что вы хотите.

0
18.03.2021, 23:05

Теги

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