BASH:仅在文件中的分隔符之间搜索,而不使用 "cut"



我正在尝试创建一个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。user后空格的不同是为了说明不同的用户名长度。

所以基于这个我可以得到一个非常接近的答案:

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",例如,这将返回所有的ip地址,即使没有用户"2014"。当然,这只是一种形式,因为没有一个用户名只是数字,不应该冲突,但即使只是为了学习,我也不想有这个问题。

所以我需要做的是,当我有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

你可以告诉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删除用户和ip地址之间的所有内容,但这对名为wireless of irelle的用户没有帮助。只是为了学习:

sed 's/ .*(/(/'

应该使用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:%sn", $1 $3)}'

最新更新