管尾输出到另一个脚本

时间:2012-08-22 18:56:02

标签: bash parameters pipe tail

我正在尝试将tail命令的输出传递到另一个bash脚本来处理:

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

但是,当我运行它时,$ 1参数(在myscript.sh中)永远不会到达。我错过了什么?如何将输出作为脚本的输入参数进行管道输送?

PS - 我希望tail能够永远运行并继续将每一行连接到脚本中。

修改 目前,myscripts.sh的全部内容是:

echo $1;

3 个答案:

答案 0 :(得分:14)

通常,这是处理脚本标准输入的一种方法:

#!/bin/bash

while read line; do
    echo $line
done

这是一个非常粗略的bash等同于cat。它确实证明了一个关键事实:脚本中的每个命令都从shell继承了它的标准输入,因此你不需要做任何特殊的事情来访问进来的数据。read接受它的输入来自shell,(在您的情况下)从通过管道连接到它的tail进程获取其输入。

另一个例子,考虑这个脚本;我们称之为“mygrep.sh'。

。”
#!/bin/bash

grep "$1"

现在是管道

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

的行为相同
some-text-producing-command | grep bob

如果您按照以下方式调用脚本,则设置

$1

./myscript.sh foo

然后$1的值为" foo"。

位置参数和标准输入是分开的;你可以这样做

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

现在,标准输入仍然来自tail流程,$1仍然设置为' foo'。

答案 1 :(得分:1)

也许您对awk感到困惑?

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

将从tail命令的输出中打印第一列。

在shell中,可以通过以下方式实现类似的效果:

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

或者,您可以将整个while ... done循环放在myscript.sh

答案 2 :(得分:1)

管道将一个进程的输出(stdout)连接到另一个进程的输入(stdin)。 stdin与启动时发送给进程的参数不同。

您要做的是将第一个进程的输出中的行转换为第二个进程的参数。这正是xargs命令的用途。

您需要做的只是在初始命令之间输入xargs并且它将起作用

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