cut 的管道输出

Piping output from cut

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

"Jun 20 09:56:01 Client root: ssh-rsa ...[rsa-key]... mario@Client"

我只需要脚本的最后两个信息,ssh-rsa 密钥和用户名,所以我尝试了这个:

tail -f /var/log/newusers | egrep --line-buffered "ssh-rsa" | cut -d' ' -f7,8 

它正在运行,所以我添加了它,因为我需要操纵信息

| while read line ; do echo $line ; done

但它不打印任何内容。我正在使用它作为解决方法:

tail -f /var/log/newusers | egrep --line-buffered "ssh-rsa" | while read line ; do
    KEY=$(echo "$line" | cut -d' ' -f7)
    USER=$(echo "$line" | cut -d' ' -f8)
    echo "$USER"
done

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

您好,您的第一个选项不起作用,因为您在 while 循环之前使用了 cut,因为 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

awk 可以通过正则表达式和管道字段进行过滤,以 read 将值直接放入变量中。 $USER 是内置的 bash 变量,因此不建议在脚本中使用它,除非保留其含义

tail -f /var/log/newusers \
| gawk '{ if([=10=] ~ /ssh-rsa/){ print , } }' \
| 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]...