shell脚本显示grep结果

时间:2014-05-04 18:10:00

标签: bash shell grep

我需要一些帮助来显示在同一行上找到两个字符串的次数!假设我想搜索文件'test.txt',这个文件包含名称和IP,我想在运行脚本时输入名称作为参数,脚本将在文件中搜索该名称,并检查是否存在IP地址也有。我尝试过使用'grep'命令,但我不知道如何以一种好的方式显示结果,我想这样:

Name: John Doe IP: xxx.xxx.xx.x count: 3 

计数是找到这一行的次数,这就是我的grep脚本现在的样子:

#!/bin/bash 
echo "Searching $1 for the Name '$2'"

result=$(grep "$2" $1 | grep -E "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)")

echo $result 

我将像'sh search test.txt John'一样运行脚本。 我在显示从grep命令获得的信息时遇到问题,也许有更好的方法可以做到这一点?

编辑:

Okey,我会尝试更好地解释一下,假设我想要搜索.log文件,我想要一个脚本来搜索该文件以获取用户输入的字符串作为参数。即如果用户输入'sh search test.log登录',脚本将搜索文件'test.log'中的“登录”字符串。如果脚本在与IP地址相同的行上找到此行,则会打印IP地址以及找到此行的次数。

我根本就不知道怎么做,我是shell脚本的新手,并希望我可以使用grep和正则表达式来实现这个目标!我将继续尝试,如果我弄明白,请用答案更新这个问题。

我的计算机上没有该文件,但它看起来像这样:

Apr 25 11:33:21 Admin CRON[2792]: pam_unix(cron:session): session opened for user 192.168.1.2 by (uid=0)
Apr 25 12:39:01 Admin CRON[2792]: pam_unix(cron:session): session closed for user 192.168.1.2
Apr 27 07:42:07 John CRON[2792]: pam_unix(cron:session): session opened for user 192.168.2.22 by (uid=0)
Apr 27 14:23:11 John CRON[2792]: pam_unix(cron:session): session closed for user 192.168.2.22
Apr 29 10:20:18 Admin CRON[2792]: pam_unix(cron:session): session opened for user 192.168.1.2 by (uid=0)
Apr 29 12:15:04 Admin CRON[2792]: pam_unix(cron:session): session closed for user 192.168.1.2

1 个答案:

答案 0 :(得分:1)

这是一个简单的Awk脚本,根据您发布的日志片段执行您的请求。

awk -v user="$2" '$4 == user { i[$11]++ }
    END { for (a in i) printf ("Name: %s IP: %s count: %i\n", user, a, i[a]) }' "$1"

如果日志文件中第四个以空格分隔的字段与请求的用户名(作为第二个参数传递给shell脚本)匹配,则在IP地址的计数中添加一个(来自字段11)。

最后,遍历所有非零IP地址,并为每个IP地址打印摘要。 (用户名显然是传入的内容,但与预期输出匹配。)

这是一个非常基本的Awk脚本;如果你认为你想了解更多,我建议你参考一个简单的介绍,而不是在这里跟进。

如果您想要一个更简单的grep - 解决方案,这样的内容会以不同的格式提供信息:

grep "$2" "$1" |
grep -o -E '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' |
sort | uniq -c | sort -rn

这里的诀窍是第二个-o的{​​{1}}选项,它只从匹配行中提取IP地址。然而,它不如Awk脚本精确;例如,名为“sess”的用户将匹配日志中的每个输入行。您可以在第一个grep中使用grep -w稍微改进一下 - 这对于名为“pam”的用户仍无法提供帮助 - 但是Awk确实为您提供了更多控制权。

我的原始答案在这一行之下,部分原因在于它的切实用​​处,部分原因是为了理解下面讨厌的评论帖子所需要的。


以下

grep

错了。您需要第二行

result=$(command)
echo $result

但此外,绕过echo "$result" 的过程是多余的;写简单的方法就是

echo