如何在文本文件中分离(获取)十六进制数字键相关的整行和DEBUG的整行,然后存储在不同的文件中,其中键是这种格式:“[uid key]”? 即忽略任何不是 DEBUG 的行。
in.txt:
[ uid 28fd4583833] DEBUG web.Action
[ uid 39fd5697944] DEBUG test.Action
[ uid 56866969445] DEBUG test2.Action
[ uid 76696944556] INFO test4.Action
[ uid 39fd5697944] DEBUG test7.Action
[ uid 85483e10256] DEBUG testing.Action
输出文件命名为“out”+ i +“.txt”,其中 i = 1、2、3、4。 即
out1.txt:
[ uid 28fd4583833] DEBUG web.Action
out2.txt:
[ uid 39fd5697944] DEBUG test.Action
[ uid 39fd5697944] DEBUG test7.Action
out3.txt:
[ uid 56866969445] DEBUG test2.Action
out4.txt:
[ uid 85483e10256] DEBUG testing.Action
我试过:
awk 'match($0, /uid ([^]]+)/, a) && /DEBUG/ {print > (a[1] ".txt")}' in.txt
最佳答案
如果您愿意更改输出文件名以包含 key (坦率地说,这似乎比名称中的单计数器更有用),您可以这样做:
awk '/DEBUG/{print > ("out-" $3 ".txt")}' FS='[][ ]*' in.txt
这会将所有与字符串 DEBUG
和 key 85483e10256
匹配的行放入文件 out-85483e10256.txt
等中。
如果你确实想保留单次计数器,你可以这样做:
awk '/DEBUG/{if( ! a[$3] ) a[$3] = ++counter;
print > ("out" a[$3] ".txt")}' FS='[][ ]*' in.txt
基本上,想法是使用正则表达式 [][ ]*
作为字段分隔符,它匹配一串方括号或空格。这样,$1
是初始 [
之前的文本,$2
是字符串 uid
,而 $3
是关键。这将(应该!)正确地获取可能具有略微不同的空白的行的键。我们使用关联数组来跟踪哪些键已经被看到以跟踪计数器。但在输出文件名中使用 key 确实更干净。
https://stackoverflow.com/questions/72297811/