gpt4 book ai didi

linux - 如何在运行时在 linux 中的文件中附加字段名称

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:00:38 27 4
gpt4 key购买 nike

我想做这样的事情:

我有一个脚本:

latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}')
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate" > "$EC2_HOME/Working/SnapshotsLatest_$today_date"

此代码将 ec2-describe-snapshots 命令的内容写入文件中。文件内容为

SNAPSHOT    snap-1062e  vol-aef8    completed   2013-12-12T05:38:28+0000    100%    109030037527    20  2013-12-12: Daily Backup for i-39 (VolID:vol-aef8 InstID:i-3e2)
SNAPSHOT snap-1c422 vol-f66a0 completed 2013-12-12T05:38:27+0000 100% 109030037527 10 2013-12-12: Daily Backup for i-211 (VolID:vol-9a0 InstID:i-211)

我想在运行时向文件添加标题,例如格式正确的字段名称快照、快照 ID、卷 ID 等。我怎样才能做到这一点?

@janos 回答后的输出:

Label       SnapshotID  VolID       Status      Date                                              
SNAPSHOT snap-626fee5cvol-aecbbcf8completed 2013-12-13T04:53:18+0000 100% 109030037527 20 2013-12-13: Daily Backup for Jst with i-3d09 (Vol ID:vol-af8 Inst ID:i-3e209)
SNAPSHOT snap-686fee56vol-f66409a0completed 2013-12-13T04:53:16+0000 100% 109030037527 10 2013-12-13: Daily Backup for_Test_Machine with i-26011 (Vol ID:vol-f66a0 Inst ID:i-260111)

谢谢

最佳答案

假设你想得到这样的输出:

Label     SnapshotID  VolID      Status     Date
SNAPSHOT snap-1062e vol-aef8 completed 2013-12-12T05:38:28+0000 100% 109030037527 20
SNAPSHOT snap-1c422 vol-f66a0 completed 2013-12-12T05:38:27+0000 100% 109030037527 10

您可以使用 printf 将标题列格式化为适当数量的空格,如下所示:

printf "%-12s%-12s%-12s%-12s%-28s%-8s\n" Label SnapshotID VolID Status Date

例如格式化占位符 %-12s 表示:格式化为 12 个字符宽的字符串,左对齐。

您可以使用这样的标题创建您的文件,然后是快照列表,方法是首先使用 > 重定向标题行,然后使用 >> 重定向快照列表以附加到同一个文件:

out="$EC2_HOME/Working/SnapshotsLatest_$today_date"
printf "%-12s%-12s%-12s%-12s%-28s%-8s\n" Label SnapshotID VolID Status Date > "$out"
latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}')
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate" >> "$out"

但更好的做法是将所有打印放在一个 block 中,并在一次快速移动中重定向整个内容:

latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}')
out="$EC2_HOME/Working/SnapshotsLatest_$today_date"
{
printf "%-12s%-12s%-12s%-12s%-28s%-8s\n" Label SnapshotID VolID Status Date
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate"
} > "$out"

好的,我明白了。 ec2-describe-snapshots 输出中的列由制表符分隔。您可以打印标题,其中标签由这样的制表符分隔:

printf "Label\tSnapshotID\tVolID\tStatus\tDate\n"

但我不确定这对你来说是否足够好。

如果这还不够好,那么我认为您必须重新格式化 ec2-describe-snapshots 的输出。由于您使用的是 Linux,因此 column 命令可以在此处为您提供帮助。这是一个不完美但易于阅读的解决方案:

latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}')
out="$EC2_HOME/Working/SnapshotsLatest_$today_date"
{
echo Label SnapshotID VolID Status Date
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate"
} | column -t > "$out"

更新

虽然您说上面的方法不起作用,但我无法重现您得到的结果。我在这里得到了很好的分栏格式,就像我答案顶部的示例一样。所以我认为你做错了什么。

无论如何,这是一个更丑陋的替代解决方案:

latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -rk 5 | awk '{print substr($5, 1, 10); exit}')
out="$EC2_HOME/Working/SnapshotsLatest_$today_date"
{
echo Label SnapshotID VolID Status Date
ec2-describe-snapshots | grep "^SNAPSHOT.*$latestdate"
} | awk '{printf "%-12s%-16s%-16s%-12s%-26s%-6s%-14s%-4s", $1, $2, $3, $4, $5, $6, $7, $8; for (i=9; i<=NF; ++i) printf $i " "; print ""; }' > "$out"

这可能不适用于 ec2-describe-snapshots 的所有可能输出。例如,最后一个脚本假定 SnapshotID 列始终少于 16 个字符。如果您注意到打印的某些列之间没有空格,请调整那里的 printf 语句中的格式字符串以增加列的宽度。

关于linux - 如何在运行时在 linux 中的文件中附加字段名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20539241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com