我想处理一个旧数据库,其中密码是纯文本(以逗号分隔; passwd是csv文件中已导出数据库的第5个字段)以加密它们以供dokuwiki进一步使用。这是我的bash命令(grep和sed用于从curl输出中提取加密的passwd):
cat users.csv | awk 'FS="," { print $4 }' | xargs -l bash -c 'curl -s --data-binary "pass1=$0&pass2=$0" "https://sprhost.com/tools/SMD5.php" -o - ' | xargs | grep -o '<tt.*tt>' | sed -e 's/tt//g' | sed -e 's/<[^>]*>//g'
我从xargs
收到以下评论xargs:无与伦比的单引号;默认情况下,引号对于xargs是特殊的,除非您使用-0选项
只处理文件的第一行,然后没有任何附加内容。
使用-0选项,并使用引号,不解决任何问题。在命令行中我哪里错了?可能是一个更高级的语言将更充分地做到这一点。
感谢帮助,LM
答案 0 :(得分:1)
一般情况下,如果你有这么长的命令管道,最好在出现问题时拆分它们。穿过你的烟斗:
cat users.csv |
那里没什么意外的。
awk 'FS="," { print $4 }' |
你可能想做awk 'BEGIN {FS=","} { print $4 }'
。尝试管道中的前两个命令,看看它们是否产生了正确的答案。
xargs -l bash -c 'curl -s --data-binary "pass1=$0&pass2=$0" "https://sprhost.com/tools/SMD5.php" -o - ' |
没有错,尽管可能有更好的方法来进行MD5哈希。
xargs |
这个xargs在管道中做了什么?它应该删除。
grep -o '<tt.*tt>' |
请注意,这将产生两行:
<tt>$1$17ab075e$0VQMuM3cr5CtElvMxrPcE0</tt>
<tt><your_docuwiki_root>/conf/users.auth.php</tt>
这可能不是你所期望的。
sed -e 's/tt//g' |
sed -e 's/<[^>]*>//g'
将删除html标签,但
sed 's/<tt>//;s/<.tt>//'
也会这样做。
所以我说错了awk
和xargs
太多了。