我正在尝试编写一个脚本,该脚本使用持续增长的日志文件中的信息。文件的每个日志的结构如下:
“ 6月20日09:56:01客户端根:ssh-rsa ... [rsa-key] ... mario @ Client”
我只需要脚本的最后两个信息,即ssh-rsa密钥和用户名,所以我已经尝试过了:
O(n)
它正在工作,所以我添加了它,因为我需要操纵信息
tail -f /var/log/newusers | egrep --line-buffered "ssh-rsa" | cut -d' ' -f7,8
,但不打印任何内容。我将其用作解决方法:
| while read line ; do echo $line ; done
但是我想了解为什么第一个解决方案不起作用,因为我认为我缺少一些基本概念。
答案 0 :(得分:0)
您好,您的第一个选项不起作用,因为您在cut
循环之前使用了while
,因为cut
会一次过滤一行。
tail -f /var/log/newusers | egrep --line-buffered "ssh-rsa" | cut -d' ' -f7,8 | while read line ; do echo $line ; done
在第二个选项中,您将所有已过滤的行输出到while循环
tail -f /var/log/newusers | egrep --line-buffered "ssh-rsa" | while read line ; do
答案 1 :(得分:0)
awk可以通过正则表达式和管道字段进行过滤,以read
将值直接放入变量中。 $USER
是内置的bash变量,因此除非保留其含义,否则不建议在脚本中使用它
tail -f /var/log/newusers \
| gawk '{ if($0 ~ /ssh-rsa/){ print $7,$8 } }' \
| while read rsa nuser; do
echo "new $nuser -> rsa: $rsa"
done
结果:
new mario@Client -> rsa: ...[rsa-key]...
new mario@Client2 -> rsa: ...[rsa-key]...
new mario@Client3 -> rsa: ...[rsa-key]...
new mario@Client4 -> rsa: ...[rsa-key]...
new mario@Client5 -> rsa: ...[rsa-key]...