【问题标题】:How to use sed to grep specifc values from a file如何使用 sed 从文件中 grep 特定值
【发布时间】:2017-04-07 10:02:04
【问题描述】:

我是使用 sed 命令的新手,我的问题可能是一个基本问题。

我有一个日志文件,我正在尝试仅 grep 错误并从错误行中提取一些必需的值。

当 sed 中有超过 9 个模式组时,我遇到了一个问题。我尝试使用 sed -e 来拥有多个 sed,但它似乎不起作用。

尝试的命令

命令#1:

grep ERROR file | sed -n 's_.*key1=\([0-9]*\), key2=\([0-9]*\),.* key3=(.*\), key4=\([a-zA-Z0-9_]*\),.* key5=\([A-Z0-9]*\),.*key6=\([a-zA-Z0-9]*\),.*key7=\([0-9]*\), key8=\(.*\), key9=\(.*\), key10=\(.*\)}.*_\1,\2,\3,\4,\5,\6,\7,\8,\9,\10_p'

在上面的输出中,打印的是数字 10,而不是匹配第 10 个模式的值

命令 #2:

虽然我无法将其格式化为正确的逗号分隔值,但这个 AWK 命令几乎完成了我想要的操作。

awk -F "\n" '/ERROR/ && match($0,/key1=([0-9]*), key2=([0-9]*),.*key3=(.*),key4=([a-zA-Z0-9_]*),.*key5=([a-z]*).*key6=([a-z]*),.*key7=([A-Z0-9]*),.*key8=([0-9]*).*key9=([a-zA-Z0-9]*)/,a) {
    for (i=1; i in a; i++) {
        printf "%s%s", a[i], (i<length(a) ? OFS : ORS)
    }
    printf "\n"
}' TestFile

【问题讨论】:

标签: linux awk sed


【解决方案1】:

只需使用 awk。您应该已经在考虑 awk,因为您使用的是 grep+sed。使用 GNU awk 将第三个参数匹配():

awk -v OFS=',' '/ERROR/ && match($0,/key1=([0-9]*), key2=([0-9]*),.* key3=(.*), key4=([a-zA-Z0-9_]*),.* key5=([A-Z0-9]*),.*key6=([a-zA-Z0-9]*),.*key7=([0-9]*), key8=(.*), key9=(.*), key10=(.*)}/,a) {
    for (i=1; i in a; i++) {
        printf "%s%s", a[i], (i<length(a) ? OFS : ORS)
    }
}' file

但如果您发布了简洁、可测试的示例输入和预期输出,我们可能会为您提供更简单的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-28
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多