切割的管道输出

时间:2018-06-20 08:23:40

标签: shell scripting debian-based

我正在尝试编写一个脚本,该脚本使用持续增长的日志文件中的信息。文件的每个日志的结构如下:

“ 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

但是我想了解为什么第一个解决方案不起作用,因为我认为我缺少一些基本概念。

2 个答案:

答案 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]...