繁体   English   中英

切割的管道输出

[英]Piping output from cut

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

“ 6月20日09:56:01客户端根目录: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($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]...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM