grep内容后模式

先谢谢您的帮助。

给定一个文件,例如:

potato: 1234 apple: 5678 potato: 5432 grape: 4567 banana: 5432 sushi: 56789 

我想grep所有以“potato:”开头的行,但是只能input“Potato”后面的数字。 所以在上面的例子中,输出结果是:

 1234 5432 

谢谢

 grep 'potato:' file.txt | sed 's/^.*: //' 

要么

 grep 'potato:' file.txt | cut -d\ -f2 

要么

 grep 'potato:' file.txt | awk '{print $2}' 

要么

 grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}' 

要么

 awk '{if(/potato:/) print $2}' < file.txt 

要么

 perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt 

或者使用正则expression式断言: grep -oP '(?<=potato: ).*' file.txt

 sed -n 's/^potato:[[:space:]]*//p' file.txt 

人们可以把Grep看作是一个受限制的Sed,或者把Sed看作一个普遍的Grep。 在这种情况下,Sed是一个很好的,轻量级的工具,可以做你想做的事情 – 当然,还有其他几种合理的方法可以做到。

这将打印每场比赛之后的所有内容,只在同一行:

 perl -lne 'print $1 if /^potato:\s*(.*)/' file.txt 

这将做同样的事情,除了它也将打印所有后续行:

 perl -lne 'if ($found){print} elsif (/^potato:\s*(.*)/){print $1; $found++}' file.txt 

这些命令行选项被使用:

  • -n循环input文件的每一行
  • -l在处理之前删除换行符,然后将其添加回来
  • -e执行Perl代码