awk 语法错误 意外的新行或字符串结尾

awk 语法错误 意外的新行或字符串结尾

/usr/sbin/conntrack -L |grep $1 | grep ESTAB |grep 'dport=80' | awk "{system("/usr/sbin/conntrack -D --orig-src $1 --orig-dst" substr($6,5) "-p tcp --orig-port-src " substr($7,7)" --orig-port-dst 80");}"

给出这个输出
awk: cmd. line:2: {system(/usr/sbin/conntrack awk: cmd. line:2: ^ unexpected newline or end of string

我需要调试这个。

答案1

你的awk脚本:

awk "{system("/usr/sbin/conntrack -D --orig-src $1 --orig-dst" substr($6,5) "-p tcp --orig-port-src " substr($7,7)" --orig-port-dst 80")}"

该脚本存在引用问题:

该脚本是用双引号括起来的,并且它也使用了双引号。内部双引号会引起问题。

解决方案是将脚本放在单引号中(awk脚本应该始终放在单引号中,这样$0shell 就不会解释等):

awk '{system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80")}'

grep您还可以轻松地将您正在执行的最后两个调用移至awk脚本中:

awk '/ESTAB/ && /dport=80/ {system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80");}'

再做一点工作,你也可以得到第一个:

awk -v arg1="$1" 'match($0, arg1) && /ESTAB/ && /dport=80/ {system("/usr/sbin/conntrack -D --orig-src " $1 " --orig-dst " substr($6,5) " -p tcp --orig-port-src " substr($7,7) " --orig-port-dst 80")}'

答案2

如果您想删除源 IP 地址$1(脚本的第一个参数)、原始目标端口 80 和状态的 conntrack TCP 条目ESTABLISHED,则应该是:

conntrack -D -s "$1" -p tcp --dport 80 --state ESTABLISHED

除了已经提到的问题之外,您的方法将匹配具有dport=8080以及的行或dport=80具有回复目的地。 in$1"--orig-src " $1是由 展开的行中的第一个字段awk,而不是脚本的第一个参数。另外,grep 10.1.1.4会匹配10.1.1.40甚至10.101.4.5grep -w(.作为正则表达式运算符匹配任何字符,并且不是单词特点)。

如果conntrack没有能力自行过滤条目,您宁愿执行以下操作:

conntrack -L | SRC=$1 awk '
  $1 == "tcp" && \
  $4 == "ESTABLISHED" && \
  $5 == "src=" ENVIRON["SRC"] && \
  $8 == "dport=80" {
    dst = substr($6, 5)
    sport = substr($7, 7)
    system("conntrack -D -s \"$SRC\" -d "dst" --dport 80 --sport "sport)
  }'

或者避免sh为每个要删除的条目运行一个命令(除了一个conntrack命令之外):

conntrack -L | SRC=$1 awk '
  $1 == "tcp" && \
  $4 == "ESTABLISHED" && \
  $5 == "src=" ENVIRON["SRC"] && \
  $8 == "dport=80" {
    dst = substr($6, 5)
    sport = substr($7, 7)
    print "conntrack -D -s \"$SRC\" -d "dst" --dport 80 --sport "sport
  }' | sh

相关内容