【问题标题】:Shell script for string search between particular lines, timestamps用于在特定行、时间戳之间进行字符串搜索的 Shell 脚本
【发布时间】:2016-10-14 01:02:38
【问题描述】:

我有一个超过 10000 行的文件。我正在尝试在 2 个时间戳之间的特定行集之间搜索字符串。

我正在使用 sed 命令来实现这一点。

sed -n '1,4133p' 文件名 | sed -n '/'2015-08-12'/, /'2015-09-12'/p' 文件名 | grep -i "字符串"

通过上面的命令,我得到了想要的结果。上面的命令考虑的是整个文件而不是我指定的行。

有没有办法做到这一点?

请帮忙

【问题讨论】:

  • 使用filename 对通过管道连接的sed 进行2 次调用会招致麻烦。只需删除 cmd 行中的第二个 filename 即可。这没有帮助吗?祝你好运。

标签: shell unix sed grep


【解决方案1】:

我认为问题出在这里:

sed -n '1,4133p' filename | sed -n '/'2015-08-12'/, /'2015-09-12'/p' filename |
                                                                     ^^^

您希望将第一个 sed 命令的输出通过管道传输到第二个。按照您的方式,第一个输出被破坏并替换为重新扫描文件。

试试这个:

sed -n '1,4133p' filename | sed -n '/'2015-08-12'/, /'2015-09-12'/p' | grep -i "string"

【讨论】:

  • 我实际上认为第二个sed 语句的语法对多个单引号感到好奇...你能试试sed -n '1,4133p' filename | sed -n '/2015-08-12/,/2015-09-12/p' | grep -i "string"
【解决方案2】:

任何时候你发现自己将 seds 和 greps 的管道链接在一起时停止,而只需使用 1 个 awk 命令:

awk -v IGNORECASE=1 '/2015-08-12/{f=1} f&&/string/; /2015-09-12/||(NR==4133){exit}' file

上面使用 GNU awk 表示 IGNORECASE,使用其他 awk 你只需将 /string/ 更改为 tolower($0)~/string/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2011-12-12
    • 1970-01-01
    • 2019-04-18
    • 2012-11-05
    • 2015-12-21
    相关资源
    最近更新 更多