我想在文件中 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 地址。