在Bash中格式化文本输出

时间:2016-11-03 15:18:56

标签: linux bash awk sed formatting

我有一些来自pdsh的输出我想格式化它以加载到DB中。我需要3列,基本上需要模块ID和消息在一行。贝娄是我的输出:

10.125.45.58,scope, Module ID     = server-1
10.125.45.58,scope, Message       = Correctable memory error
10.125.45.58,scope, Module ID     = server-2
10.125.45.58,scope, Message       = Correctable memory error 

这是我需要的输出:

10.125.45.58,scope,server-1 Correctable memory error
10.125.45.58,scope,server-2 Correctable memory error

我一直在想着......我无法解决任何想法?

这是我到目前为止所做的事情

cat myfile.txt | sed -e "s/:/\,scope\,/g" | grep -E '(Module ID|Message)'

谢谢。

2 个答案:

答案 0 :(得分:1)

$ cat ip.txt 
10.125.45.58,scope, Module ID     = server-1
10.125.45.58,scope, Message       = Correctable memory error
10.125.45.58,scope, Module ID     = server-2
10.125.45.58,scope, Message       = Correctable memory error 

$ sed 'N; s/\n.*=//; s/ *Module ID.*= *//' ip.txt 
10.125.45.58,scope,server-1 Correctable memory error
10.125.45.58,scope,server-2 Correctable memory error 
  • N获取下一行,因此替换适用于一起考虑的每两行
  • s/\n.*=//;从换行符删除到上一个=
  • s/ *Module ID.*= *//然后删除Module ID=周围可选空格的所有内容

答案 1 :(得分:0)

sed用于单行上的简单替换,即全部。对于其他任何事情,您应该使用awk实现可移植性,效率,简单性,清晰度,可维护性以及软件的大多数其他理想属性:

$ awk 'NR%2{srvr=$NF;next} {ip=$1; sub(/.*=/,""); print ip srvr $0}' file
10.125.45.58,scope,server-1 Correctable memory error
10.125.45.58,scope,server-2 Correctable memory error