3행 세트를 열로 바꾸기

3행 세트를 열로 바꾸기

다음 항목이 포함된 파일이 있습니다.

[root@ovmm329 ovm_utils]# cat /tmp/disk.txt
Physical Disk : 'IBM (67) device=/dev/mapper/360050768018206483000000000000453 shareddisk=true
Physical Disk : 'IBM (58) device=/dev/mapper/36005076801820648300000000000043f shareddisk=true
Physical Disk : 'IBM (59) device=/dev/mapper/360050768018206483000000000000440 shareddisk=true
Physical Disk : 'IBM (71) device=/dev/mapper/360050768018206483000000000000497 shareddisk=true
[root@ovmm329 ovm_utils]#

나는 내가 아는 모든 가능한 방법으로 sed와 awk를 사용해 보았지만 내가 원하는 형식으로 얻을 수 없었습니다. 다음 형식의 파일을 원합니다.

Physical Disk  device                                          Shareddisk
IBM (67)        /dev/mapper/360050768018206483000000000000453  true
IBM (58)        /dev/mapper/36005076801820648300000000000043f  true
IBM (59)        /dev/mapper/360050768018206483000000000000440  true
IBM (71)        /dev/mapper/360050768018206483000000000000497  true

답변1

awk 변수와 여러 일치 항목을 사용하면 각 줄을 읽고 필요한 것을 저장한 다음 마지막 일치 항목을 인쇄하고 다시 시작할 수 있습니다.

#!/usr/bin/awk -f

BEGIN {
  DISK=""
  DEVICE=""
  FS=" : "
  print "Physical Disk\tdevice\t\t\t\t\t\tShareddisk"
  }

/Physical Disk/ {
  DISK=$2
  FS="="
}

/device/ {
  DEVICE=$2
}

/shareddisk/ {
  print DISK "\t" DEVICE "\t" $2
  FS=" : "
  }

그런 다음 파일에 대해 스크립트를 실행하십시오.awk -f ./script.awk ./disk.txt

$ awk -f ./parse.awk ./disk.txt
Physical Disk   device                                          Shareddisk
'IBM (67)       /dev/mapper/360050768018206483000000000000453   true
'IBM (58)       /dev/mapper/36005076801820648300000000000043f   true
'IBM (59)       /dev/mapper/360050768018206483000000000000440   true
'IBM (71)       /dev/mapper/360050768018206483000000000000497   true

스크립트를 분해하려면 BEGIN처음에 실행되는 블록으로 시작합니다. 일부 변수를 정의하고 필드 구분 기호를 설정 FS하고 제목을 인쇄합니다. 첫 번째 일치 항목이 사용되며 Physical Disk디스크 이름이 변수에 저장됩니다. =장치 및 공유 디스크 행 사용으로 인해 필드 구분 기호가 =. 히트 라인이 일치하면 /shareddisk/변수가 인쇄되고 필드 구분 기호가 다음 물리적 디스크 라인과 일치하도록 다시 변경됩니다.

편집하다

이는 파일 형식이 다음과 같다고 가정합니다.

cat disk.txt
Physical Disk : 'IBM (67)
  device=/dev/mapper/360050768018206483000000000000453
  shareddisk=true
Physical Disk : 'IBM (58)
  device=/dev/mapper/36005076801820648300000000000043f
  shareddisk=true
Physical Disk : 'IBM (59)
  device=/dev/mapper/360050768018206483000000000000440
  shareddisk=true
Physical Disk : 'IBM (71)
  device=/dev/mapper/360050768018206483000000000000497
  shareddisk=true

관련 정보