管道命令中的卷曲和xargs

时间:2017-08-13 09:55:45

标签: bash awk

我想处理一个旧数据库,其中密码是纯文本(以逗号分隔; 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

1 个答案:

答案 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>&lt;your_docuwiki_root&gt;/conf/users.auth.php</tt>

这可能不是你所期望的。

sed -e 's/tt//g' |
sed -e 's/<[^>]*>//g'

将删除html标签,但

sed 's/<tt>//;s/<.tt>//'

也会这样做。

所以我说错了awkxargs太多了。