我有一个日志文件,我想从中提取这样的一行:
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 脚本中执行此操作?
谢谢
样本数据文件:
$ 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
并且假设第三个字段(sn
csip.date
sed
$ 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
包含其他非字母数字的.* =
- 匹配任何字符串(空格)+ =
+(空格)