使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词
Using sed/awk to print ONLY words that contains matched pattern - Words starting with /pattern/ or Ending with /pattern/
我有以下输出:
junos-vmx-x86-64-21.1R1.11.qcow2 metadata-usb-fpc0.img metadata-usb-fpc10.img
metadata-usb-fpc11.img metadata-usb-fpc1.img metadata-usb-fpc2.img metadata-usb-fpc3.img
metadata-usb-fpc4.img metadata-usb-fpc5.img metadata-usb-fpc6.img metadata-usb-fpc7.img
metadata-usb-fpc8.img metadata-usb-fpc9.img metadata-usb-re0.img metadata-usb-re1.img
metadata-usb-re.img metadata-usb-service-pic-10g.img metadata-usb-service-pic-2g.img
metadata-usb-service-pic-4g.img vFPC-20210211.img vmxhdd.img
输出来自以下脚本:
images_fld=$(for i in $(ls "$DIRNAME_IMG"); do echo ${i%%/}; done)
之前的输出保存在一个名为 images_fld=
的变量中
问题:
我需要提取 junos-vmx-x86-64-21.1R1.11.qcow2
的值
vFPC-20210211.img
和 vmxhdd.img
当我指的是值时,我指的是整个词
问题是这个包含所有文件的目录总是在更新,并且不断添加新文件,这意味着我不能依靠行号 ($N) 来提取那些文件的名称。
我正在尝试使用 awk
或 sed
来实现这一点。
有没有办法:
匹配所有以.qcow2
结尾的文件然后提取完整文件名?喜欢:junos-vmx-x86-64-21.1R1.11.qcow2
匹配所有vFPC
开头的文件然后提取完整文件名?喜欢:vFPC-20210211.img
匹配所有vmxhdd
开头的文件然后提取完整文件名?喜欢:vmxhdd.img
我正在使用这些模式,因为这些文件名往往会根据我部署的每个版本更改名称。但是诸如 .qcow2
或 vFPC
或 vmxhdd
之类的模式始终保持不变,因此,出于这个原因,我只需要通过匹配部分模式来提取整个字符串。可能吗?谢谢!
注意:我不能依赖以.img
结尾的文件,因为它们很多,所以提取特定的文件会更加困难文件名:/
这可能对你有用 (GNU sed):
sed -nE '/\<\S+\.qcow2\>|\<(vFPC|vmxhdd)\S+\>/{s//\n&\n/;s/[^\n]*\n//;P;D}' file
如果字符串符合要求的条件,则用换行符分隔。
最多删除并包括第一个换行符。
Print/delete 第一行并重复。
感谢 KamilCuk 我能够解决问题。谢谢!对于将来可能需要这个的任何人,而不是使用 sed
或 awk
解决方案是使用 tail
.
echo $images_fld | tail -f | tr ' ' '\n' | grep '\.qcow2$\|vFPC\|vmxhdd')
基本上,我遇到的问题只是提取以 .qcow2 结尾的文件的名称 |并从 vFPC 和 vmxhdd
开始
谢谢KamilCuk
potong给出的另一个解决方案是使用
echo $images_fld sed -nE '/\<\S+\.qcow2\>|\<(vFPC|vmxhdd)\S+\>/{s//\n&\n/;s/[^\n]*\n//;P;D}'
与 KamilCuk 的输出相同!谢谢两位
我有以下输出:
junos-vmx-x86-64-21.1R1.11.qcow2 metadata-usb-fpc0.img metadata-usb-fpc10.img
metadata-usb-fpc11.img metadata-usb-fpc1.img metadata-usb-fpc2.img metadata-usb-fpc3.img
metadata-usb-fpc4.img metadata-usb-fpc5.img metadata-usb-fpc6.img metadata-usb-fpc7.img
metadata-usb-fpc8.img metadata-usb-fpc9.img metadata-usb-re0.img metadata-usb-re1.img
metadata-usb-re.img metadata-usb-service-pic-10g.img metadata-usb-service-pic-2g.img
metadata-usb-service-pic-4g.img vFPC-20210211.img vmxhdd.img
输出来自以下脚本:
images_fld=$(for i in $(ls "$DIRNAME_IMG"); do echo ${i%%/}; done)
之前的输出保存在一个名为 images_fld=
问题:
我需要提取 junos-vmx-x86-64-21.1R1.11.qcow2
的值
vFPC-20210211.img
和 vmxhdd.img
当我指的是值时,我指的是整个词
问题是这个包含所有文件的目录总是在更新,并且不断添加新文件,这意味着我不能依靠行号 ($N) 来提取那些文件的名称。
我正在尝试使用 awk
或 sed
来实现这一点。
有没有办法:
匹配所有以
.qcow2
结尾的文件然后提取完整文件名?喜欢:junos-vmx-x86-64-21.1R1.11.qcow2
匹配所有
vFPC
开头的文件然后提取完整文件名?喜欢:vFPC-20210211.img
匹配所有
vmxhdd
开头的文件然后提取完整文件名?喜欢:vmxhdd.img
我正在使用这些模式,因为这些文件名往往会根据我部署的每个版本更改名称。但是诸如 .qcow2
或 vFPC
或 vmxhdd
之类的模式始终保持不变,因此,出于这个原因,我只需要通过匹配部分模式来提取整个字符串。可能吗?谢谢!
注意:我不能依赖以.img
结尾的文件,因为它们很多,所以提取特定的文件会更加困难文件名:/
这可能对你有用 (GNU sed):
sed -nE '/\<\S+\.qcow2\>|\<(vFPC|vmxhdd)\S+\>/{s//\n&\n/;s/[^\n]*\n//;P;D}' file
如果字符串符合要求的条件,则用换行符分隔。
最多删除并包括第一个换行符。
Print/delete 第一行并重复。
感谢 KamilCuk 我能够解决问题。谢谢!对于将来可能需要这个的任何人,而不是使用 sed
或 awk
解决方案是使用 tail
.
echo $images_fld | tail -f | tr ' ' '\n' | grep '\.qcow2$\|vFPC\|vmxhdd')
基本上,我遇到的问题只是提取以 .qcow2 结尾的文件的名称 |并从 vFPC 和 vmxhdd
开始谢谢KamilCuk
potong给出的另一个解决方案是使用
echo $images_fld sed -nE '/\<\S+\.qcow2\>|\<(vFPC|vmxhdd)\S+\>/{s//\n&\n/;s/[^\n]*\n//;P;D}'
与 KamilCuk 的输出相同!谢谢两位