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
    • 最新
    • 标签
主页 / unix / 问题 / 689512
Accepted
Daniel
Daniel
Asked: 2022-02-07 02:58:50 +0800 CST2022-02-07 02:58:50 +0800 CST 2022-02-07 02:58:50 +0800 CST

带有退出条件的 Grep

  • 772

我有一个巨大的文件,我想用 grep 的简单过滤器显示它:

假设这是我的文件:

TIME0 random data
TIME1 random data
TIME2 INTERESTING LINE
TIME3 random data
TIME4 random data
TIME5 random data
TIME6 random data
TIME7 INTERESTING LINE
TIME8 random data
TIME9 random data
TIME10 random data
TIME11 INTERESTING LINE
TIME12 random data

我想显示INTERESTING LINE:

grep "INTERESTING LINE" myfile

这可行,但文件很大,包含数百万个INTERESTING LINE。我只需要最后一个:

tac myfile | grep -m3 "INTERESTING LINE"

这行得通,但是我怎样才能指定我只在某个TIME前缀之后才需要INTERESTING LINE ?(或直到某个时间)tac

因此,例如使用上面的示例文件,我如何才能从 myfile 中 grep 所有INTERESTING LINE从最后到TIME7?(所以不需要 TIME2 的有趣行):

TIME11 INTERESTING LINE
TIME7 INTERESTING LINE

订购并不重要,我可以接受 ASC 或 DESC 订购。

重要的是不要扫描整个文件,即从文件末尾逐行扫描。

我正在寻找一种为 grep 提供退出标准的方法(而不是用 定义最大结果数-m)

grep
  • 1 1 个回答
  • 82 Views

1 个回答

  • Voted
  1. Best Answer
    they
    2022-02-07T03:12:27+08:002022-02-07T03:12:27+08:00

    使用sed而不是grep更好地控制输入数据的解析:

    $ tac file | sed -n -e '/^TIME6 /q' -e '/INTERESTING LINE/p'
    TIME11 INTERESTING LINE
    TIME7 INTERESTING LINE
    

    这将tac按照您的建议反转文件,并将反转的数据通过sed.

    两种sed表达方式:

    • /^TIME6 /q, 一旦我们找到以 . 开头的行就退出TIME6 。您还可以使用/^TIME[0-6] /q或任何与时间列匹配的表达式,这些时间列太旧而无法引起人们的兴趣。

    • /INTERESTING LINE/p, 打印与给定正则表达式匹配的所有行。

    效果是文件只被读取,直到我们发现时间戳太新。在解析过程中发现的任何有趣的行都会打印到标准输出。

    如果您知道TIME7要搜索的确切时间戳,直到:

    $ tac file | sed -n -e '/INTERESTING LINE/p' -e '/^TIME7 /q'
    TIME11 INTERESTING LINE
    TIME7 INTERESTING LINE
    

    如果感兴趣的话,这允许我们打印最后读取的行,即使它正是我们想要退出的时间戳。

    • 4

相关问题

  • 来自 `service | 的意外结果 grep`

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve