シェルスクリプトを介してパイプにヘッダー行を挿入する方法は?

シェルスクリプトを介してパイプにヘッダー行を挿入する方法は?

私は、処理のためにあるサーバーから別のサーバーにデータをパイプ処理するプロセスを研究しています。

正確なコマンドではありませんが、次のように見えます。

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コマンドグループの出力をリダイレクトします。grepawksocatnetcat

または、行を読み取り、一致する場合は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実装には、各出力行の後に強制的にフラッシュするオプションがあります。awkgawkfflush()print-Winteractivemawkawksystem("")grep--line-buffered

tail -f logfileの略という点も参考にしてくださいtail -n 10 -f logfile。実際には、tail -n +1 -f logfileログファイル全体を処理し、ファイルの処理を続行またはtail追加する行のみを処理したい場合があります。ftail -n 0 -f logfileこれから

おすすめ記事