在文件中的每一行上方添加并编号空行

Goo*_*rry 3 awk text-processing

我正在使用以下命令输出具有关联 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  

Run Code Online (Sandbox Code Playgroud)

输出(在 tmp 文件中):

Dev Server   111.11.11.11

Test Server     222.22.22.22

Run Code Online (Sandbox Code Playgroud)

但是,如何将数字附加到每个空行?

例子

1
Dev Server   111.11.11.11
2
Test Server  222.22.22.22

Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 9

如果您更改创建文件的方式,以便不插入空行(通过删除最后awk一步),那么您可以使用短sed脚本=插入行号:

$ cat file
Dev Server   111.11.11.11
Test Server     222.22.22.22
Run Code Online (Sandbox Code Playgroud)
$ sed '=' file
1
Dev Server   111.11.11.11
2
Test Server     222.22.22.22
Run Code Online (Sandbox Code Playgroud)

中的编辑命令=sed其自己的一行上输出当前行号。默认情况下,sed在继续下一行之前,在编辑脚本的末尾输出编辑缓冲区的内容。由于编辑缓冲器通过编辑脚本保持不变,数据按原样再现。

不过,理想情况下,我认为您的aws命令可以生成并传递JSON 文档jq以获得正确的输出,而无需执行两次查询。


使用给定的数据,使用awk

$ cat file
Dev Server   111.11.11.11

Test Server     222.22.22.22

Run Code Online (Sandbox Code Playgroud)
$ awk '/./ { print ++c; print }' file
1
Dev Server   111.11.11.11
2
Test Server     222.22.22.22
Run Code Online (Sandbox Code Playgroud)

如果您需要在末尾有一个空行,如问题所示:

$ awk '/./ { print ++c; print } END { print }' file
1
Dev Server   111.11.11.11
2
Test Server     222.22.22.22

Run Code Online (Sandbox Code Playgroud)

这两个awk命令在每个非空行之前都有一个递增的计数器,c,从 1 开始运行。


Ark*_*zyk 5

使用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
Run Code Online (Sandbox Code Playgroud)