awk:逐行读取文件,sed从列解析IP

时间:2014-01-18 01:59:42

标签: bash parsing sed awk ip

使用awk和sed解析日志文件时遇到问题。

以下文件:

DDDD;callID:4565;AAAA;Body:test message 1;BBBB;ng?10.1.5.60 4565;complete
DDDD;callID:5489;AAAA;Body:test message 2;BBBB;ng?10.4.100.3 5489;complete
DDDD;callID:3456;AAAA;Body:test message 3;BBBB;ng?10.200.1.5 3456;failed

使用以下命令可以从第7列中删除IP。我依赖于从结尾删除最后5个字符,只输出IP。

`awk -F";" ' {print $2 ";"  $4 ";" $7  ";" $6}' test.CSV | sed -e 's/Body://g; s/callID://g; s/ng?//g' | sed 's/.\{5\}$//'  >> complete.txt`

输出已完成:

4565;test message 1;complete;10.1.5.60
5489;test message 2;complete;10.4.100.3
3456;test message 3;failed;10.200.1.5

10次中有9次没问题,但刚发现第7列最后并不总是包含4位数字。第7列包含用户输入数据,因此如果输入的数字大于4位,则不会根据需要剥离IP。如何除去该列的IP以外的所有内容?

错误字段的示例:

DDDD;callID:3456;AAAA;Body:test message 3;BBBB;ng?10.200.1.5 3456345;failed

糟糕的输出:

3456;test message 3;failed;10.200.1.5 34

我正在尝试使用

grep -Eo '\b[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\b'

在{print .....}部分内但无法使其工作.....

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

$ awk -F'[:;?]' -v OFS=';' '{sub(/ .*/,"",$9); print $3,$6,$10,$9}' file
4565;test message 1;complete;10.1.5.60
5489;test message 2;complete;10.4.100.3
3456;test message 3;failed;10.200.1.5

答案 1 :(得分:0)

使用awk

awk '{split($2,a,":");split($4,b,":");split($6,c,"[? ]");print a[2],b[2],$7,c[2]}' FS=";" OFS=";" file

4565;test message 1;complete;10.1.5.60
5489;test message 2;complete;10.4.100.3
3456;test message 3;failed;10.200.1.5
相关问题