用awk删除字符

用awk删除字符,awk,sed,ksh,Awk,Sed,Ksh,我有一个脚本,我正在努力阻止在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 }') 使用“居中”可获得

我有一个脚本,我正在努力阻止在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 }')
使用“居中”可获得以下输出:

client=0.0.0.0
我需要做的是删除“client=,以便只将IP地址传递给脚本的其余部分


谢谢你的帮助

您只需将其转储回awk即可:

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


最后一个awk以等号分隔字符串,并打印第二个元素。

让我们开始清除命令行中所有无用的管道。将整个过程更改为仅此一个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

您没有告诉我,但是如果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 | ...

任何时候你和grep和awk这样吹笛,你都犯了一个错误。awk可以为您进行过滤
/sshd/&/AUTH\u FAIL\u PASSWD/{print$18}
您也可以在awk中执行重复数据消除(以将条目保留在内存中为代价),无需排序。
{if($1>10)print$2}
可以重写为
$1>10{print$2}
。是的,对不起,在/var/log/messages中,Centrify将IP转储到$18位置。但它将其转储为“client=0.0.0.0”。谢谢,谢谢!第二个awk命令完成了这个任务。该脚本的总体目标是阻止SFTP服务器失败登录尝试的IP地址。我注意到我的服务器受到同一组IP地址的攻击。