이상한 파일에서 문자열을 "차단"하는 방법

이상한 파일에서 문자열을 "차단"하는 방법

AIX의 명령은 다음과 같습니다.

[root@hx042:/home/user1]$ lqueryvg -Atp hdiskpower13
0516-1396 lqueryvg: The physical volume hdiskpower13, was not found in the system database. 
Max LVs:        256 
PP Size:        30 
Free PPs:       0 
LV count:       3 
PV count:       3 
Total VGDAs:    3 
Conc Allowed:   0 
MAX PPs per PV: 1016 
MAX PVs:        32 
Quorum (disk):  1 
Quorum (dd):    ??????? 
Auto Varyon ?:  1 
Conc Autovaryon 0 
Varied on Conc: 0
Logical:        00f62b5c00004c000000014de7f073b1.1   prekod 1  
                00f62b5c00004c000000014de7f073b1.2   prekre 1  
                00f62b5c00004c000000014de7f073b1.3   prekcf 1
Physical:       00f62b5ceb80c074                1   0  
                00f62b5ceb76311b                1   0  
                00f62b5ceb790075                1   0   
Total PPs:      309 
LTG size:       128 
HOT SPARE:      0 
AUTO SYNC:      0 
VG PERMISSION:  0 
SNAPSHOT VG:    0 
IS_PRIMARY VG:  0 
PSNFSTPP:       4352 
VARYON MODE:    ??????? 
VG Type:        0 
Max PPs:        32512
Mirror Pool Str n 
Sys Mgt Mode:   ??????? 
VG Reserved:    ??????? 
PV RESTRICTION: ??????? 
Infinite Retry: 2 
Varyon State:   0 
Disk Block Size 512

다음 값만 필요합니다.

prekod
prekre
prekcf

나는 시도했다:

[root@hx042:/home/user1]$ lqueryvg -Atp hdiskpower13|sed -n -e '/Logical/,/Physical/ p'                
0516-1396 lqueryvg: The physical volume hdiskpower13, was not found in the
system database.
Logical:        00f62b5c00004c000000014de7f073b1.1   prekod 1  
                00f62b5c00004c000000014de7f073b1.2   prekre 1  
                00f62b5c00004c000000014de7f073b1.3   prekcf 1  
Physical:       00f62b5ceb80c074                1   0  

Logical이제 필요한 첫 번째 값과 같은 줄에 현재 전혀 유용하지 않고 필요하지 않은 피할 수 없는 오류 메시지도 있기 때문에 막혔습니다 .

답변1

awk에서 모든 작업을 수행하는 더 현명한 방법이 있을 수 있지만 Guido는 올바르게 수행하고 0516-1396stderr를 /dev/null로 보내 메시지를 삭제했습니다. 다음은 "logical:"과 "physical" 사이의 줄만 인쇄하는 파이프입니다 sed. 그런 다음 sed를 다시 사용하여 후행 "physical" 줄을 제거하고 "logical:" 텍스트를 제거한 다음 awk를 사용하여 두 번째 열을 인쇄합니다.

lqueryvg -Atp hdiskpower13 | \
  sed -n '/^Logical:/,/^Physical:/ p' | \
  sed '/^Physical:/d; s/^Logical://' | \
  awk '{print $2}'

이것은 완전한 awk 솔루션이지만 여전히 무차별 대입입니다.

lqueryvg -Atp hdiskpower13 | \
  awk '/^Logical:/,/^Physical/ { 
    if (! /^Physical:/) { 
      gsub("Logical:", "", $0); 
      print $2 }}'

답변2

for i in prekod prekcf prekre; do lqueryvg -Atp hdiskpower13 | grep $i; done | sed 's/Logical://g' | sed 's/^[ \t]*//;s/[ \t]*$//' | awk '{print $2" "$3}'

답변3

출력이 항상 유사하다고 가정하면 cut도 작동하고 더 간단할 것이라고 생각합니다. 위에 인용된 특정 출력의 경우:

grep 'prek*' |cut -w -f3

관련 정보