我正在尝试创建一个bash脚本,用于搜索包含网络登录记录的大文件,并且我想查找特定用户使用的无线主机。所以我可以很容易地找到用户登录的次数:
echo "The user $user exists in the file $target $(cat $target | cut -d ' ' -f 1 | grep "\<$user\>" | wc -l) times"
其中$ user先前由read user
定义,$ target在执行文件时通过参数定义。
作为参考,相关文件的格式如下:
<user> pts/0 2014-02-03 12:13 (<ip>)
<user> pts/1 2014-02-04 23:56 (<ip>.wireless.xxx.xxx)
<user> pts/2 2014-02-04 23:39 (<ip>.wireless.xxx.xxx)
<user> pts/3 2014-02-04 22:09 (<ip>.wireless.xxx.xxx)
<user> pts/4 2014-02-04 23:59 (<ip>.wireless.xxx.xxx)
我出于隐私原因更换了用户名和完整IP。用户之后的间距差异是为了考虑不同的用户名长度。
基于这一点,我可以得到一个非常接近的答案:
echo "$user has used the following wireless hostnames:"
echo "$(grep "wireless" $target | grep "\<$user\>" | cut -d '(' -f 2 | cut -d ')' -f 1 | sort | uniq )"
(这里我们假设没有用户名包含“无线”,现在我只关心主要错误)如果由于某种原因我想搜索用户“2014”,例如,这将返回所有即使没有用户“2014”,也可以使用IP地址。当然这只是一种形式,因为没有一个用户名只是数字而且不应该冲突,但即使只是为了学习我宁愿没有这个问题。
所以我需要做的是当我有grep "\<user\>"
我需要它以某种方式搜索对应于用户名列的分隔符''(空格)之前的第一个字段,而不实际切割(因为我仍然需要) ip)。有没有办法通过分隔符指定区域来搜索grep?
----示例i / o ----
$ ./search.sh bigData
What username would you like to search for?
<user>
Total lines in <file>: 53984
The user <user> exists in the file <file> 79 times
<user> has used the following wireless hostnames:
<ip>.wireless.xxx.xxx
<ip>.wireless.xxx.xxx
<ip>.wireless.xxx.xxx
<ip>.wireless.xxx.xxx
答案 0 :(得分:0)
您应该使用 sed 将输入重新格式化为简单的表格格式,并使用 awk 查询该数据,就像使用数据库一样。要列出名称包含2014
的用户,您可以使用过滤器
sed -e 's/[[:blank:]][[:blank:]]*/|/;s/[()]//g'\
| awk -F '|' '$1 ~ "2014" {print($1)}'
在 awk 中,您可以在字段$1
,$2
上合并条件,或使用复杂格式显示printf
的所选数据,如:
sed -e 's/[[:blank:]][[:blank:]]*/|/;s/[()]//g'\
| awk -F '|' '$1 ~ "2014" && $2 ~ 'pts/1' {printf("User: %s, date:%s\n", $1 $3)}'
答案 1 :(得分:0)
您可以告诉grep使用^
echo "$user has used the following wireless hostnames:"
echo "$(grep "wireless" $target | grep "^\<$user\>" | cut -d '(' -f 2 | cut -d ')' -f 1 | sort | uniq )"
您可以使用sed删除use和ip-address之间的所有内容,但这对于一个名为wireless of irele的用户无济于事。只是为了学习:
sed 's/ .*(/(/'