9

tail コマンドの出力を別の bash スクリプトにパイプして処理しようとしています。

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

ただし、実行すると、$1 パラメータ (myscript.sh 内) に到達しません。私は何が欠けていますか?出力をパイプしてスクリプトの入力パラメータにするにはどうすればよいですか?

PS - テールを永遠に実行し、個々の行をスクリプトにパイプし続けたいです。

編集 今のところ、myscripts.sh の内容全体は次のとおりです。

echo $1;
4

3 に答える 3

18

一般に、スクリプトへの標準入力を処理する 1 つの方法を次に示します。

#!/bin/bash

while read line; do
    echo $line
done

これは に相当する非常に大まかな bash ですcatreadこれは重要な事実を示しています。スクリプト内の各コマンドはシェルから標準入力を継承するため、入ってくるデータにアクセスするために特別なことをする必要はありません。あなたのケース)は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' に設定されています。

于 2012-08-22T19:15:53.180 に答える
1

おそらくあなたはと混同していましたawkか?

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

tail コマンドの出力から最初の列を出力します。

シェルでは、以下を使用して同様の効果を実現できます。

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

while ... doneまたは、ループ全体を内部に配置することもできますmyscript.sh

于 2012-08-22T21:46:58.067 に答える
1

パイピングは、あるプロセスの出力( ) を別のプロセスstdoutの入力 ( ) に接続します。開始時にプロセスに送信される引数と同じではありません。stdinstdin

やりたいことは、最初のプロセスの出力の行を 2 番目のプロセスの引数に変換することです。これはまさにxargsコマンドの目的です。

あなたがする必要があるxargsのは、最初のコマンドの間にパイプを入れるだけで、それは機能します:

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

于 2018-04-16T13:41:35.670 に答える