regex-sed-sql数据库哈希:盐提取
我正在查看一个原始的sql数据库,其中包含电子邮件、用户名、散列密码、SALT和IP地址。我试着只提取大麻和盐。下面是一个例子:regex-sed-sql数据库哈希:盐提取,regex,database,bash,sed,command-line,Regex,Database,Bash,Sed,Command Line,我正在查看一个原始的sql数据库,其中包含电子邮件、用户名、散列密码、SALT和IP地址。我试着只提取大麻和盐。下面是一个例子: user@email.com:username:b30805e05c07782d3901bf8814c8cb9d:2WPe'KKYUti3ts2E>$np,:11.22.33.44 user2@email.com:username2:969b9be2f311ac32b7f5c475b115fae6:<t%a!>[4?:OqGHvYWYdZ0:44.3
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@`
这可能适用于GNU sed:
sed -r 's/^([^:]*:){2}([^:]*):(.*):.*$/\2 \3/' file
您知道,前三个字段和第五个字段尊重字段分隔符,但第四个字段不尊重。删除前两个字段,保留第三个字段,并使用greed标识第四个字段,即…*:将返回以结尾的最大字符串: 我升级了@poton的sed,这只是一个命令。
更复杂的是awk和切割:
因此,您知道salt位于最后一个:和第二个:,hash位于第一个:和第二个:-之间。基于此,您可以应用lookaheads和lookbehinds来构造一个regexp来获取它。如果需要,许多工具如regexpal.com都会派上用场。
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@`
sed -r 's/^([^:]*:){2}([^:]*):(.*):.*$/\2 \3/' file
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)