如何命令grep不显示搜索到的字符串?
我想在文件中打印一行的一部分。 整条线看起来像这样。
Path=fy2tbaj8.default-1404984419419
我想在Path=
之后只打印字符。 我试过grep Path filename | head -5
grep Path filename | head -5
。 但它不起作用。它仍然显示整条线。 我怎样才能做到这一点?
你可以使用cut
命令来达到这个目的。
grep Path filename |cut -c6-
这里-c6-
选项意味着从第6个字符打印到最后一个字符。
你可以使用grep
和grep
:
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行文本,而不是字符。
你正在寻找sed
或awk
:
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