【问题标题】:How to Awk Paragraph in complex text file?如何在复杂的文本文件中 awk 段落?
【发布时间】:2010-09-25 01:08:37
【问题描述】:

我有一个非常混乱的简单日志文件,我需要它整洁。该文件包含日志头,但都混杂在一起,因此我需要根据日志头对日志文件进行排序。没有静态行数,这意味着文本文件的每个标题都没有固定的行数。我正在使用 AWK 来整理标题。

日志文件如下所示:

Car LogFile Header
<text>
<text>
<text>
Car LogFile Header
<text>
Car LogFile Header
<and so forth>

会这样输出:

Car LogFile Header
<text>
<text>
<text>
-------------------
Car Logfile Header
<text>
<text>

我已经完成/搜索了一个简单的代码,但它似乎不起作用。有人可以指导我吗?谢谢!

#!/bin/bash

# usage: pargrep <infile> <searchpattern>

inFile="$1"
searchString="$2"

awk '
BEGIN {
    FS="\n"
    RS="-----"
}
/'"$searchString"'/ { print }
' ${inFile}

【问题讨论】:

  • “它似乎不起作用”不是很丰富。它的行为与您的预期有何不同以及您收到的错误消息是什么?
  • 它给出一个错误“awk: cmd.line:6: //root/Desktop/Default.log/ { print } awk: cmd.line:6: ^ 语法错误awk: cmd. line:6: //root/Desktop/Default.log/ { print } awk: cmd.line:6: ^ unterminated regexp"
  • 如果您能提供样本输入和预期输出,那就太好了。谢谢
  • 由于政策原因,我无法在此处直接放置任何结果,但如果您查看我的帖子,我需要文本文件的结果如上所示 [EDITED]

标签: linux awk paragraph


【解决方案1】:

最好使用变量传递,而不是尝试正确地进行复杂的引用。

#!/bin/bash

# usage: pargrep <infile> <searchpattern>

inFile="$1"
searchString="$2"

awk -v selector=$searchString '
    BEGIN {
        FS="\n"
        RS="-----"
    }
    selector ~ $0 { print }
    ' "${inFile}"

【讨论】:

  • 现在它给了我“awk: cmd.line:3: fatal: cannot open file `pargrep' for reading (No such file or directory)”的错误......任何想法那?这个问题是因为额外的使用调用吗?
  • @JavaNoob:同样的错误信息?什么版本的awk?什么 Linux 发行版?
  • AWK 版本 3.1.5 和 Red Hat 5。
  • @JavaNoob:那么您不应该收到该错误消息。仔细检查您是否缺少任何单引号 ' 或双引号 " 或其中任何一个。
【解决方案2】:

稍微调整一下丹尼斯的回答:

awk -v selector="$searchString" '
    BEGIN { 
        RS = "Car LogFile Header\n" 
        ORS = "------"
    }
    selector ~ $0 { 
        print RS $0 
    }
' "${inFile}"

请注意,RS输入 记录分隔符。我用ORS来说明。

我假设“Car LogFile Header”是不变的。如果这是动态的,请告诉我们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-30
    • 2011-01-24
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多