首页 > 解决方案 > 如何打印文件的每一行,同时将第 n 列添加到行的前面以构造 apf ban 命令

问题描述

重击 4.4.0
Ubuntu 16.04

如何打印文件的每一行,同时将第 n 列添加到行的前面以构造apf禁止命令。

这是我的名为 .syncflood-violations.log 的源文件:

[Thu  Nov  14  17:08:19  2019]  SRC=178.128.184.16   DST=XXX.XXX.XXX.XXX  SPT=57858  DPT=80
[Mon  Nov  18  19:29:42  2019]  SRC=83.248.31.89     DST=XXX.XXX.XXX.XXX  SPT=54667  DPT=40033
[Tue  Nov  19  14:45:11  2019]  SRC=47.92.201.62     DST=XXX.XXX.XXX.XXX  SPT=50322  DPT=80
[Wed  Nov  20  14:30:02  2019]  SRC=104.152.52.32    DST=XXX.XXX.XXX.XXX  SPT=56417  DPT=5938
[Mon  Nov  25  05:20:42  2019]  SRC=92.246.84.85     DST=XXX.XXX.XXX.XXX  SPT=45576  DPT=80

这是我的一些脚本:

dmesg -T | grep -- 'INSYN_SRC_LIMIT' | awk '{ print $1,$2,$3,$4,$5,$11,$12,$19,$20,$21 }' | sed -e 's/PROTO=TCP//g; s/WINDOW.*//g' | column -t | awk '!seen[$6]++' >> .syncflood-violations.log;
sleep .5;
while read -r line; do
  Banip="$(awk '{ print $6 }' | sed -e 's/SRC=//g')"
  #echo "/usr/local/sbin/apf -d $Banip \"$line\""  >> banthem.sh
  echo "/usr/local/sbin/apf -d $(awk '{ print $6 }') \"$line\"" >> banthem.sh
done<.syncflood-violations.log

我的回声线不成功。

这是我想要的结果:

/usr/local/sbin/apf -d 58.180.101.13 "[Sat Nov 2 09:36:24 2019] SRC=58.180.101.13 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"
/usr/local/sbin/apf -d 178.128.184.16 "[Sat Nov 2 09:36:24 2019] SRC=178.128.184.16 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"
/usr/local/sbin/apf -d 83.248.31.89 "[Sat Nov 2 09:36:24 2019] SRC=83.248.31.89 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"
/usr/local/sbin/apf -d 58.180.101.13 "[Sat Nov 2 09:36:24 2019] SRC=58.180.101.13 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"
/usr/local/sbin/apf -d 58.180.101.13 "[Sat Nov 2 09:36:24 2019] SRC=58.180.101.13 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"
/usr/local/sbin/apf -d 58.180.101.13 "[Sat Nov 2 09:36:24 2019] SRC=58.180.101.13 DST=XXX.XXX.XXX.XXX SPT=34345 DPT=80"

标签: bashawksed

解决方案


这可以单独完成awk,您能否尝试以下操作(使用所示示例编写和测试);您可以使用.syncflood-violations.log文件作为此代码的输入)。

awk -v s1="\"" '
match($0,/SRC[^ ]*/){
  print "/usr/local/sbin/apf -d " substr($0,RSTART+4,RLENGTH-1) s1 substr($0,1,RSTART-1) substr($0,RSTART+RLENGTH) s1
}
'  Input_file

推荐阅读