
2行を1行にマージする必要がありますstdout
。新しい行をスペース1つとスペース4つに置き換えます。空白のない新しい行に触れないでください。
tcpdump -vvv ... -l | xyz
出力は次のとおりです。
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
しかし、私は以下が必要です:
2014-06-06 AAA BBB
2014-06-06 CCC DDD
答え1
より多くのエラー修正を提供するためにこれを編集しました。
sedの「N」コマンドは、次の行を追加します。改行と複数のスペースを変更するには、これを置き換えて使用します。
$ cat foo | sed 's/^/ /'
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
2014-06-06 EEE
2014-06-06 FFF
GGG
私の新しい答え:
$ sed ':a;$!{N;s/\n //;ba;}' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF GGG
これは以前の答えよりはるかに優れているようです。
$ sed '/^[^ ]/N;s/\n //' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE
2014-06-06 FFF
GGG
または@mikeservがリストした美しいもの。
$ sed -n 'h;n;H;x;s/\n */ /p' foo
2014-06-06 AAA BBB
2014-06-06 CCC DDD
2014-06-06 EEE 2014-06-06 FFF
GGG
答え2
awk -v ORS= '/^ {4}/{print substr($0,4); next}
{print s $0; s="\n"}
END{print s}'
この入力は次の入力で機能する必要があります。
2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
EEE
2014-06-06 EEE
2014-06-06 FFF
そして以下を作ります:
2014-06-06 AAA BBB
2014-06-06 CCC DDD EEE
2014-06-06 EEE
2014-06-06 FFF
そしてperl
:
perl -0777 -pe 's/\n {4}/ /g'
しかし、これは最初にメモリからwhile入力を消費することを意味します。
答え3
echo "2014-06-06 AAA
BBB
2014-06-06 CCC
DDD
" | paste - - | tr -s '[:blank:]' '[ *]'
2014-06-06 AAA BBB
2014-06-06 CCC DDD
答え4
もう一つのawk
コマンドは、
$ awk '{var=$0; getline; print var,$1}' file
2014-06-06 AAA BBB
2014-06-06 CCC DDD