使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词

Posted

技术标签:

【中文标题】使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词【英文标题】:Using sed/awk to print ONLY words that contains matched pattern - Words starting with /pattern/ or Ending with /pattern/ 【发布时间】:2022-01-16 14:13:55 【问题描述】:

我有以下输出:

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.imgvmxhdd.img 当我指的是价值观时,我指的是整个词

问题是这个包含所有文件的目录一直在更新,并且不断添加新文件,这意味着我不能依靠行号($N)来提取这些文件的名称。

我正在尝试使用awksed 来实现这一目标。

有没有办法:

    匹配所有以.qcow2 结尾的文件,然后提取完整的文件名?点赞:junos-vmx-x86-64-21.1R1.11.qcow2

    匹配所有以vFPC 开头的文件,然后提取完整的文件名?点赞:vFPC-20210211.img

    匹配所有以vmxhdd 开头的文件,然后提取完整的文件名?点赞:vmxhdd.img

我正在使用这些模式,因为这些文件名往往会根据我部署的每个版本更改名称。但是像:.qcow2vFPCvmxhdd 这样的模式始终保持不变,因此,我只需要通过匹配部分模式来提取整个字符串。可能吗?谢谢!

注意:我不能依赖以.img结尾的文件,因为它们很多,因此提取特定文件名会更加困难:/

【问题讨论】:

I have the following output: 输出从何而来?是什么产生它? need to extract the values of 这些是钥匙吗? “提取”是什么意思?以什么方式? Is there a way to 是的。用换行符替换空格,然后使用grep。您想在不断更新的文件上同时执行所有三个条件吗?太棒了tail -f file | tr ' ' '\n' | grep '\.qcow2$\|vFPC\|vmxhdd' 我已经添加了输出来源的脚本。提到的值是输出中的字符串或行:)!如果你能看到输出,它有很多文件,我只需要“提取”或只显示提到的那 3 个文件。你能告诉我如何使用 grep 来实现这一点吗?我之前尝试使用 grep 但输出为空白:/ The output came from the following script: 但为什么呢?你在问XY问题吗?您提供了一个带有单词的列表 - 但您不关心单词。您想在与某些文件名匹配的目录中查找新创建的文件吗?你为什么关心一些单词列表? "extract" or display only those 3 files mentioned 仅显示提到的那 3 个文件,只需 echo junos-vmx-x86-64-21.1R1.11.qcow2 vFPC-20210211.img vmxhdd.img。您能否更具体地说明您想要实现的目标?你说that this file is always being updated - 这个文件是如何更新的?什么文件 - 你说你有一个变量。 我想要完成的是,从输出的单词列表中,只提取特定的文件。包含所有这些文件的目录会不断更新,因此会添加更多文件。我只需要提取我要查找的 3 个文件的名称。为什么?因为当有新版本时,这 3 个文件的名称会改变。唯一不会改变这些值的字符串是 .qcow2 vmxhdd 和 vFPC 【参考方案1】:

这可能对你有用(GNU sed):

sed -nE '/\<\S+\.qcow2\>|\<(vFPC|vmxhdd)\S+\>/s//\n&\n/;s/[^\n]*\n//;P;D' file

如果字符串符合所需条件,则用换行符分隔。

删除直到并包括第一个换行符。

打印/删除第一行并重复。

【讨论】:

【参考方案2】:

感谢KamilCuk 我能够解决问题。谢谢!对于将来可能需要此功能的任何人,而不是使用sedawk,解决方案是使用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 相同的输出!谢谢两位

【讨论】:

以上是关于使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词的主要内容,如果未能解决你的问题,请参考以下文章

sed / awk - 使用模式匹配后插入空格

使用 sed / awk / bash 将缺失的行号填充到文件中

Bash - Linux - 在一行中找到匹配并打印到SED / Awk / Grep行的末尾

find、grep、sed、awk的使用

如何在两个模式之间打印线,包括或不包括(在 sed、AWK 或 Perl 中)?

如何在两个模式之间打印线,包括或不包括(在 sed、AWK 或 Perl 中)?