Ответ 1
Вы хотите:
grep -e "[0-9a-f]\{32\}" filename
Или, более того, на основе описания формата файла:
grep -e ":[0-9a-f]\{32\}" filename
Как я могу совместить хеши md5 с командой grep?
В php я использовал этот шаблон регулярного выражения в прошлом:
/^[0-9a-f]{32}$/i
Но я пробовал:
grep '/^[0-9a-f]{32}$/i' filename
grep '[0-9a-f]{32}$/' filename
grep '[0-9a-f]{32}' filename
И другие варианты, но я не получаю ничего как вывод, и я точно знаю, что файл содержит хеши md5.
Вы хотите:
grep -e "[0-9a-f]\{32\}" filename
Или, более того, на основе описания формата файла:
grep -e ":[0-9a-f]\{32\}" filename
Ну, учитывая формат вашего файла, первый вариант не будет работать, потому что вы пытаетесь сопоставить начало строки.
Учитывая следующее содержимое файла:
a1:52:d048015ed740ae1d9e6998021e2f8c97
b2:667:1012245bb91c01fa42a24a84cf0fb8f8
c3:42:
d4:999:85478c902b2da783517ac560db4d4622
Следующее должно работать, чтобы показать вам, какие строки имеют md5:
grep -E -i '[0-9a-f]{32}$' input.txt
a1:52:d048015ed740ae1d9e6998021e2f8c97
b2:667:1012245bb91c01fa42a24a84cf0fb8f8
d4:999:85478c902b2da783517ac560db4d4622
-E для расширенного поддержки регулярных выражений и -i для игнорирования ухода в шаблоне и входном файле.
Если вы хотите найти строки, которые не совпадают, попробуйте
grep -E -i -v '[0-9a-f]{32}$' input.txt
-v инвертирует совпадение, поэтому он показывает линии, у которых нет MD5.
Мех.
#!/bin/sh
while IFS=: read filename filesize hash
do
if [ -z "$hash" ]
then
echo "$filename"
fi
done < hashes.lst
Небольшой YOURFILE
работающий в кроссплатформенном режиме в Linux и OSX, возвращающий только хэш-значение MD5 (замените YOURFILE
на ваше имя файла):
[ "$(uname)" = "Darwin" ] && { MD5CMD=md5; } || { MD5CMD=md5sum; } \
&& { ${MD5CMD} YOURFILE | grep -o "[a-fA-F0-9]\{32\}"; }
Пример:
$ touch YOURFILE
$ [ "$(uname)" = "Darwin" ] && { MD5CMD=md5; } || { MD5CMD=md5sum; } && { ${MD5CMD} YOURFILE | grep -o "[a-fA-F0-9]\{32\}"; }
d41d8cd98f00b204e9800998ecf8427e