我需要有关Grep的帮助,以一部分开始


8

我有一些文本文件,我想从中提取一段代码。我试图实现的目标是从某一行开始视图,然后能够读取其下方的任何内容。例如。在下面的文本中,如何在黄色的起点查看文本文件。我想查看“黄色”的内容以及其下的所有内容,无论该内容是什么。

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough

Answers:


9

AWK 使用AWK-这是最简单的方法:

awk '/yellow/,0' textfile.txt

样品运行

$ awk '/yellow/,0' textfile.txt                                
yellow
red
orange
more orange
more blue
this is enough

格列普

您还可以使用grepwith --after-context选项,在比赛后打印一定数量的行

grep 'yellow' --after-context=999999  textfile.txt

要自动设置上下文,可以使用$(wc -l textfile.txt)。基本思想是,如果您有第一行作为匹配项,并且想在该匹配项后打印所有内容,则需要知道文件中的行数减去1。幸运的是,--after-context不会抛出关于行数,因此您可以给它完全超出范围的数字,但是如果您不知道,则总行数可以

$ grep 'yellow' --after-context=$(wc -l < textfile.txt) textfile.txt
yellow
red
orange
more orange
more blue
this is enough

如果要缩短该命令,--after-context则该命令与-A和相同$(wc -l textfile.txt),将扩展为行数,后跟文件名。这样一来,您textfile.txt只需输入一次

grep "yellow" -A $(wc -l textfile.txt)

蟒蛇

skolodya@ubuntu:$ ./printAfter.py textfile.txt                                 
yellow
red
orange
more orange
more blue
this is enough

DIR:/xieerqi
skolodya@ubuntu:$ cat ./printAfter.py                                          
#!/usr/bin/env python
import sys

printable=False
with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
           printable=True
        if printable:
           print line.rstrip('\n')

或者不带printable标志

#!/usr/bin/env python
import sys

with open(sys.argv[1]) as f:
     for line in f:
        if "yellow" in line:
          for lines in f: # will print remaining lines
             print lines.rstrip('\n')
          exit()

您可以将grep命令简化为grep "yellow" -A $(wc -l textfile.txt)
字节指挥官

@ByteCommander是的,也可以完成。只是为了清楚起见使用了完整选项
Sergiy Kolodyazhnyy

1
@ByteCommander真是个不错的技巧。不幸的是,它只能工作,因为文件名中没有空格。
卡巴斯德'16

@kasperd哦,是的,您是对的。在这种情况下,您将不得不退回到Serg的原始命令grep "yellow" -A $(wc -l < "my colors.txt") "my colors.txt"
字节指挥官


5

不是grep,但是使用sed

sed -n '/^yellow$/,$p' file
  • -n:禁止打印
  • /^yellow$/,$:地址范围,从完全匹配的行的第一个出现yellow到最后一行(包括首尾)
  • p:打印地址范围内的行
% sed -n '/^yellow$/,$p' file
yellow
red
orange
more orange
more blue
this is enough

5

晚会:)

使用grep

grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
  • -P 使我们能够使用与Perl兼容的Regex

  • -z 使输入文件由ASCII NUL分隔,而不是换行符

  • -o 只需要所需的部分

  • (?s)是DOTALL修饰符,使我们能够使用令牌.(任何字符)匹配换行符

  • \n\K\n一个换行符相匹配,\K放弃比赛

  • yellow\n.*匹配yellow后跟换行符,此后的所有内容也会被选中并显示在输出中。

例:

% grep -Pzo '(?s)\n\Kyellow\n.*' file.txt
yellow
red
orange
more orange
more blue
this is enough

使用小python

#!/usr/bin/env python2
with open('file.txt') as f:
    lines = f.readlines()
    print ''.join(lines[lines.index('yellow\n'):])
  • lines 是包含文件所有行的列表(也带有尾随换行符)

  • lines.index('yellow\n')给我们的最低指数lines在那里yellow\n被发现

  • lines[lines.index('yellow\n'):]将使用列表分片获得部分从开始yellow\n直到结束

  • join 将连接列表中的元素以字符串形式输出


很好,但是您应该提到Python代码只能找到等于“ yellow”的整行,而不能检测到“ more yellow”这样的行。
字节指挥官

@ByteCommander从OP的例子,我认为它明确表示,他们希望只匹配yellow在line..also如果不是这样,那么我们需要改变python一个人的算法中..
heemayl

当然可以。无论如何,这并不是批评,只是改善答案的提示。读过这篇文章的其他人可能会认为该代码的工作方式grep与仅与整行不匹配。我赞成。
字节指挥官

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.