用awk删除字符

时间:2014-10-23 19:01:02

标签: 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 }')

使用Centrify,输出结果为:

client=0.0.0.0

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

感谢您的帮助!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将其转储回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用等号分隔字符串作为分隔符并打印第二个元素。

答案 2 :(得分:0)

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