在 bash 中,while 或 till 循环,直到出现包含“REMOVE”内容的行。我该怎么做?

在 bash 中,while 或 till 循环,直到出现包含“REMOVE”内容的行。我该怎么做?

我想在文件中 grep IP 地址,直到包含“REMOVE”内容的行。我尝试了以下操作,但脚本给出了所有 IP,包括“REMOVE”之后的 IP。

a="[A-Z]"

cat *.txt| until [[ "$a" =  "REMOVE" ]]; do grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"; done

答案1

使用 sed 单行命令来完成:

sed -n -s -r '1,/REMOVE/ { s/.*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).*/\1/p }' *.txt

解释:

  • -n使得 sed 不打印行,除非使用p命令明确指示。
  • -s使 sed 分别处理每个文件,而不是将所有文件合并为一个流。
  • -r使 sed 使用需要更少转义的扩展正则表达式语法。

请注意-s-r是 sed 的 gnu 扩展。如果您不知道 gnu 扩展是什么意思,那么您很可能正在使用 gnu sed。如果您没有使用 gnu sed,那么您必须解决缺少的功能问题。

更多解释:

  • sed 脚本的1,/REMOVE/ { commands }意思是,从输入的第一行开始,直到包含的行,执行花括号内的命令REMOVE
  • sed 脚本的s/pattern/replacement/p意思是搜索模式,用替换项替换,然后打印该替换项。
  • 该模式.*(([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}).*是一种识别包含由点分隔的四个三位数字链的所有行的模式。它还将链捕获到所谓的组中。
  • 反向引用\1指向第一个捕获的组。这实际上意味着丢弃该行的其余部分并仅打印 IP 地址。

阅读罚款sed 手册更多解释。另请参阅sed 教程

相关内容