ls
уже выполняет тот поиск. Можно выполнить поиск информации о пользователе из командной строки с getent passwd
.
Если ls
показывает идентификатор пользователя вместо имени пользователя, это - потому что нет никакого пользователя тем именем. Файловые системы хранят идентификаторы пользователей, не имена пользователей. Если Вы монтируете файловую систему от другой системы, или если файл принадлежит теперь-удаленному-пользователю, или если Вы передали числовой идентификатор пользователя chown
, у Вас может быть файл, который принадлежит идентификатору пользователя, который не имеет имени.
На общем хосте у Вас может быть доступ к некоторым файлам, которые совместно использованы между несколькими виртуальными машинами, каждым с их пользовательской базой данных. Это немного странно (почему совместно используют файлы, но не пользователей, которые владеют ими?), но это технически возможно.
Попытайтесь использовать egrep
или передача -E
флаг к grep
:
echo "223255/12345678 " | egrep '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
или
echo "223255/12345678 " | grep -E '[0-9a-zA-Z/\-\?:\(\)\.,"\+]{1,34}'
возможно, выйдите /
символ....., что (\)
используемый для? Но Походит, так как Вы в одинарных кавычках, Вы не должны выходить из всего, что Вы помещаете там.
Мое предложение для отладки состоит в том, чтобы удалить некоторые символы и видеть что не так с шаблоном.
Существует несколько проблем с Вашим кодом:
[...]
, единственные специальные символы -
и ]
(хотя существует также [:
который представляет классы символов), и способ выйти из них не с \
, но для -
путем создания этого первым или последним знаком в списке ([-...]
или [...-]
) и для ]
путем создания этого первым ([]...]
). Выше, \-\
средства любой символ в диапазоне \
кому: \
, это - это, включает \
, но нет -
. Таким образом, Вам было бы нужно [-0-9a-zA-Z/?:().,"+]
.a-z
и A-Z
иждивенец локали (как, может включать вещи как é, ŝ...), и может также включать многобайтовые символы. Если Вы только хотите включать символы ASCII в те диапазоны, необходимо прикрепить локаль к C: ... | LC_ALL=C grep ...
{x,y}
оператор расширенного регулярного выражения (как поддерживается grep -E
). Соответствующее основное регулярное выражение (как поддерживается grep
) оператор \{x,y\}
. Так LC_ALL=C grep '[-0-9a-zA-Z/?:().,"+]\{1,34\}'
grep pattern
, grep
проверки, если pattern
соответствия где угодно в каждой строке входа. Если Вы хотите, чтобы это соответствовало целой строке, Вам нужно -x
опция (для точного) или привязка шаблон в запуске и конце с ^
и $
операторы regexp. grep -E 'x{1,34}'
совпадает с grep x
, потому что строка, которая содержит любую последовательность 1 - 34 x
также содержит тот x
и строка, которая содержит x
содержит последовательность 1 x
так соответствует x{1,34}
regexp.echo "$var" | grep the-pattern
, остерегайтесь этого, это не надежно, потому что некоторые echo
например, повернулся бы -neen
в пустую строку, в то время как другие повернулись бы \n
в символ новой строки, например. Также отметьте это grep
соответствия на каждой строке входа, не на целом входе, таким образом, Ваша проверка не могла бы быть допустимой если $var
может содержать символы новой строки. Лучше всего должен был бы использовать expr
вместо этого или [[ $var =~ pattern ]]
оператор ksh93, zsh или удара.Таким образом, если Вы хотите проверить это $var
сделан из 1 - 34 из тех символов ASCII, необходимо записать это:
if LC_ALL=C expr "x$var" : 'x[-0-9a-zA-Z/?:().,"+]\{1,34\}$' > /dev/null; then
echo yes
else
echo no
fi
(expr
привязывает шаблон к запуску неявно, как будто был a ^
оператор regexp)
x@
,\\
, возможноé
и нет-
– Stéphane Chazelas 26.03.2013, 23:17