Meredith
Meredith

Reputation: 940

Using grep to match md5 hashes

How can I match md5 hashes with the grep command?

In php I used this regular expression pattern in the past:

/^[0-9a-f]{32}$/i

But I tried:

grep '/^[0-9a-f]{32}$/i' filename
grep '[0-9a-f]{32}$/' filename
grep '[0-9a-f]{32}' filename

And other variants, but I am not getting anything as output, and i know for sure the file contains md5 hashes.

Upvotes: 13

Views: 24489

Answers (4)

derFunk
derFunk

Reputation: 1630

A little one-liner which works cross platform on Linux and OSX, only returning the MD5 hash value (replace YOURFILE with your filename):

[ "$(uname)" = "Darwin" ] && { MD5CMD=md5; } || { MD5CMD=md5sum; } \
    && { ${MD5CMD} YOURFILE | grep -o "[a-fA-F0-9]\{32\}"; }

Example:

$ touch YOURFILE
$ [ "$(uname)" = "Darwin" ] && { MD5CMD=md5; } || { MD5CMD=md5sum; } && { ${MD5CMD} YOURFILE | grep -o "[a-fA-F0-9]\{32\}"; }
d41d8cd98f00b204e9800998ecf8427e

Upvotes: 0

Glenn McAllister
Glenn McAllister

Reputation: 1823

Well, given the format of your file, the first variant won't work because you are trying to match the beginning of the line.

Given the following file contents:

a1:52:d048015ed740ae1d9e6998021e2f8c97
b2:667:1012245bb91c01fa42a24a84cf0fb8f8
c3:42:
d4:999:85478c902b2da783517ac560db4d4622

The following should work to show you which lines have the md5:

grep -E -i '[0-9a-f]{32}$' input.txt

a1:52:d048015ed740ae1d9e6998021e2f8c97
b2:667:1012245bb91c01fa42a24a84cf0fb8f8
d4:999:85478c902b2da783517ac560db4d4622

-E for extended regular expression support, and -i for ignore care in the pattern and the input file.

If you want to find the lines that don't match, try

grep -E -i -v '[0-9a-f]{32}$' input.txt

The -v inverts the match, so it shows you the lines that don't have an MD5.

Upvotes: 3

martona
martona

Reputation: 5914

You want this:

grep -e "[0-9a-f]\{32\}" filename

Or more like, based on your file format description, this:

grep -e ":[0-9a-f]\{32\}" filename

Upvotes: 15

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798636

Meh.

#!/bin/sh
while IFS=: read filename filesize hash
do
  if [ -z "$hash" ]
  then
    echo "$filename"
  fi
done < hashes.lst

Upvotes: 0

Related Questions