如何打印' nth + x'发现比赛后的线?

时间:2016-02-03 21:05:38

标签: awk sed

我有一个包含以下输出的文件。我只想要包含实际vm_id数字的行。

我想匹配模式' vm_id'并打印第二行+所有其他行,直到'行'到达了。

parent.getChildren().add(item);

因此产生的结果将是;

FILE BEGIN:
                vm_id                 
--------------------------------------
 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 6ffac9a9-1b6b-4600-8114-1ca0666951be
 47b5e6d1-6ddd-424a-ab08-18ee35b54ebf
 cc0e8b36-eba3-4846-af08-67ab72d911fc
 1b8c2766-92b7-477a-bc92-797a8cb74271
 c37bf1d8-a6b2-4099-9d98-179b4e573c64
(6 rows)

datacenter=
FILE END:

此外,VM Id的数量会有所不同,此示例有6个,而其他可能有3个或300个。

我尝试过以下操作,但只输出一行指定的行;

 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 6ffac9a9-1b6b-4600-8114-1ca0666951be
 47b5e6d1-6ddd-424a-ab08-18ee35b54ebf
 cc0e8b36-eba3-4846-af08-67ab72d911fc
 1b8c2766-92b7-477a-bc92-797a8cb74271
 c37bf1d8-a6b2-4099-9d98-179b4e573c64

2 个答案:

答案 0 :(得分:2)

$ awk '/rows/{f=0} f&&(++c>2); /vm_id/{f=1}' file
 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 6ffac9a9-1b6b-4600-8114-1ca0666951be
 47b5e6d1-6ddd-424a-ab08-18ee35b54ebf
 cc0e8b36-eba3-4846-af08-67ab72d911fc
 1b8c2766-92b7-477a-bc92-797a8cb74271
 c37bf1d8-a6b2-4099-9d98-179b4e573c64

如果您想要打印第一行十六进制(?),那么只需更改起始编号以将c与2比较(或者在击中vm_id行后要跳过3或127或多行):

$ awk '/rows/{f=0} f&&(++c>1); /vm_id/{f=1}' file
 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 bf6c4f90-2e71-4253-a7f6-dbe5d666d3a4
 6ffac9a9-1b6b-4600-8114-1ca0666951be
 47b5e6d1-6ddd-424a-ab08-18ee35b54ebf
 cc0e8b36-eba3-4846-af08-67ab72d911fc
 1b8c2766-92b7-477a-bc92-797a8cb74271
 c37bf1d8-a6b2-4099-9d98-179b4e573c64

答案 1 :(得分:1)

这个怎么样:

awk '/vm_id/{p=1;getline;next}/\([0-9]+ rows/{p=0}p' 

我在p上设置vm_id标记并在(0-9+ rows)重置。

同样记住sed,该命令遵循与上面awk命令基本相同的逻辑:

sed -n '/vm_id/{n;:a;n;/([0-9]* rows)/!{p;ba}}'

另一件事,如果输入文件中唯一的GUIDs是vm ID是安全的,grep可能是选择的工具:

grep -Eo '([0-9a-f]+-){4}([0-9a-f]+)'

这种形式不是100%防弹,但对于大多数用例来说它应该足够好了。

子弹证明将是:

grep -Eoi '[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}'