-1

我有一个日志文件,我想从中提取这样的一行:

ERROR_RECHARGING! =====> THE CS IP = 10.10.10.10 and PASS = sdas3asdasd and SN = DFGT5334rFFDS IS RECHARGING NOW

之后,我只想获取 IP 值、Pass 值和 SN 值并以这种模式将其写入另一个文件:

ip;pass;sn

如何使用 sed 或 awk 在 bash 脚本中执行此操作?

谢谢

4

1 回答 1

1

样本数据文件:

$ cat csip.dat
ignore this line
ERROR_RECHARGING! =====> THE CS IP = 10.10.10.10 and PASS = sdas3asdasd and SN = DFGT5334rFFDS IS RECHARGING NOW
ignore this line
ERROR_RECHARGING! =====> THE CS IP = 85.13.125.158 and PASS = sdwXHWEFFsd and SN = 123abcd__243D IS RECHARGING NOW
ignore this line

OPssed代码(来自评论)...

$ sed 's/ERROR_RECHARGING! =====> THE CS IP = ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) and PASS = ([^ ]*) and SN = ([:alnum:]*) IS RECHARGING NOW/\1;\2;\3/g' csip.dat

...需要一些调整:

  • 添加标志-rn以允许扩展正则表达式支持并禁止将输入数据自动打印到标准输出
  • 更改[:allnum:][[:alnum:]]
  • 更改/g/p以从替换模式更改为打印模式

sed命令如下所示:

$ sed -rn 's/ERROR_RECHARGING! =====> THE CS IP = ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}) and PASS = ([^ ]*) and SN = ([[:alnum:]]*) IS RECHARGING NOW/\1;\2;\3/p' csip.dat
10.10.10.10;sdas3asdasd;DFGT5334rFFDS

至此,我们已经完成了 OP 对给定数据集的要求。


假设可能有不止一行要处理,ERROR_RECHARGING并且假设第三个字段(sncsip.datesed

$ sed -rn 's/ERROR_RECHARGING! =====> THE CS IP = ([^ ]*) and PASS = ([^ ]*) and SN = ([^ ]*) .*/\1;\2;\3/p' csip.dat
10.10.10.10;sdas3asdasd;DFGT5334rFFDS
85.13.125.158;sdwXHWEFFsd;123abcd__243D

# or with some additional shorthand:

$ sed -rn 's/^ERROR_RECHARGING.* = ([^ ]*) .* = ([^ ]*) .* = ([^ ]*) .*/\1;\2;\3/p' csip.dat
10.10.10.10;sdas3asdasd;DFGT5334rFFDS
85.13.125.158;sdwXHWEFFsd;123abcd__243D

在哪里:

  • ([^ ]*)- 匹配 (space) + (anything_other_than_space) + (space) 的模式;消除[0-9]{1,3}了 ip 的冗长匹配;还允许我们匹配sn包含其他非字母数字的
  • .* = - 匹配任何字符串(空格)+ =+(空格)
于 2020-10-23T17:10:31.107 回答