AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 727693
Accepted
john smith
john smith
Asked: 2016-01-31 13:06:28 +0800 CST2016-01-31 13:06:28 +0800 CST 2016-01-31 13:06:28 +0800 CST

我需要有关 Grep 的帮助才能从某个部分开始

  • 772

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

green
blue
cyan
magenta
purple
brown
yellow
red
orange
more orange
more blue
this is enough
command-line
  • 5 5 个回答
  • 4236 Views

5 个回答

  • Voted
  1. Best Answer
    Sergiy Kolodyazhnyy
    2016-01-31T13:10:14+08:002016-01-31T13:10:14+08:00

    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)
    

    Python

    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()
    
    • 9
  2. Pilot6
    2016-01-31T13:09:22+08:002016-01-31T13:09:22+08:00

    你可以这样做:

    awk '/yellow/{f=1}f' file
    

    其中“file”是包含您的文本的文件名。

    • 5
  3. kos
    2016-01-31T13:49:04+08:002016-01-31T13:49:04+08:00

    不是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
  4. heemayl
    2016-01-31T18:17:04+08:002016-01-31T18:17:04+08:00

    派对迟到了:)

    使用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将连接列表的元素以输出为字符串

    • 5
  5. steeldriver
    2016-02-01T06:31:16+08:002016-02-01T06:31:16+08:00

    由于问题是指查看文件,所以总是有好的 ol'

    less +/yellow file
    
    • 4

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve