给定一个文件,例如:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
我想对所有以 potato:
开头的行进行 grep,但只用管道显示 potato:
后面的数字。所以在上面的例子中,输出将是:
1234
5432
我该怎么做?
最佳答案
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:
的所有行都被发送到一个内联 ( -e
) Perl 脚本,该脚本从 stdin
获取所有行,然后,对于这些行中的每一行,执行与上面第一个示例相同的替换,然后打印它。
或
awk '{if(/potato:/) print $2}' < file.txt
文件通过 stdin
发送(< file.txt
通过 stdin
将文件的内容发送到左侧的命令)到 awk
脚本,对于包含 potato:
的每一行(如果正则表达式 if(/potato:/)
与当前匹配,则 /potato:/
返回 true line),打印第二个字段,如上所述。
或
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
文件通过 stdin
( < file.txt
,见上文) 发送到与上述类似的 Perl 脚本,但这次它还确保每一行都包含字符串 potato:
( /potato:/
是一个正则表达式,如果当前行包含 potato:
,如果包含 ( &&
),则继续应用上述正则表达式并打印结果。
关于linux - 如何grep模式后的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358547/