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]...
我正在尝试编写一个脚本,该脚本使用不断增长的日志文件中的信息。文件的每个日志结构如下:
"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]...