【问题标题】:Print log in unix starting text在Unix开始文本中打印日志
【发布时间】:2016-03-27 23:57:08
【问题描述】:

我有一个巨大的日志文件,我想将一个从文本开始的日志复制到我的本地目录。

日志文件名

'cktrm.ecg-2015-12-21.gz'

我运行的命令是

bash-3.2$ gzgrep '2665941' cktrm.ecg-2015-12-21.gz > ~/log.txt

但这只会将所有包含 2665941 的行复制到文本文件中。

我需要的是从该文本开始复制到文件末尾。

例如:

...
log.info [id = 2665941]
log.debug ....
log.debug ...
log.debug [add to id 2665941]
...

当前打印到文本文件的是

log.info [id = 2665941]
log.debug [add to id 2665941]

我需要的是

log.info [id = 2665941]
log.debug ....
log.debug ...
log.debug [add to id 2665941]
...

【问题讨论】:

    标签: linux unix logging grep


    【解决方案1】:

    您可以使用一个简短的 awk 程序,从找到模式的位置开始打印其输入:

    zcat cktrm.ecg-2015-12-21.gz | awk "/2665941/ {printLog = 1}
    printLog { print }" > ~/log.txt
    

    注意:这是一个单个命令,但它由两行组成。如果您在带引号的字符串中间按回车键,bash 会给您一个辅助提示,您将能够继续到命令的下一行,当然您需要关闭引号。

    zcat 解压缩您的文件,其输出是 awk 命令的输入。

    awk 脚本的意思是:

    1. 当当前行匹配给定模式(在本例中为2665941)时,将printLog 参数设置为1。
    2. 当 printLog 参数设置为非零值时,打印当前行。

    这意味着从找到第一次出现的模式的那一刻起,它将打印所有行。

    最后,awk 的输出被重定向到您请求的文件。

    【讨论】:

    • 对不起,我不能使用 zcat、zgrep 等。它在管理网络上,我也没有使用外部程序的权限。
    • @user3659052 但是您使用了 gzgrep...您在说什么外部程序?
    • 实际上这行得通。只需要将 zcat 更改为 gzcat
    • 我很笨,很匆忙,没想到在移植整个文件后我可以使用 vim 来搜索和修剪文件。
    • @user3659052 实际上,对非常大的文件使用vim 会有问题。它会在磁盘上创建大量数据以帮助恢复和撤消操作。
    【解决方案2】:

    如果您知道开始和结束标记的具体格式,您可以使用 awk 来实现您所需要的:

    cat > test-file
    hear no evil
    no evil here
    start see no evil
    know no evil
    no evil known here
    end see no evil
    no know evil
    ^D
    

    只显示'start see no evil'和'end see no evil'之间的行

    cat test-file | awk  -e '/start/,/end/ {print}'
    

    产生以下输出

    start see no evil
    know no evil
    no evil known here
    end see no evil
    

    【讨论】:

    • 这我知道,但问题是当有更多行可以适合您的屏幕时,当管理员清除缓存框时,您将无法导出以检查文本文件中的日志跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    相关资源
    最近更新 更多