コマンドラインで複数のsedステートメントを使用する

コマンドラインで複数のsedステートメントを使用する

次のコマンドを使用して、IPアドレスのリストを1行に出力し、各IPの後に「ジョブIP」ステートメントを追加します。

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' | sed 's/$/ working IP/'  | sed -e '0,/ working IP/ s/ working IP//' | sed '$ d' | paste -s -d ' ' | sed 's/working IP$//'

出力は次のとおりです。

147.123.41.112 working IP 129.138.70.113 working IP 173.230.45.54 working 
IP 133.218.250.56 working IP 136.203.152.128 working IP 117.22.29.254 
working IP 117.3.11.111 working IP 127.59.131.236 

私が望むように見えるようにsedに何度もパイプしました。 sedを複数回使用するよりも良い方法はありますか?

答え1

単に複数のコマンドを組み合わせるだけではありませんsed(Jasonが回答でこの部分を説明します)。もっと学ぶことができます:

cat file | sort ...

catファイル名を指定できるため、必要ありませんsort。以前は必要ありませんでしたが、cat動作します。

sort file | uniq -c | awk ...

uniq -cisは重複エントリを削除し、数を追加しますが、次はawk3番目の列のみを使用するため、数はとにかく削除されます。-c次のオプションを使用して全体を削除して置き換えることができます。uniq-usort

sort -u file | awk -F " " '{print $2}' | sed ...

awkここでは間違って使用していますが、cut -d" " -f 2自由に使用できます。ただし、awkこの手順を引き続き使用または実行することもできますsed。ツールを切り替えずに、各ツールで同じように実行される操作を完了します。

sort -u file | sed 's/[^ ]* *\([^ ]*\).*/\1 working IP/' ...

入力ファイルがわからないと、状況が変になり始めます。ただし、working IP各行に追加して最初に表示されるまで範囲内のすべての行を削除する場合は、最初の行を除くすべての行に追加するのと同じでなければなりません。

sort -u file | sed 's/[^ ]* *//;s/ .*//;1!s/$/ working IP/'

次に、予約済みスペースに行を集め、最初の改行文字を空白に置き換えることで、他のすべての行をpaste簡単に含めることができます。また、最後の行( )を削除できるため、6つの異なるコマンドと8つのパイプを持つ1マイルの長さのコマンドラインは、1つのパイプと短いスクリプトを持つ単純なコマンドラインに短縮されます。sedworking IP$ dsortsed

sort -u file | sed 's/[^ ]* *//;s/ .*//;$!{H;1h;d;};x;s/\n/ /;s// working IP /g'

同じ結果を得るために、生涯にわたってmanページのオプションを読み、各ステップで何が起こるかを分析する必要はありません。

答え2

次のように、最初の3つのsed呼び出しを組み合わせることが可能です。

cat eciremoteExec1.txt | sort | uniq -c | awk -F " " '{print $3}' |
   sed 's/$/ working IP/;s/ working IP//; $ d' | paste -s -d ' ' |
   sed 's/working IP$//'

しかし、どの入力が正当であり、どの出力が予想されるのかわからない場合は、話すことは困難です。

関連情報