我有一个包含以下输出的文件。我只想要包含实际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
答案 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}'