BASH:仅在文件中的分隔符之间搜索而不使用“剪切”

时间:2015-10-27 06:10:07

标签: bash unix command-line

我正在尝试创建一个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

2 个答案:

答案 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/ .*(/(/'