我有列的表。在第一列中,我有时间,当用户登录时,在第二列中,我有一个用户名。
13:15:39 fxs1cia1qulm1lk
13:15:39 fxs1cia1qulm1lk
13:15:39 fxs1cia1qulm1lk
13:15:42 faaaa2aa11111
13:15:49 terd1sfsd11fsdf
13:15:49 terd1sfsd11fsdf
13:15:49 terd1sfsd11fsdf
13:15:59 21erdsf123sdfsdf
13:15:59 21erdsf123sdfsdf
13:15:59 21erdsf123sdfsdf
13:15:59 21erdsf123sdfsdf
13:17:50 abcasbbabadab
13:17:50 abcasbbabadab
13:17:50 abcasbbabadab
13:17:50 abcasbbabadab
13:19:19 fxs1ce1iulmla
13:19:19 fxs1ce1iulmla
13:19:19 fxs1ce1iulmla
13:20:42 faaa2a0a1111
所以,我应该怎么做。我应该对这两列进行 uniq 操作,如果用户登录的时间和用户名相同,我应该说,该用户已经登录了 3 次以上。我写了简短的脚本:
log_file=/root/log
temp_file=/root/temp
temp_file2=/root/temp2
cat /dev/null > $temp_file
cat /dev/null > $temp_file2
cat /dev/null > $result_file
cat $log_file | awk '{print $1}' | tail -n 20 > $temp_file
cat $log_file | awk '{print $5}' | tail -n 20 > $temp_file2
for i in `uniq -c $temp_file | awk '{print $1}'`; do
for y in `uniq -c $temp_file2 | awk '{print $2}'`; do
if [ $i -gt 3 ] && [ $y -gt 3 ]; then
s=`uniq -c $temp_file2 | awk '$1 == '$i`
echo "The user $s has logged more than 3 times"
fi
done
done
请检查一下,这个脚本是否正确?因为,在 echo 中输出我的脚本后,我有:
The user 4 21erdsf123sdfsdf
4 abcasbbabadab has logged more than 3 times
The user 4 21erdsf123sdfsdf
4 abcasbbabadab has logged more than 3 times
The user 4 21erdsf123sdfsdf
4 abcasbbabadab has logged more than 3 times
The user 4 21erdsf123sdfsdf
4 abcasbbabadab has logged more than 3 times
但我想要这样的输出:
The user 4 21erdsf123sdfsdf has logged more than 3 times
The user 4 abcasbbabadab has logged more than 3 times
就这样。我哪里有错误?请帮忙。
您可以使用非常直接的方式执行此操作
awk
该程序扫描 root.log 创建一个关联数组(又名哈希),其中包含每个用户的计数,然后打印大于一的那些。
那么,唯一的问题是它多次打印相同的输出?为什么不直接通过 uniq 进行管道传输?转储到另一个临时文件,然后在其上运行 uniq?
如果这不是你要问的,我有一些意见:
sort logfile | uniq -c
.更新
您是在寻求有关 shell 脚本的建议,还是在寻找一个实用的答案来回答我如何找出谁当前登录了 3 个或更多会话?
脚本建议:
$s
包含整个字符串,4 21erdsf123sdfsdf <newline> 4 abcasbbabadab
包括换行符。我不太明白为什么。awk '{print $5}'
?我尝试复制您的示例数据并运行它awk '{print $5}'
,我得到了一堆换行符,没有别的。$temp_file
并$temp_file2
确保它们符合您的预期?tail -n 20
最近”的条目,而你不在乎有多近。这是真的?cat /dev/null > $file
,把它们拿出来。cat $logfile
为sort $logfile
基本上这个脚本不会做你想做的事,我不知道你打算如何工作,所以我不能给出更具体的建议。对不起。
实际的
who
命令吗?EGwho | awk '{ print $1}' | sort | uniq -c | sort -d -r
还是last
命令?