Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell脚本字符串操作_Bash_Shell_Epoch - Fatal编程技术网

Bash Shell脚本字符串操作

Bash Shell脚本字符串操作,bash,shell,epoch,Bash,Shell,Epoch,我试图用人类可读的时间戳替换字符串中的历元时间戳。我知道如何将历元转换为所需的时间格式(并且一直在手动转换),尽管我很难找到如何在字符串中替换它(通过脚本) 字符串是一个文件名,例如XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz(历元用粗体表示) 我一直在使用以下gawk代码转换时间戳: gawk“开始{打印strftime(“%Y%m%d.%k%m”,1296243507)}” 我通常不熟悉bash脚本。谁能给我一个正确的方向 谢谢。所有文件

我试图用人类可读的时间戳替换字符串中的历元时间戳。我知道如何将历元转换为所需的时间格式(并且一直在手动转换),尽管我很难找到如何在字符串中替换它(通过脚本)

字符串是一个文件名,例如XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz(历元用粗体表示)

我一直在使用以下gawk代码转换时间戳:

gawk“开始{打印strftime(“%Y%m%d.%k%m”,1296243507)}”

我通常不熟悉bash脚本。谁能给我一个正确的方向


谢谢。

所有文件名的格式都一样吗?具体来说,“.”+epoch+“.gz”

如果是这样,您可以使用许多不同的路由。这里有一个关于sed的例子:

$ echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/'
1296066338
这样可以提取历元,然后将其发送到您的gawk命令。比如:

#!/bin/bash

...
epoch=$( echo "XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz" | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )
然后使用您想要替换文件名中数字的任何方法。您可以再次通过sed发送它,但您不需要保存历元,而是希望保存文件名的其他部分

编辑: 为便于测量,请在我的机器上提供一个工作样本:

#!/bin/bash

filename="XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz"

epoch=$( echo ${filename} | sed 's/.*\.\([0-9]\+\)\.gz/\1/' )
readable_timestamp=$( gawk "BEGIN{print strftime(\"%Y%m%d.%k%M\",${epoch})}" )

new_filename=$( echo ${filename} | sed "s/\(.*\.\)[0-9]\+\(\.gz\)/\1${readable_timestamp}\2/" )

echo ${new_filename}
你可以用这个

date -d '@1296066338' +'%Y%m%d.%k%M'

如果您不想调用awk。

您可以使用Bash的字符串操作和awk的变量传递来避免对sed进行任何调用或进行任何引号转义

#!/bin/bash
file='XXXX-XXX-2011-01-25-3.6.2-record.pb.1296066338.gz'
base=${file%.*.*}     #    XXXX-XXX-2011-01-25-3.6.2-record.pb
epoch=${file#$base}   #    1296066338.gz
epoch=${epoch%.*}     #    1296066338
# we can extract the extension similarly, unless it's safe to assume it's ".gz"
humantime=$(gawk -v "epoch=$epoch" 'BEGIN{print strftime("%Y%m%d.%k%M",epoch)}')
newname=$base.$humantime.gz
echo "$newname"
结果:

XXXX-XXX-2011-01-25-3.6.2-record.pb.20110126.1225.gz

你做这件事的方式已经足够了。您可以使用BASH删除EPOCH.gz,然后添加所需的格式,但是gawk已经为您完成了这项工作。你有什么特别的原因想改变它吗?谢谢蒂姆。我的问题是我不知道如何在脚本中使用它;特别是重命名位(我糟糕的正则表达式技能也帮不上忙)。这听起来可能很傻,但我可以在Perl中以心跳的方式执行相同的操作,但在尝试将其转换为shell时却没有显示。在这里,我认为Perl应该是这两种语言中比较难的一种。Awk在我运行它的RH EL5服务器上很好,但是有一个替代品很好;特别是对于我在上面测试的盒子(Mac,sans-awk/gawk)