pipe tail output into another script

允我心安 提交于 2019-12-03 03:53:55

Generally, here is one way to handle standard input to a script:

#!/bin/bash

while read line; do
    echo $line
done

That is a very rough bash equivalent to cat. It does demonstrate a key fact: each command inside the script inherits its standard input from the shell, so you don't really need to do anything special to get access to the data coming in. read takes its input from the shell, which (in your case) is getting its input from the tail process connected to it via the pipe.

As another example, consider this script; we'll call it 'mygrep.sh'.

#!/bin/bash

grep "$1"

Now the pipeline

some-text-producing-command | ./mygrep.sh bob

behaves identically to

some-text-producing-command | grep bob

$1 is set if you call your script like this:

./myscript.sh foo

Then $1 has the value "foo".

The positional parameters and standard input are separate; you could do this

tail -n +1 -f your_log_file | myscript.sh foo

Now standard input is still coming from the tail process, and $1 is still set to 'foo'.

Perhaps your were confused with awk?

tail -n +1 -f your_log_file | awk '{
    print $1
}'

would print the first column from the output of the tail command.

In the shell, a similar effect can be achieved with:

tail -n +1 -f your_log_file | while read first junk; do
    echo "$first"
done

Alternatively, you could put the whole while ... done loop inside myscript.sh

Piping connects the output (stdout) of one process to the input (stdin) of another process. stdin is not the same thing as the arguments sent to a process when it starts.

What you want to do is convert the lines in the output of your first process into arguments for the the second process. This is exactly what the xargs command is for.

All you need to do is pipe an xargs in between the initial command and it will work:

tail -n +1 -f your_log_file | xargs | myscript.sh

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!