awkは必要な出力を生成しません。

awkは必要な出力を生成しません。

以下は私のコマンド出力です。で処理すると、awk不要な出力が発生します。私は何が間違っていましたか?

# lvdisplay -m
  --- Logical volume ---
  LV Name                /dev/Appsvg/apps01
  VG Name                Appsvg
  LV UUID                TckScf-LXdY-BvU1-NGhQ-5vUQ-KoNz-Uus1Of
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                15.00 GB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

  --- Segments ---
  Logical extent 0 to 3839:
    Type                linear
    Physical volume     /dev/emcpoweraq
    Physical extents    0 to 3839


  --- Logical volume ---
  LV Name                /dev/Appsvg/apps02
  VG Name                Appsvg
  LV UUID                FcMopR-57MH-aTrT-3bq2-wUJZ-blEI-161Ivz
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                10.00 GB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:1

  --- Segments ---
  Logical extent 0 to 2559:
    Type                linear
    Physical volume     /dev/emcpoweraq
    Physical extents    3840 to 6399


  --- Logical volume ---
  LV Name                /dev/Appsvg/apps03
  VG Name                Appsvg
  LV UUID                Ji4ldh-2ffZ-9qmb-BVaz-rwYd-f9HQ-2imPYG
  LV Write Access        read/write
  LV Status              available
  # open                 1
  LV Size                20.00 GB
  Current LE             5120
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

  --- Segments ---
  Logical extent 0 to 5119:
    Type                linear
    Physical volume     /dev/emcpoweraq
    Physical extents    6400 to 11519
# lvdisplay -m|awk '/(LV Name)/{l=$3} /(Physical volume)/{p=$3} {print l,p;}'

/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01
/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
................. output snipped.......

「LV名」と「物理ボリューム」だけが見えると予想しました。これは、アイテムが一度だけ表示されることを意味します。私の予想結果は次のとおりです。

/dev/Appsvg/apps01 /dev/emcpoweraq
/dev/Appsvg/apps02 /dev/emcpoweraq
/dev/Appsvg/apps03 /dev/emcpoweraq

答え1

p=$3私の推測が正しい場合、最後の2つのステートメント(およびprint l,p)を組み合わせるには、追加の中括弧セットが必要です。

                                                           /-     HERE    -\
                                                          \/               \/
lvdisplay -m | awk '/(LV Name)/{l=$3} /(Physical volume)/{{p=$3} {print l,p;}}'

Ulrich Schwarzのコメントに関しては、より明白になるかもしれません。

lvdisplay -m | awk '/(LV Name)/{l=$3} /(Physical volume)/{p=$3; print l,p;}'

質問のコマンドはawk期待どおりに「l」と「p」を割り当てますが、「print l、p」の前には条件がないため、すべての行で実行されます。

関連情報