2

このテキストを変換したい:

qa-ops01.mysite.com
/dev/mapper/sys-home   58G   26G   30G  47% /home
/dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /tmp
qa-ops02.mysite.com
/dev/mapper/sys-home   58G   26G   30G  47% /usr
/dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /var
qa-ops03.mysite.com
/dev/mapper/sys-home   58G   26G   30G  47% /lib
/dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /etc

これに:

qa-ops01.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /tmp  
qa-ops02.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /var   
qa-ops03.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /etc

利用した

cat FILE |sed 'N;s/.com\n//'

とにかくこれを達成するためにありますか、それとも私はただIf ... Then..を書くべきですか?

答えてくれてありがとう:D(あなたはいつも私に新しいものを見せてくれます:D)

4

6 に答える 6

3

私はsedについてあまり知りませんが、AWKでは:

awk 'NR==1{prefix=$0;next} {print prefix, $0}' file

アップデート

その場合は、フィールド (列) が 1 つしかない行を探し、それをプレフィックスとして使用します。つまり、上記のスクリプトの唯一の変更点は、NR (レコードまたは行の数) の代わりに NF (フィールドの数) です。

awk 'NF==1{prefix=$0;next} {print prefix, $0}' file
于 2013-01-23T15:41:56.023 に答える
3

potong答えはほぼ正しいです。複数のサーバーではなく、1 つのサーバーのみを処理しますが、必要な変更はわずかです。

$ sed -e '/^[^ ]*$/{h;d;}' -e 'G; s/\(.*\)\n\(.*\)/\2 \1/' data
qa-ops01.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /home
qa-ops01.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /tmp
qa-ops02.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /usr
qa-ops02.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /var
qa-ops03.mysite.com /dev/mapper/sys-home   58G   26G   30G  47% /lib
qa-ops03.mysite.com /dev/mapper/sys-tmp   3.9G  2.3G  1.5G  61% /etc
$

スクリプトは 2 つの部分に分かれており、2 つ-eのオプションで識別されます。最初の部分はサーバー名を識別します。これらの行にはスペースが含まれていません (したがって、スペースのない/^[^ ]*$/行が検索されます)。その行をホールド スペースにコピーし ( h)、それを削除して ( d)、次の行に進みます。スクリプトの 2 番目の部分は、スペースを含む行でのみ実行されます。Gホールド スペースの内容を、改行 ( )の後にパターン スペースに追加します。次に、行を「改行までのすべて」と「改行の後のすべて」に分割し、「後」(\2)が最初に来て、次にスペース、「前」(\1)になるようにそれらを切り替えます。

これは古典的なsed正規表現を使用します。Mac OS X (10.7.5) で、BSDsedと GNUの両方sedを変更せずにテストしました。GNUには、いくつかのバックスラッシュを節約する正規表現の解釈を変更するsedなどのオプションがあります。-r

于 2013-01-23T16:10:48.337 に答える
2

これはうまくいくかもしれません(GNU sed):

sed -r '1{h;d};G;s/(.*)\n(.*)/\2 \1/' file
  • 1{h;d}最初の行をホールド スペース (HS) に保存してから、パターン スペース (PS) を削除します。
  • G後続のすべての行で、改行と HS を PS に追加します。
  • s/(.*)\n(.*)/\2 \1/PS を再配置し、導入された改行を削除します。

回答を投稿してから、元の質問が変更されました。これを考慮に入れるために:

sed -r '/%/!{h;d};G;s/(.*)\n(.*)/\2 \1/' file

これは、 を含まない行を HS に保存することにより、複数のサーバーを処理します%

于 2013-01-23T15:49:46.863 に答える
0
awk '{if($0~/mysite.com/){x=$0}else{print x,$0}}' your_file

ここでテスト済み

于 2013-01-23T16:08:45.040 に答える
0

これを試してください:

awk '!/^\/dev/{header=$0;next} {print header, $0}' input.txt

代わりに(機能的には同じですが、読みやすく理解しやすいIMO):

awk '{if($0 !~ /^\/dev/){header=$0}else{print header, $0}}' input.txt
于 2013-01-23T16:05:36.093 に答える
0

awk を使用する別の方法は次のとおりです。

awk '{if ($1 ~ /mysite.com/){a= $0 } if ($1 ~ /dev/){ print a" "$0}}' temp.txt

  1. a = $0行を if にコピーしますmysite.com
  2. 2行目に含まれる場合/dev、両方の行を結合します

またはpotong sedの他のバリエーション

sed -re '/mysite.com/{h;d};G;s/(.*)\n(.*)/\2 \1/' temp.txt

于 2013-01-24T06:32:30.537 に答える