在我的目录中有几个带有该模式的文件
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
。