【问题标题】:Why does the gsub function have to be used before match function in this instance?为什么在这种情况下必须在 match 函数之前使用 gsub 函数?
【发布时间】:2017-04-23 01:38:17
【问题描述】:

我正在解析一个如下所示的 auth.log 文件:

Dec 4 00:22:36 ip-172-31-23-55 sshd[3033]: Connection from 85.93.5.70 port 50208 on 172.31.23.55 port 22

转换成如下所示的 CSV 输出:

Dec, 4, 00 22 36, 85.93.5.69

下面的 awk 代码正确地产生了我想要的,就像在上面的例子中一样:

BEGIN {
  OFS=", "
} 
{
  gsub(/:/, " ", $3)
  match($0, /([1-9]{1,3}[\.]){3}[0-9]{1,3}/) 
  print $1, $2, $3, substr($0, RSTART, RLENGTH) 
}

但是,如果我翻转 gsub 和 match 函数,如

BEGIN {
  OFS=", "
} 
{
  match($0, /([1-9]{1,3}[\.]){3}[0-9]{1,3}/)
  gsub(/:/, " ", $3)
  print $1, $2, $3, substr($0, RSTART, RLENGTH) 
}

我得到以下输出:

Dec, 4, 00 22 36,  from, 85.

这没什么意义。 gsub 只是在寻找“:”,并且匹配找到了一个 IP 地址。使用 sub 而不是 gsub 时会观察到相同的行为。

我很困惑这些功能是如何相互影响的。

【问题讨论】:

    标签: awk gawk


    【解决方案1】:

    当您修改 $3 时,awk 会重新编译记录,将每个空白字符替换为您的 2 个字符的 OFS 值,因此 $0 的长度不再与以前相同,因此重新编译记录之前的 RSTART 值不指向新编译记录中的预期字符。看:

    $ awk 'BEGIN { OFS=", " } { print; gsub(/:/, " ", $3); print }' file
    Dec 4 00:22:36 ip-172-31-23-55 sshd[3033]: Connection from 85.93.5.70 port 50208 on 172.31.23.55 port 22
    Dec, 4, 00 22 36, ip-172-31-23-55, sshd[3033]:, Connection, from, 85.93.5.70, port, 50208, on, 172.31.23.55, port, 22
                                                               ^
                                                          NOTE |
    

    请注意,当您执行 match() 时,85.93.5.70 从哪里开始,现在 from, 从相同的字符数开始(即保存在 RSTART 中的值)。

    我强烈推荐 Arnold Robbins 的《Effective Awk Programming, 4th Edition》一书。

    【讨论】:

      【解决方案2】:

      您能否尝试关注一下,如果这对您有帮助,请告诉我。

      echo "Your_Input_as mentioned_above" | awk --re-interval '{split($3, A,":");match($0,/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/);print $1, $2, A[1], A[2], A[3],substr($0,RSTART,RLENGTH)}'
      

      希望这会有所帮助。我也在 GNU awk 中对此进行了测试。

      【讨论】:

      • --re-interval 在过去 5 年的 gawk 版本中都不需要。
      猜你喜欢
      • 1970-01-01
      • 2020-08-19
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多