在列

时间:2016-08-25 14:57:15

标签: bash awk sed grep printf

我有一个大型日志文件,我需要从中提取一些特定数据,更准确地说,重复出现的不同字段的值,即我需要从许多CDR中获取一些信息,例如呼叫类型,起源编号等。

原始文本格式如下:

Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
..
A_NUMBER.ADDRESS = XXX
..

使用egrep我设法得到了所需的行,看起来像是:

 Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
 RECORD_IDENTIFICATION.FILE_ID: XXX
 A_NUMBER.ADDRESS = XXX
 Call is from XXXX, VDATE=XXXX.

但我无法以表格样式格式化它们,按Reason,File_ID,A_Num和Call Date分组,作为列标题, 像

Reason Code | File_ID | A_Number | Date 
  xxxx | xxxx | xxxx | xxxx | 

我对外观并不感兴趣,我只想让元素连续,以便属于同一个电话。

我搞砸了awk,sed和printf的不同变种,但似乎没什么用。

我试图将总字符值作为参数放在printf

printf "%-205s\n" $(grep -E 'Reason Code|RECORD_IDENTIFICATION.FILE_ID|A_NUMBER.ADDRESS|Call is from' file.err)

printf "%-65s | %-65s |  %-65s | %-65s" $(grep -E 'Reason Code|RECORD_IDENTIFICATION.FILE_ID|A_NUMBER.ADDRESS' file.err | awk 'FS = "\n" {print $1}')

但输出中的值被扰乱且无法使用。

在我看来,解决方案可能存在某种循环,awk似乎支持,但我无法解决它。

非常感谢任何帮助。

谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用grep转换sed命令的输出:

sed 'N;N;N;s/Reason Code:"\([^"]*\).*FILE_ID: \([^\n]*\).*A_NUMBER.ADDRESS = \([^\n]*\).*VDATE=\([^.]*\).*/\1 \2 \3 \4/'

$ echo ''' Reason Code:"XXX",  Result Code:XXX, Desc: "XXX"
 RECORD_IDENTIFICATION.FILE_ID: XXX
 A_NUMBER.ADDRESS = XXX
 Call is from XXXX, VDATE=XXXX.''' | sed 'N;N;N;s/Reason Code:"\([^"]*\).*FILE_ID: \([^\n]*\).*A_NUMBER.ADDRESS = \([^\n]*\).*VDATE=\([^.]*\).*/\1 \2 \3 \4/'
 XXX XXX XXX XXXX

但是,最好避免使用grep,让sed也进行过滤。我不能提出这样的解决方案,因为您没有发布未经过滤的数据的格式。