regex sed sql database hash:salt extraction



我正在查看一个原始sql数据库,其中包含电子邮件,用户名,散列密码,盐和IP地址。我试图只提取哈希和盐。下面是一个示例:

user@email.com:username:b30805e05c07782d3901bf8814c8cb9d:2WPe'KKYUti3ts2E>$np,:11.22.33.44
user2@email.com:username2:969b9be2f311ac32b7f5c475b115fae6:<t%a!>[4?:OqGHvYWYdZ0:44.33.22.11
user3@email.com:username3:550854338c55ef110fdc599806f087e6:;yzkeZ/FgCMqM:8&Z!S0r:12.34.56.78
user4@email.com:username4:a5477d971ff85fd4052cd745677e6751:&PmDLnlh{fW[&KULDpYz@:87.65.43.21

我想过在冒号(:(处分隔每个部分,并删除最后一个冒号出现的右侧的所有内容,但有一个冒号是盐的一半。因此,一行中的冒号数量并不一致。我完全被难住了。有人请帮忙。

这可能对你有用(GNU sed(:

sed -r 's/^([^:]*:){2}([^:]*):(.*):.*$/2 3/' file

您知道前三个字段和第五个字段尊重字段分隔符,但第四个字段不尊重字段分隔符。 删除前两个字段,保留第三个字段并使用贪婪来识别第四个字段,即(.*):将返回以:结尾的最大字符串。

下面的正则表达式应该可以帮助您:

^(?:.*?):(?:.*?):(.*?):(.*):.*$

^(?:(?:.*?):){2}(.*?):(.*):.*$

演示:https://regex101.com/r/03wuCu/1

测试:

user@email.com:username:b30805e05c07782d3901bf8814c8cb9d:2WPe'KKYUti3ts2E>$np,:11.22.33.44
user2@email.com:username2:969b9be2f311ac32b7f5c475b115fae6:<t%a!>[4?:OqGHvYWYdZ0:44.33.22.11
user3@email.com:username3:550854338c55ef110fdc599806f087e6:;yzkeZ/FgCMqM:8&Z!S0r:12.34.56.78
user4@email.com:username4:a5477d971ff85fd4052cd745677e6751:&PmDLnlh{fW[&KULDpYz@:87.65.43.21

输出:

Match 1
Group 1.    24-56   `b30805e05c07782d3901bf8814c8cb9d`
Group 2.    57-78   `2WPe'KKYUti3ts2E>$np,`
Match 2
Group 1.    117-149 `969b9be2f311ac32b7f5c475b115fae6`
Group 2.    150-171 `<t%a!>[4?:OqGHvYWYdZ0`
Match 3
Group 1.    210-242 `550854338c55ef110fdc599806f087e6`
Group 2.    243-264 `;yzkeZ/FgCMqM:8&Z!S0r`
Match 4
Group 1.    303-335 `a5477d971ff85fd4052cd745677e6751`
Group 2.    336-357 `&PmDLnlh{fW[&KULDpYz@`

我提高了@potong的sed,这只是一个命令。
更复杂的是awkcut

awk -F: '{printf("%s %s", $3, $4); for (i=5;i<NF;i++) printf(":%s",$i); print ""}' file
cut -d: -f3- <(rev file|cut -d: -f2- |rev)

最新更新