【问题标题】:Print the filename only when found仅在找到时打印文件名
【发布时间】:2026-01-25 19:50:01
【问题描述】:

所以我有一个命令,如果找到的话就打印主机。

awk -v IGNORECASE=1 -v m="$host" '$2~m {p=1} NF>2 && $2!~m {p=0} p' ${TEMP}/*

这就是它的结果

33 VMME87      VMware        51402EC000CF2732 3:0:2
                             51402EC000CF2730 3:0:1
                             51402EC000CF2730 2:0:1
                             51402EC000CF2732 2:0:2
83 VMME87          VMware        51402EC000CF2732 1:2:4
                                 51402EC000CF2730 1:2:3
                                 51402EC000CF2730 0:2:3
                                 51402EC000CF2732 0:2:4

但是,是否也可以将文件名打印到找到它的位置?

大概是这样的:

**Name of the file**
33 VMME87      VMware        51402EC000CF2732 3:0:2
                             51402EC000CF2730 3:0:1
                             51402EC000CF2730 2:0:1
                             51402EC000CF2732 2:0:2
echo (space)

**Name of the file**    
83 VMME87          VMware        51402EC000CF2732 1:2:4
                                 51402EC000CF2730 1:2:3
                                 51402EC000CF2730 0:2:3
                                 51402EC000CF2732 0:2:4

如果我使用grep,它会打印文件名,但不会打印所有最后一列。

Name of the file 33 VMME87      VMware        51402EC000CF2732 3:0:2

【问题讨论】:

  • 告诉我们更多关于输入文件的信息。特别是它们有多少列,以及分隔符是什么。

标签: bash shell unix scripting


【解决方案1】:

当前文件名在FILENAME 变量中可用。改变这部分

{p=1}

{p=1; print FILENAME}

如果您只想要文件名而不想要路径,请使用:

{p=1;sub(/^.*\//,"",FILENAME);print FILENAME}

【讨论】:

  • 感谢@hek2mgl.. 完美运行!但是,它包括完整的文件路径。 /export/sto/temp/GLB-MNL-HP-3PAR-V400。有没有办法删除这个路径并只保留文件名?删除/export/sto/temp/ 并保留GLB-MNL-HP-3PAR-V400
  • @gafm 和 awk 你可以使用{p=1;sub(/^.*\//,"",FILENAME);print FILENAME}