Это достаточно известное и задокументированное поведение. Если у вас есть разные пользователи на стороне сервера и на стороне клиента, которые используют одни и те же uid
, файлы будут отображаться как имеющие разных владельцев.
Помимо общих файлов, рекомендуется позаботиться о сопоставлении пользователей с одним и тем же идентификатором на всех машинах, использующих одни и те же файловые системы.
Можно сделать это вручную, какой-нибудь минимальной системой автоматизации/сценариев, а еще лучше, или настроить централизованную аутентификацию, например, с помощью LDAP. см. Централизованная аутентификация с использованием OpenLDAP
Это должно делать то, что вы хотите:
$ var=$(( $(grep -m1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
$ echo $var
14
grep -m1 -n 'Firmware state: Rebuild'
:это будет искать первую(-m 1
)строку, соответствующую Firmware state: Rebuild
, и печатать эту строку, включая ее номер строки(-n
):
$ grep -m1 -n 'Firmware state: Rebuild' file
15:Firmware state: Rebuild
cut -d: -f1
:вывод grep
выше затем передается по конвейеру через этот cut
, который принимает :
в качестве разделителя полей и печатает первое поле, номер строки.*var=$(( $(command) -1 ))
:Конструкция $(( ))
позволяет выполнять математические операции. Например:
$ echo $((10-2))
8
Конструкция $(command)
позволяет нам использовать вывод команды, как если бы это была переменная. Итак, $(( $(command) -1 ))
напечатает результат вычитания 1 из вывода command
. Поскольку command
здесь — это grep | cut
выше, чьим выводом является номер строки (15
), это сохранит номер строки минус один как $var
.
Обратите внимание, что приведенное выше решение также будет соответствовать строке типа Firmware state: Rebuild again
или любой другой строке, содержащей Firmware state: Rebuild
в качестве подстроки.Если вам нужно убедиться, что он совпадает только тогда, когда вся строка не содержит ничего, кроме Firmware state: Rebuild
, используйте вместо этого:
var=$(( $(grep -xm1 -n 'Firmware state: Rebuild' file | cut -d: -f1) -1 ))
Сawk
:
$ var=$(awk '$0=="Firmware state: Rebuild"{print --NR; exit}' file)
$ echo "$var"
14
Сценарий awk
печатает номер входной записи минус 1, когда текущая строка равна Firmware state: Rebuild
, и завершает работу сценария. Результат подстановки команды $(...)
затем присваивается переменной var
.