Linux 以人类可读的格式转换Unix时间戳
我有下面的脚本Linux 以人类可读的格式转换Unix时间戳,linux,shell,unix,awk,unix-timestamp,Linux,Shell,Unix,Awk,Unix Timestamp,我有下面的脚本 size=$1 big_files_list=$(find . -name \*.bytes -type f -printf "%b %h/%f\n" | awk -v size="$size" ' function basename(file) {
size=$1
big_files_list=$(find . -name \*.bytes -type f -printf "%b %h/%f\n" |
awk -v size="$size" '
function basename(file) {
sub(".bytes$", ".properties", file)
return file
}
{if ($1 > size) {
print basename($2) }}')
for i in ${big_files_list}; do
echo "\t"
grep -E 'size|repo-name|creationTime|ob-name|sha' $i | tr "\n" ","
done
哪个打印低于输出
size=992198
repo-name=testupload
creationTime=1603278566981
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=1603278566981
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=1603278566981
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=1603278566981
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
哪个grep并从文件中打印日期,creationTime在unix时间戳中,我知道我们可以使用date-d@1603278566981
要将其转换为可读但记录有很多数字
我们可以在最终输出之前将其转换为任何方式。所以最终输出应该如下所示
size=992198
repo-name=testupload
creationTime=Sun Nov 16 22:29:41 CET 52775
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=Sun Nov 16 22:29:41 CET 52775
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=Sun Nov 16 22:29:41 CET 52775
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
size=992198
repo-name=testupload
creationTime=Sun Nov 16 22:29:41 CET 52775
ob-name=cargotracker-master.zip
sha1=ca8bb4e3ddb802a228e945a8fe32c308b2e3d555
请帮忙
武士
编辑:以上代码的格式更适合可读性:
size=$1
big_files_list=$(
find . -name \*.bytes -type f -printf "%b %h/%f\n" |
awk -v size="$size" '
function basename(file) {
sub(".bytes$", ".properties", file)
return file
}
{
if ($1 > size) {
print basename($2)
}
}
'
)
for i in ${big_files_list}; do
echo "\t"
grep -E 'size|repo-name|creationTime|ob-name|sha' $i | tr "\n" ","
done
使用GNU awk进行以下操作如何:
awk '/size|repo-name|creationTime|ob-name|sha/ {
print
}
/creationTime/ {
split($0,map,"-");
dat=(map[2]/10000000)-11644473600;
print "creationTime="strftime("%c",dat)
} $(find <fulldirectorypath> -name "*.bytes" -size="+$size" -type f -printf "%h/%f\n" | awk '{ split($0,map,".");print map[1]".properties" }')
awk'/size |回购名称| creationTime | ob名称| sha/{
打印
}
/creationTime/{
拆分($0,map,“-”);
dat=(map[2]/10000000)-116444473600;
打印“creationTime=”strftime(“%c”,dat)
}$(find-name“*.bytes”-size=“+$size”-键入f-printf”%h/%f\n“| awk'{split($0,map,“.”);print map[1]”.properties“}”)
首先,让find使用-size参数进行大小处理,并将输出传递到awk,以将扩展名从字节更改为属性。然后用awk处理这些文件。对于除creationTime之外的所有条目,只需打印行即可。对于创建时间,请处理unix时间戳并以区域设置形式打印
这还没有经过测试,所以可能有错误。这些记录来自52775年?!?:)我认为您的
date
调用误解了这些时间戳的单位。@Samurai您的代码在空格方面的格式设置伤害而不是帮助可读性,因此我在问题的底部发布了格式更好的代码,以便您可以看到差异,并可能在将来的代码中采用类似的样式。为什么不呢处理从find到awk找到的所有文件,打印相关数据。您还可以使用awk的strftime函数来处理unix时间戳。从1970-01-01纪元开始,时间戳显然是毫秒,而不是unix标准的秒。Java使用毫秒样式。除以1000——awk可以轻松完成@RamanSailopalI在awk'BEGIN{FS=OFS=“”}{$3=strftime(“%c”,$3)}{print}下面尝试的事情'输出文件并能够转换时间戳大小回购名称Thu 01 Jan 1970 01:00 AM CET ob name sha1 992198 testupload Sun 16 Nov 52775 10:29:41 PM CET cargotracker-master.zip CA8BB4E3E3DDB802A228E945A8FE32C308B2E3D555 992198 testupload Sun 16 Nov 52775 10:29:41 PM CET cargotracker-master.zip ca8bb4e3ddb802a228e945a8fe32c308b2e3d555但我我想我需要修剪最后三位数字以获得准确的时间以及我如何跳过第一行你能指导我如何做到这一点$3=substr($3,length($3)-3)如果解决方案满足您的需要,请花时间接受它作为答案