次のコマンドを使用して、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 -c
isは重複エントリを削除し、数を追加しますが、次はawk
3番目の列のみを使用するため、数はとにかく削除されます。-c
次のオプションを使用して全体を削除して置き換えることができます。uniq
-u
sort
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つのパイプと短いスクリプトを持つ単純なコマンドラインに短縮されます。sed
working IP
$ d
sort
sed
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$//'
しかし、どの入力が正当であり、どの出力が予想されるのかわからない場合は、話すことは困難です。