如何命令grep不显示搜索到的字符串?

我想在文件中打印一行的一部分。 整条线看起来像这样。

Path=fy2tbaj8.default-1404984419419 

我想在Path=之后只打印字符。 我试过grep Path filename | head -5 grep Path filename | head -5 。 但它不起作用。它仍然显示整条线。 我怎样才能做到这一点?

你可以使用cut命令来达到这个目的。

 grep Path filename |cut -c6- 

这里-c6-选项意味着从第6个字符打印到最后一个字符。

你可以使用grepgrep

 grep -oP "(?<=Path=).*" file 

在此处输入图像描述

说明

man grep

  -o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. -P, --perl-regexp Interpret PATTERN as a Perl compatible regular expression (PCRE) 

lookbehind (?<=Path=)断言在字符串中的当前位置,前面的是字符Path= 。 如果断言成功,则引擎匹配分辨率模式。

对于Perl 5正则表达式语法,请阅读Perl正则表达式手册页 。

awk解决方案就是我要使用的,但是稍微小一点的启动过程是sed并且它可以产生相同的结果,但是通过用""替换PATH =行的一部分,即

  sed -n 's/^Path=//p' file 

-n覆盖sed的’print all lines’的默认行为(so -n = no print),并且为了打印一行,我们在substition之后添加p字符。 仅打印替换发生的行。

这为您提供了所要求的行为,即grep ing一个字符串,但删除了Path=该行的一部分。

如果根据David Foerster的评论,你有一个大文件并且希望在匹配并将第一个匹配打印到’Path =’后立即停止处理,你可以使用q命令告诉sed退出。 请注意,您需要通过在{ ..}包围并使用a分隔每个命令来使其成为命令组; 。 所以增强的命令是

 sed -n 's/^Path=//{p;q;}` file 

IHTH

grep greps一行文本并显示它。 head显示前n行文本,而不是字符。

你正在寻找sedawk

 awk '{print $2}' FS='=' 

这将=设置为字段分隔符并打印第二个字段。

使用GNU grep:

 $ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*' fy2tbaj8.default-1404984419419 

\K保留\K的剩余内容,不要将其包含在$&

当然解决方案是使用grep -Po

为了完整性,让我们添加一些其他解决方案:

  • cut ,设置分隔符=

     cut -d'=' -f2 file 
  • 它可能有点风险,但您也可以获取文件,以便$Path将包含该值。

     source file echo "$Path" 

测试

 $ cat a this=aaabbccc that=dddeee $ source a $ echo "$this" aaabbccc $ echo "$that" dddeee 

根据评论,请参阅如何仅获取文件的一部分:

 $ cat a Path=22 Path=33 $ source a $ echo $Path 33 $ source <(head -1 a) $ echo $Path 22