【问题标题】:awk: read file line by line and sed to parse IP from columnawk:逐行读取文件并 sed 从列中解析 IP
【发布时间】:2014-01-18 16:01:55
【问题描述】:

我在使用 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.....} 部分内,但无法使其工作.....

提前感谢您的帮助。

【问题讨论】:

  • 如果您已经在使用 awk,则永远不需要 sed,因为 sed 没有什么可以做 awk 做不到的。

标签: bash parsing sed awk ip


【解决方案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

【讨论】:

    【解决方案2】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 2018-04-25
      • 1970-01-01
      • 2013-02-16
      • 2014-07-11
      • 2012-07-16
      • 2012-05-27
      • 1970-01-01
      • 2015-10-23
      • 2015-01-12
      相关资源
      最近更新 更多