给定一个文件,例如:
potato: 1234
apple: 5678
potato: 5432
grape: 4567
banana: 5432
sushi: 56789
我想grep开头的所有行,potato:
但只管道后面的数字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:
被发送到inline(-e
)Perl脚本中,该脚本从中获取所有行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:
,则匹配,如果(&&
),然后继续应用上述正则表达式并打印结果)。
问题内容: 假设有一个大的文本文件,我只想打印与某些模式不匹配的行。显然,我可以使用。现在,如果所有这些模式都在文本文件中怎么办?从文件中读取模式的最佳方法是什么? 问题答案:
问题内容: 以下grep表达式成功列出了当前目录和子目录中的所有.exe和.html文件。 我该如何反转此结果以列出不是.html或.exe的结果。(即。) 问题答案: 使用命令行选项或,
grep用于在文件内搜索,查看是否有任何行与给定的正则表达式匹配。然而,我有这种情况--我想编写一个将与文件名本身(而不是文件内容)匹配的正则表达式。我将从系统的根目录运行它,以找到所有与正则表达式匹配的文件。
问题内容: 如何递归所有目录和子目录? 问题答案: 第一个参数表示要搜索的正则表达式,而第二个参数表示应搜索的目录。在这种情况下,表示当前目录。 注意:这适用于GNU grep,在某些平台(如Solaris)上,必须专门使用GNU grep而不是传统实现。对于Solaris,这是命令。
问题内容: 可以在连续流上使用吗? 我的意思是说是一条命令,但在输出中仅保留我感兴趣的行。 我已经尝试过了,但是似乎只能在完成后才能执行,也就是说永远不会执行。 问题答案: 使用BSD grep(FreeBSD,Mac OS X等)时,打开的行缓冲模式。 您无需为GNU grep(几乎在任何Linux上使用)执行此操作,因为它会默认刷新(对于其他类似Unix的版本,如SmartOS,AIX或QNX
问题内容: 我有大量要搜索的小文件。我一直在寻找一个良好的事实上的多线程版本,但找不到任何东西。如何改善grep的用法?截至目前,我正在这样做: 问题答案: 如果在多核处理器上安装了xargs,则可以从以下内容中受益,以防万一有人感兴趣。 环境: 测试: 1.找到必要的文件,将它们通过管道传递到xargs,并告诉它执行8个实例。 2.找到必要的文件,将它们通过管道传递到xargs,并告诉它执行4个