Вы правы. Его значение выражено в днях.
Из справочной страницы usermod (8)
:
-e, --expiredate EXPIRE_DATE
Дата, когда учетная запись пользователя будет отключена. Дата указывается в формате ГГГГ-ММ-ДД .
Но есть дополнительная информация на странице руководства shadow (5)
:
срок действия учетной записи
Дата истечения срока действия учетной записи, выраженная как количество дней с момента 1 января 1970 г. .
Обратите внимание, что истечение срока действия учетной записи отличается от истечения срока действия пароля. В случае истечения срока действия учетной записи пользователю не будет разрешено войти в систему. В случае истечения срока действия пароля пользователю не разрешается войти в систему, используя свой пароль.
Пустое поле означает, что срок действия учетной записи никогда не истечет.
Значение 0 не следует использовать, так как оно интерпретируется как учетная запись без истечения срока действия или как истекающая 1 января 1970 года.
Вы можете подтвердить это чтение в usermod.c
исходный код :
case 'e':
if ('\0' != *optarg) {
user_newexpire = strtoday (optarg);
Не уверен, насколько сложным может быть ваш файл, но для приведенного примера это работает.
$ awk '/^<[a-z]/{print;delete z}!/^</{z[$0]=1}/^<\//{for(x in z){print x}print}' file1
<tag2>
a
b
c
</tag2>
<tag2>
x
y
z
</tag2>
$
Версия с комментариями
awk '/^<[a-z]/ { # If start tag
print # Print line
delete z # Clear array
} !/^</ { # If not a tag
z[$0]=1 # Store line
} /^<\// { # If end tag
for(x in z) { # For each array entry
print x # Print array entry
}
print # Print end tag
}' file1
Решение XSLT 2.0:
<xsl:template match="tag2">
<tag2>
<xsl:value-of select="distinct-values(tokenize(., '
'))"/>
</tag2>
</xsl:template>