给定一个文件,例如:
potato: 1234 apple: 5678 potato: 5432 grape: 4567 banana: 5432 sushi: 56789
我想grep开头的所有行,potato:但只管道后面的数字potato:。因此,在上面的示例中,输出为:
potato:
1234 5432
我怎样才能做到这一点?
grep 'potato:' file.txt | sed 's/^.*: //'
grep查找包含字符串的任何行potato:,然后对于每行,从行()的开头到序列的最后一个出现(冒号后加空格)的空字符sed替换(s///-替换)任何字符(.*)字符串(-将第一部分替换为第二部分,该部分为空)。^``:``s/...//
grep
sed
s///
.*
^``:``s/...//
要么
grep 'potato:' file.txt | cut -d\ -f2
对于包含的每一行potato:,cut会将其分成多个由空格分隔的字段(-d\- d=定界符,\=转义的空格字符,类似的-d" "方法也可以使用),并打印每行这样的第二个字段(-f2)。
cut
-d\
d
\
-d" "
-f2
grep 'potato:' file.txt | awk '{print $2}'
对于包含的每一行potato:,awk将打印第二个字段(print $2),默认情况下用空格分隔。
awk
print $2
grep 'potato:' file.txt | perl -e 'for(<>){s/^.*: //;print}'
包含的所有行都potato:被发送到inline(-e)Perl脚本中,该脚本从中获取所有行stdin,然后对于这些行中的每一个,都执行与上述第一个示例相同的替换,然后打印出来。
-e
stdin
awk '{if(/potato:/) print $2}' < file.txt
该文件通过stdin(< file.txt将文件的内容通过stdin左命令发送)发送到awk脚本,该脚本针对包含的每一行potato:(if(/potato:/)如果正则表达式/potato:/与当前行匹配,则返回true ),打印第二个字段,如所述以上。
< file.txt
if(/potato:/)
/potato:/
perl -e 'for(<>){/potato:/ && s/^.*: // && print}' < file.txt
该文件通过stdin(< file.txt,请参见上文)发送到与上述脚本类似的Perl脚本,但是这一次还可以确保每行包含字符串potato:(/potato:/是一个正则表达式,如果当前行包含potato:,则匹配,如果(&&),然后继续应用上述正则表达式并打印结果)。
&&