一尘不染

模式后如何grep内容?

linux

给定一个文件,例如:

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

我想grep开头的所有行,potato:但只管道后面的数字potato:。因此,在上面的示例中,输出为:

1234
5432

我怎样才能做到这一点?


阅读 228

收藏
2020-06-02

共1个答案

一尘不染

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

grep查找包含字符串的任何行potato:,然后对于每行,从行()的开头到序列的最后一个出现(冒号后加空格)的空字符sed替换(s///-替换)任何字符(.*)字符串(-将第一部分替换为第二部分,该部分为空)。^``:``s/...//

要么

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

对于包含的每一行potato:cut会将其分成多个由空格分隔的字段(-d\-
d=定界符,\=转义的空格字符,类似的-d" "方法也可以使用),并打印每行这样的第二个字段(-f2)。

要么

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

对于包含的每一行potato:awk将打印第二个字段(print $2),默认情况下用空格分隔。

要么

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

包含的所有行都potato:被发送到inline(-ePerl脚本中,该脚本从中获取所有行stdin,然后对于这些行中的每一个,都执行与上述第一个示例相同的替换,然后打印出来。

要么

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

该文件通过stdin< file.txt将文件的内容通过stdin左命令发送)发送到awk脚本,该脚本针对包含的每一行potato:if(/potato:/)如果正则表达式/potato:/与当前行匹配,则返回true
),打印第二个字段,如所述以上。

要么

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

该文件通过stdin< file.txt,请参见上文)发送到与上述脚本类似的Perl脚本,但是这一次还可以确保每行包含字符串potato:/potato:/是一个正则表达式,如果当前行包含potato:,则匹配,如果(&&),然后继续应用上述正则表达式并打印结果)。

2020-06-02