微型实用程序解码base64编码的文件名

时间:2014-05-15 01:01:01

标签: bash awk scripting base64 text-parsing

为了方便和快速调试我的R代码,我决定创建一个小的AWK脚本。它所要做的就是解码特定目录中所有base64编码的文件名(.RData)。我尝试过两次尝试。以下是我到目前为止的结果。任何帮助将不胜感激!

第一次尝试AWK命令中的shell脚本嵌入

ls -1 ../cache/SourceForge | awk 'BEGIN {FS="."; print ""} {printf("%s", $1); printf("%s", " -> "); print $1 | "base64 -d -"; print ""} END {print ""}'

结果输出 关闭到所需的位置,然而,这个单行打印不是在原始编码的同一行上打印每个解码的文件名处理结束时所有已解码的名称完全没有输出分隔符:

cHJqTGljZW5zZQ== ->
cHViUm9hZG1hcA== ->
dG90YWxEZXZz ->
dG90YWxQcm9qZWN0cw== ->
QWxsUHJvamVjdHM= ->
Y29udHJpYlBlb3BsZQ== ->
Y29udHJpYlByb2Nlc3M= ->
ZG1Qcm9jZXNz ->
ZGV2TGlua3M= ->
ZGV2U3VwcG9ydA== ->

prjLicensepubRoadmaptotalDevstotalProjectsAllProjectscontribPeoplecontribProcessdmProcessdevLinksdevSupport

第二次尝试是以下自包含 AWK脚本:

#!/usr/bin/gawk -f

BEGIN {FS="."; print ""; files = "ls -1 ../cache/SourceForge"}
{
  decode = "base64 -d -";
  printf("%s", $1); printf("%s", " -> "); print $1 | decode; print ""
}
END {print ""}

但是,此脚本的行为 令人惊讶,首先,它等待输入,其次,收到EOFCtrl-D }),不产生任何输出。

3 个答案:

答案 0 :(得分:4)

主要是bash解决方案:

for f in ../cache/SourceForge/*; do
  base=$(basename $f .RData)
  echo "$base => $(base64 -d <<<$base)"
done

或者,使用更多bash:

for f in ../cache/SourceForge/*; do
  f=${f##*/}; f=${f%%.*}
  echo "$f => $(base64 -d <<<$f)"
done

在这两种情况下,您都可以使用../cache/SourceForge/*.RData更具体地说明您想要的文件名。在第二个中,使用f=${f%.*}将导致仅删除一个扩展名。或f=${f%.RData}只会删除.RData扩展名。但它在特定应用中可能没什么区别。

答案 1 :(得分:2)

你需要关闭你在每行之间写入的过程,或者awk将所有打印的行发送到同一个进程(并且它只在我猜完时打印输出)。将close("base64 -d -")添加到该操作块的末尾(相同的命令字符串)。例如:

ls | awk -F. '{ printf("%25s -> ", $1); print $1 | "base64 -d -"; close("base64 -d -"); print "" }'

您的第二个代码段未运行ls命令。它只是将它分配给一个变量并且不做任何事情。您需要将输出从ls传输到awk -f <yourscript>./your-script.awk或类似,以使其正常工作。 (顺便说一下,这就是为什么它等你输入的原因,你没有给它任何。)

要从awk实际运行ls,您需要使用getline

awk 'BEGIN {while ( ("ls -1" | getline) > 0 ) {print}}'

这样的东西

答案 2 :(得分:2)

while read
do
  base64 -d <<< $REPLY
  echo
done < infile.txt

结果

prjLicense
pubRoadmap
totalDevs
totalProjects
AllProjects
contribPeople
contribProcess
dmProcess
devLinks
devSupport