解析文件以找到递归模式

解析文件以找到递归模式

在我的目录中有几个带有该模式的文件

simulation_y_t

对于具有这种模式的所有文件,我需要检查文件最后一行是否hgip出现了该单词......该单词可能没有与周围字符用空格隔开,但如果出现,它将出现在该行的最后 20 个字符内......

我怎样才能做到这一点?

答案1

使用sed

for file in *simulation_y_t*; do sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file"; done

它将检查每个文件的最后一行,如果hgip在最后 20 个字符内,它将打印该行。

这是扩展版本(也打印文件名):

#!/bin/bash
for file in *simulation_y_t*; do
    line="$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")"
    [[ -n $line ]] && echo "$file: " "$line"
done
  • 开头$(模式之前s///)表示文件的最后一行。

  • 该模式hgip.\{0,16\}$确保hgip仅出现在行的最后 20 个字符中

  • line将包含匹配的行

  • [[ -n $line ]]测试的长度是否$line非零,如果是,则打印文件和匹配的最后一行。


这也可以使用grep在以下人员的帮助下tail

grep 'hgip.\{0,16\}$' < <(for f in *simulation_y_t*;do tail -1 "$f";done)

这里的逻辑与 相同sed,此外tail -1还会为我们提供文件的最后几行,以便我们可以运行grep它们。

编辑 :

如果您想删除符合条件的最后一行,请使用以下命令:

!/bin/bash
for file in *simulation_y_t*; do
   [[ -n "$(sed -n '$ s/.*hgip.\{0,16\}$/&/p' "$file")" ]] && sed -i.bak '$d' "$file"
done

原始文件将保留.bak扩展名,如果您不想要,只需使用-i而不是-i.bak

相关内容