【问题标题】:Remove Characters with awk使用 awk 删除字符
【发布时间】:2014-10-23 19:01:01
【问题描述】:

我正在编写一个脚本来阻止 SFTP 服务器上登录失败的 IP 地址。我还使用 Centrify 将服务器连接到 AD,并且我注意到 Centrify 记录用户访问的方式与正常情况不同。我可以使用以下一行提取失败登录的 IP 地址:

(grep sshd /var/log/messages | grep "AUTH_FAIL_PASSWD" | awk '{print $18}' | sort | uniq -c | awk '{ if ( $1 > 10) print $2 }')

使用 Centrify 可以得到以下输出:

client=0.0.0.0

我需要做的是删除“client=”,这样我就可以只将 IP 地址传递给脚本的其余部分。

感谢您的帮助!

【问题讨论】:

  • 任何时候你用 grep 和 awk 这样的管道,你就犯了一个错误。 awk 可以为您进行过滤。 /sshd/ && /AUTH_FAIL_PASSWD/ {print $18}
  • 您也可以在 awk 中进行重复数据删除(以将条目保留在内存中为代价),而无需排序。
  • {if ($1 > 10) print $2} 可以改写为$1 > 10 {print $2}

标签: awk sed ksh


【解决方案1】:

让我们开始摆脱命令行中所有无用的管道。将整个内容更改为仅此一个 awk 命令:

awk '/sshd/&&/AUTH_FAIL_PASSWD/{cnt[$18]++} END{for (ip in cnt) if (cnt[ip] > 10) print ip}' /var/log/messages

现在 - 更新您的问题以包含一些示例输入(/var/log/messages 的内容)和预期输出,并根据这些文件中的文本告诉我们您正在尝试做什么。

哦,我想我明白了。这可能是你想要的:

awk '/sshd/&&/AUTH_FAIL_PASSWD/{sub(/.*=/,"",$18); cnt[$18]++} END{for (ip in cnt) if (cnt[ip] > 10) print ip}' /var/log/messages

【讨论】:

  • 谢谢!第二个 awk 命令可以解决问题。该脚本的总体目标是阻止 SFTP 服务器登录尝试失败的 IP 地址。我注意到我的服务器受到同一组 IP 地址的攻击。
【解决方案2】:

您可以将其转储回 awk:

(grep sshd /var/log/messages | grep "AUTH_FAIL_PASSWD" | awk '{print $18}' | sort | uniq -c | awk '{ if ($1 > 10) print $2 }' | awk -F" ="'{ 打印 $2 }')

最后一个 awk 用等号作为分隔符分割字符串并打印第二个元素。

【讨论】:

    【解决方案3】:

    你没说,但是如果ip是$18

    ... | awk '{if(split($18,a,/=/)==2) print a[2]; else print a[1] }' | ...
    

    应该做你想做的事

    更简单

    ... | awk '{sub(/.*=/,"",$18); print $18}'  | ...
    

    此外,我喜欢管道,在许多情况下它们清楚地表明了您的意图,但也许值得接受至少部分其他答案的建议

     awk '/sshd/&&/AUTH_FAIL_PASSWD/ {
          sub(/.*-/,"",$18; print $18}' /var/log/messages | sort | ...
    

    【讨论】:

    • 是的,抱歉,在 /var/log/messages 中,Centrify 将 IP 转储到 18 美元的位置。但它会将其转储为“client=0.0.0.0”。谢谢。
    猜你喜欢
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-04-01
    • 2015-10-25
    • 2022-10-19
    相关资源
    最近更新 更多