Ana*_*Das 15 command-line scripts grep
我想打印文件中一行的一部分。整条线看起来像这样。
Path=fy2tbaj8.default-1404984419419
Run Code Online (Sandbox Code Playgroud)
我只想打印Path=. 我试过了grep Path filename | head -5。但它不起作用。它仍然显示整行。我怎样才能做到这一点?
Syl*_*eau 41
您可以使用grep并且只是grep:
grep -oP "(?<=Path=).*" file
Run Code Online (Sandbox Code Playgroud)

说明:
来自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)
Run Code Online (Sandbox Code Playgroud)
在回顾后发 (?<=Path=)断言在字符串中的当前位置,什么是先于人物Path=。如果断言成功,引擎将匹配解析模式。
有关 Perl 5 正则表达式语法,请阅读Perl 正则表达式手册页。
g_p*_*g_p 15
您可以cut为此使用命令。
grep Path filename |cut -c6-
Run Code Online (Sandbox Code Playgroud)
这里的-c6-选项表示从第 6 个字符到最后一个字符打印。
该awk解决方案是我会用什么,而是要推出一个略小的过程sed,它可以产生相同的结果,但通过与代线的PATH =部分"",即
sed -n 's/^Path=//p' file
Run Code Online (Sandbox Code Playgroud)
-n覆盖sed的默认行为是“打印所有行”(so -n= 不打印),要打印一行,我们在替换p后添加字符。只会打印发生替换的行。
这为您提供了您所要求的行为,即greping 字符串,但删除了Path=该行的一部分。
如果根据 David Foerster 的评论,您有一个大文件并希望在匹配并打印第一个匹配到“Path=”后立即停止处理,您可以使用q命令告诉 sed 退出。请注意,您需要通过{ ..}将每个命令包围并用;. 所以增强的命令是
sed -n 's/^Path=//{p;q;}` file
Run Code Online (Sandbox Code Playgroud)
IHTH
grepgrep 一行文本并显示它。head显示前n行文本,而不是字符。
您正在寻找sed或awk:
awk '{print $2}' FS='='
Run Code Online (Sandbox Code Playgroud)
这将设置=为字段分隔符并打印第二个字段。
使用 GNU grep:
$ echo Path=fy2tbaj8.default-1404984419419 | grep -oP '(Path=)\K.*'
fy2tbaj8.default-1404984419419
Run Code Online (Sandbox Code Playgroud)
\K保留 \K 左侧的内容,不要将其包含在$&.