【发布时间】: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
【问题讨论】:
-
提及一些示例行和您期望的输出
-
你已经尝试了什么?在 stackoverflow 和整个互联网上有很多帖子在讨论这个问题。请让我们知道您的发现和尝试,以及为什么他们没有帮助。试试这个:stackoverflow.com/questions/4318114/…
-
perl -pe 's/(match)(str)/$2$1/g;'- 这是stackoverflow.com/questions/4318114/… 中发布的建议,但我仍然不确定。我在我的问题中发布的 sed 命令中有多个模式组。我怎样才能应用上述 perl 命令中的所有模式 -
请推荐初学者学习SED的最佳材料