Команда SED не работает, когда восклицательный знак включен в регулярное выражение - PullRequest
1 голос
/ 16 мая 2019

У меня есть эта задача, где я должен извлечь имена пользователей и хешированные пароли из / etc / shadow, но у меня возникла проблема при замене потока командой sed.

Я пробовал эту команду:

sed '/s/*/NoPassword/; s/!/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

Работает нормально, когда нужно заменить "!" с LockedPasswords, но у некоторых пользователей есть "!!" в поле, а не "!", поэтому я пробовал другие команды.

Они не дают никакого результата, поля пароля, содержащие один или несколько вопросительных знаков, остаются прежними

sed '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

sed '/s/*/NoPassword/; s/!{1,2}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

В чем проблема? Я только начинающий для Linux и регулярных выражений.

Ответы [ 3 ]

4 голосов
/ 16 мая 2019

Вам никогда не понадобится sed, когда вы используете awk.Вся ваша командная строка может быть просто:

awk -F':' '{sub(/\*/,"NoPassword"); sub(/!+/,"LockedPassword"); print $1, $2}' /etc/shadow > passwords.txt
1 голос
/ 16 мая 2019

Обе + и { } должны быть экранированы в Sed.Итак, обе ваши попытки должны сработать после исправления:

sed '/s/*/NoPassword/; s/!\+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt

sed '/s/*/NoPassword/; s/!\{1,2\}/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
0 голосов
/ 16 мая 2019

Используйте флаг -E:

sed -E '/s/*/NoPassword/; s/!+/LockedPassword/' /etc/shadow | awk -F: '{ print $1" "$2 }' > passwords.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...