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

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

私は以下のコマンドを使用して、各IPの後に「working IP」という文を付けて1行に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(Jasen は回答の中でその部分を説明しました)。さらに学ぶことができます:

cat file | sort ...

catsortファイル名を指定できるので、cat前もって指定する必要はありませんが、

sort file | uniq -c | awk ...

uniq -cは重複を削除してカウントを追加しますが、以下では3 番目の comlun のみを使用しているため、カウントはいずれにせよ削除されます。 を削除し、全体をのオプションに置き換えることawkができます。-cuniq-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$//'

しかし、どのような入力が合法で、どのような出力が望まれているかを知らなければ、判断するのは難しいです。

関連情報