如何修复bash shell脚本中的错误?

时间:2013-12-11 04:53:31

标签: bash shell awk amazon-ec2

我在shell脚本中尝试代码。当我试图将代码从批处理脚本转换为shell脚本时,我收到了一个错误。

批量文件代码

:: Create a file with all latest snapshots
FOR /F "tokens=5" %%a in (' ec2-describe-snapshots ^|find "SNAPSHOT" ^|sort /+64') do set "var=%%a" 
set "latestdate=%var:~0,10%" 
call ec2-describe-snapshots |find "SNAPSHOT"|sort /+64 |find "%latestdate%">"%EC2_HOME%\Working\SnapshotsLatest_%date-today%.txt"

SHELL SCRIPT中的代码

#Create a file with all latest snapshots
FOR snapshot_date in $(' ec2-describe-snapshots | grep -i "SNAPSHOT" |sort /+64') do set "var=$snapshot_date" 
set "latestdate=$var:~0,10" 
ec2-describe-snapshots |grep -i "SNAPSHOT" |sort /+64 | grep "$latestdate">"$EC2_HOME%/SnapshotsLatest_$today_date"

我想根据日期对快照进行排序,并将最新日期中创建的快照保存到文件中。

ece-describe-snapshots的示例输出:

SNAPSHOT snap-5e20 vol-f660 completed 2013-12-10T08:00:30+0000 100% 109030037527 10 2013-12-10: Daily Backup for i-2111 (VolID:vol-f9a0 InstID:i-2601)

它将包含这样的记录

我收到了这段代码:

latestdate=$(ec2-describe-snapshots | grep ^SNAPSHOT | sort -k 5 | awk '{print $5}') ec2-describe-snapshots | grep SNAPSHOT.*$latestdate | > "$EC2_HOME/SnapshotsLatest_$today_date"

但收到此错误:

grep: 2013-12-10T09:55:34+0000: No such file or directory grep: 2013-12-11T04:16:49+0000: No such file or directory grep: 2013-12-11T04:17:57+0000: No such file or directory

我在亚马逊上制作了一些快照,我想找到一个日期制作的最新快照,然后想把它们存储在一个文件中。比如日期2013-12-10在此日期制作的快照应存储在文件中。 snapshotslatest文件的内容应为

SNAPSHOT snap-c17f3 vol-f69a0 completed 2013-12-04T09:24:50+0000 100% 109030037‌​527 10 2013-12-04: Daily Backup for Sanjay_Test_Machine (VolID:vol-f66409a0 InstID:i-26048111) SNAPSHOT snap-c7d617f9 vol-3d335f6b completed 2013-12-04T09:24:54+0000 100% 1090‌​30037527 10 2013-12-04: Daily Backup for sacht_VPC (VolID:vol-3db InstID:i-ed6)

请注意,如果在2013-12-10, 2013-12-11, 2013-12-12上创建了快照。这意味着latest_date应为2013-12-12,并且2013-12-12上创建的所有snaphshot都应保存在文件中。

任何建议或领导都表示赞赏。

2 个答案:

答案 0 :(得分:1)

批处理脚本和您发布的shell脚本都不是一个好的起点,所以让我们从头开始。对不起,这个评论太大了。

want to find the latest snapshots made on a date and then want to store them in a file

这是什么意思?

快照文件的名称或内容是否有时间戳?

如果不是 - UNIX不存储文件创建时间戳,那么最后修改的时间戳是否足够?

您真的想将所有快照文件连接成一个单个文件,还是想创建一个包含快照文件名列表的文件?

发布一些示例输入(例如,一些快照文件名和内容,如果存储时间戳的位置)和给定输入的预期输出。

更新您的问题以解决上述所有问题,请勿尝试回复评论。

答案 1 :(得分:0)

小问题,重定向输出时不需要管道,所以要保存的行应

ec2-describe-snapshots | grep SNAPSHOT.*$latestdate  > "$EC2_HOME/SnapshotsLatest_$today_date"

现在这里的主要问题是grep搞砸了。我没有使用亚马逊快照,但从您的示例描述判断,您应该做类似

的事情
latestdate=$(ec2-describe-snapshots | grep -oP "\d+-\d+-\d+" | sort -r | head -1)

这将从文件中获取包含dddd-dd-dd格式的所有日期(我假设每个快照行中的两个日期始终匹配),按相反的顺序排序(最新的第一个)并取头这是最新的日期,存储在$ latestdate。

然后存储具有给定日期的所有快照,例如

ec2-describe-snapshots | grep -oP "SNAPSHOT(.*?)$lastdateT(.*?)\)" > "$EC2_HOME/SnapshotsLatest_$today_date"

这将使所有文本以SNAPSHOT开头,包含给定日期,并以结束“)”结束并保存。注意,如果“)”可以出现在其他地方,你可能不得不乱用它。