我使用以下命令输出具有关联 IP 的服务器列表。对于脚本的另一部分,我需要以特定方式格式化输出。每行上方都有一个递增的行号。下面的例子
paste <(aws ec2 describe-instances --query 'Reservations[*].Instances[*].Tags[*].{Name:Value}' --output text) \
<(aws ec2 describe-instances --query 'Reservations[*].Instances[*].{PrivateIP:PrivateIpAddress}' --output text) | awk 'ORS="\n\n"' >> $TMP1
哪个输出(在 tmp 文件中):
Dev Server 111.11.11.11
Test Server 222.22.22.22
但是我怎样才能像这样将数字附加到每个空白行呢?
例子
1
Dev Server 111.11.11.11
2
Test Server 222.22.22.22
答案1
如果您更改创建文件的方式,以便不插入空行(通过删除最后awk
一步),则可以使用短sed
脚本=
插入行号:
$ cat file
Dev Server 111.11.11.11
Test Server 222.22.22.22
$ sed '=' file
1
Dev Server 111.11.11.11
2
Test Server 222.22.22.22
=
中的编辑命令sed
在其自己的行上输出当前行号。默认情况下,sed
在继续下一行之前,在编辑脚本末尾输出编辑缓冲区的内容。由于编辑缓冲区不被编辑脚本改变,所以数据按原样再现。
不过,理想情况下,我们会采用我认为您的命令可以生成的 JSON 文档aws
并将其传递jq
以获得正确的输出,而无需执行两次查询。
处理给定的数据,使用awk
:
$ cat file
Dev Server 111.11.11.11
Test Server 222.22.22.22
$ awk '/./ { print ++c; print }' file
1
Dev Server 111.11.11.11
2
Test Server 222.22.22.22
如果您需要在末尾有一个空行,如问题所示:
$ awk '/./ { print ++c; print } END { print }' file
1
Dev Server 111.11.11.11
2
Test Server 222.22.22.22
这两个awk
命令在每个非空行之前都有一个递增计数器 ,c
从 1 开始运行。
答案2
使用awk
:
$ cat FILE
Dev Server 111.11.11.11
Test Server 222.22.22.22
$ awk '{ if ($0 ~ /^$/) { print ++counter } else { print $0 }}' FILE
1
Dev Server 111.11.11.11
2
Test Server 222.22.22.22