我正在尝试每行 grep 一个词。对于每一行,我想打印出现在 grep 单词之前的所有内容。
例子:
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com.
我正在寻找.nc
并且我想打印出它之前的所有内容help.me
。
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | awk '{print $6}'
fd-nc-001.domain.com.
echo help.me.nc.example.com is an alias for fd-nc-001.domain.com. | grep .nc | awk '{print $1}'
help.me.nc.example.com
这会在字符串第一次出现时截断输入行
.nc
:(请注意,必须转义点 in
.nc
,否则它会匹配任何单个字符。.*
后面\.nc
匹配该行的其余部分。)如果输入行不包含字符串,这另外不会输出任何内容
.nc
(或者更确切地说,如果执行替换,它只会输出一些内容,如果该行包含字符串,它就会输出):-n
在每个循环结束时禁用sed
缓冲区默认输出的选项。相反,只要替换被触发,替换命令的添加p
标志就会执行显式输出。例子:
(最后一条命令没有输出。)
sed -n 's/\.nc.*//p'
执行与仅使用相同的操作awk
:(尝试在每一行上执行替换,但仅当命令中使用的模式
sub()
匹配时才打印结果。)同样的事情,但只使用
pcre2grep
:(匹配行的开头和所有内容,但不包括字符串
.nc
。)您可以使用
(*pla:
,或更神秘的(?=
, 代替(*positive_lookahead:
上面的内容。如果你有 GNUgrep
,你可以在前面的命令中使用grep -P
代替。pcre2grep
.nc
我怀疑您真正想要的是在该行的后面.
或末尾找到,并且您希望在每行的第一次出现(而不是最后一次出现)时进行匹配。那就是其中之一(使用示例输入来测试不仅仅是.nc
在输入中出现一次而不是作为子字符串出现的晴天情况):-E
该 sed 命令需要一个支持启用 ERE 的sed ,例如 GNU 或 BSD sed,而 awk 命令将在任何 awk 中工作。