我有一个大型日志文件,我需要从中提取一些特定数据,更准确地说,重复出现的不同字段的值,即我需要从许多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似乎支持,但我无法解决它。
非常感谢任何帮助。
谢谢
答案 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
也进行过滤。我不能提出这样的解决方案,因为您没有发布未经过滤的数据的格式。