有一个日志文件,其中包含以下数据:2019-07-18 12:00:00,000 login1 abc-def-geh 2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij
我试图使用sed (或任何其他bash文本处理工具)处理该文件,以获得以下输出:2019-07-18 12:00:00,000 login1 abc-def-geh 2019-07-18 12:00:00,001 login2 abc-def-geh 2019-07-18 12:00:00,001 login2 bcd-efg-hij
或者反过来说:
发布于 2019-07-18 10:08:36
awk '$NF~/,/{split($NF,a,",");$NF="";for(x in a)print $0a[x];next}7' file这句话会有帮助的。
是的,这类部件最多可达数百个(IDs)。
发布于 2019-07-18 10:19:57
Perl是实现目标的更慷慨的工具。试试这个:
perl -nle 'm/(.*) (\S+) (\S+)$/; print "$1 $2 $_" foreach split ",", $3'发布于 2019-07-18 10:32:32
sed ': c; s/^\([^ ]\+ [^ ]\+ [^ ]\+\) \([^\n,]\+\),\(.*\)/\1 \3\n\1 \2/; t c; s/\([^\n]*\)\n\(.*\)/\2\n\1/': c声明标签c (来自“继续”的简短助记符)^\([^ ]\+ [^ ]\+ [^ ]\+\) -匹配前三部分\([^\n,]\+\) -匹配第一部分直到逗号。当找到换行符时也停止匹配,这在以后很重要., --如果我们在换行符处停下来,我们就应该停止处理。如果我们在逗号处停下来,我们应该匹配一个逗号。\(.*\) -记住逗号后面的其他部分。\1 \3\n\1 \2 --在输入的末尾添加匹配的部分。因此,在下一次迭代中,我们可以一次一次地匹配(一次又一次……)。我们停止matchine,然后\3不再有逗号,那么\([^\n,]\+\),正则表达式部分就会失败,因为没有逗号。t c --如果最后的s///命令成功,则将分支标记为c。直到逗号为字符串时,s///才会成功。s/\([^\n]*\)\n\(.*\)/\2\n\1/ --将第一行移动到最后一行。没有它,最后的模式将是第一个。只需匹配第一行并移动它。测试(随机输入以获得更多的输入数据):
cat <<EOF |
2019-07-18 12:00:00,000 login1 abc-def-geh
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij,bfdsabfasdh
2019-07-18 12:00:00,001 login2 abc-def-geh,bcd-efg-hij,bfdsabfasdh,fdsmfasfda,f,da,dfas,fd,asf,das,fsd,af,a,fdsafasdfsda,fasd
EOF
sed ': c; s/^\([^ ]\+ [^ ]\+ [^ ]\+\) \([^\n,]\+\),\(.*\)/\1 \3\n\1 \2/; t c; s/\([^\n]*\)\n\(.*\)/\2\n\1/'将产出:
2019-07-18 12:00:00,000 login1 abc-def-geh
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 bfdsabfasdh
2019-07-18 12:00:00,001 login2 abc-def-geh
2019-07-18 12:00:00,001 login2 bcd-efg-hij
2019-07-18 12:00:00,001 login2 bfdsabfasdh
2019-07-18 12:00:00,001 login2 fdsmfasfda
2019-07-18 12:00:00,001 login2 f
2019-07-18 12:00:00,001 login2 da
2019-07-18 12:00:00,001 login2 dfas
2019-07-18 12:00:00,001 login2 fd
2019-07-18 12:00:00,001 login2 asf
2019-07-18 12:00:00,001 login2 das
2019-07-18 12:00:00,001 login2 fsd
2019-07-18 12:00:00,001 login2 af
2019-07-18 12:00:00,001 login2 a
2019-07-18 12:00:00,001 login2 fdsafasdfsda
2019-07-18 12:00:00,001 login2 fasd注意,在替换列表中使用sed内部的\n是一个gnu扩展。
https://stackoverflow.com/questions/57091846
复制相似问题