私は、処理のためにあるサーバーから別のサーバーにデータをパイプ処理するプロセスを研究しています。
正確なコマンドではありませんが、次のように見えます。
tail -f logfile | grep "abc" | grep "def" | grep -v "ghi" | netcat -q 0 n.n.n.n 7777
これらすべてのgrepをスクリプトにラップし、さらに重要なのはパイプの前に識別子を追加したいnetcat
ので、コマンドは次のようになります。
tail -f logfile | myscript.sh {id}
相手のリスニングスクリプトは次のものを受け取る必要があります。
{id}
[Line 1 of the logfile]
[Line 2 of the logfile]
...
スクリプトでラップするのは簡単です。
#!/bin/sh
id=$1
grep "abc" | grep "def" | grep -v "ghi" | netcat -q 0 n.n.n.n 7777
$id
ところで、最初はどのように注射すべきかわからない。
受信側では以下を使用しています。
socat -u tcp-l:7777,fork system:/dev/receivePipe
したがって、他の方法(パラメータなど/dev/receivePipe
)や環境変数を介してIDを取得できる場合は、それも機能します。
編集:最終回答は許可された回答についてのコメントから来ました。
#!/bin/sh
{
printf '%s\n' $1
grep "abc" | grep "def" | grep -v "ghi"
} | netcat -q 0 192.168.56.105 7777
ベストアンサー1
ただし:
#! /bin/sh -
{
printf '%s\n' "${1-default-id}"
awk '/abc/ && /def/ && ! /ghi/'
} | socat - tcp:n.n.n.n:7777
${1-default-id}
指定またはそうでない場合は、最初の位置引数に展開されますdefault-id
。引数が渡されていない場合(またはデフォルトではなくエラーメッセージを指定した場合)、エラーで終了すること${1?}
に置き換えられます。${1?The error message}
IDを出力してコマンドを/にフィルタリングするために実行するprintf
コマンドグループの出力をリダイレクトします。grep
awk
socat
netcat
または、行を読み取り、一致する場合はIDを印刷します。
#! /bin/sh -
ID=${1-default-id} awk '
/abc/ && /def/ && ! /ghi/ {
if (!already_printed++) print ENVIRON["ID"]
print
}' | socat - tcp:n.n.n.n:7777
または、各行の前にID(およびスペース文字)を追加してください。
#! /bin/sh -
ID=${1-default-id} awk '
/abc/ && /def/ && ! /ghi/ {
print ENVIRON["ID"], $0
}' | socat - tcp:n.n.n.n:7777
入力がパイプ(ttyデバイス以外のすべてのデバイス)に提供されている場合は、出力をバッファawk
リングするのと同じです。 GNU実装(別名)を使用すると、grep
それぞれの後ろに呼び出しを追加してそのバッファを強制的にフラッシュできます。また見てください。ほとんどの実装で実行すると、強制的に更新されます。 GNU実装には、各出力行の後に強制的にフラッシュするオプションがあります。awk
gawk
fflush()
print
-Winteractive
mawk
awk
system("")
grep
--line-buffered
tail -f logfile
の略という点も参考にしてくださいtail -n 10 -f logfile
。実際には、tail -n +1 -f logfile
ログファイル全体を処理し、ファイルの処理を続行またはtail
追加する行のみを処理したい場合があります。f
tail -n 0 -f logfile
これから。