bash: 동적 열의 grep 콘텐츠

bash: 동적 열의 grep 콘텐츠

다음과 같은 데이터가 있습니다.

여기에 이미지 설명을 입력하세요.

내가 얻어야 할 것은 OS_NATIVE_NAME구체적 이다 DEVICE.

한 가지 방법은 다음을 사용하여 열 값을 인쇄하는 것입니다.

awk '{print $*col_num*}'

하지만 일련번호는 OS_NATIVE_NAME고정되어 있지 않습니다. 이는 다른 필드( 예를 들어)가 다른 값(때로는 여러 개일 수 있음)을 가질 수 있기 때문에 테스트에 필요한 데이터인 STATUS고정된 열 번호가 없는 문제로 이어지기 때문 입니다.OS_NATIVE_NAME

특정 열의 내용을 어떻게 파악합니까?

답변1

그리고 awk:

awk 'NR==1{for(i=1;i<NF;i++){if($i=="OS_NATIVE_NAME"){s=index($0,$i); l=index($0,$(i+1))-s}}}
 $1=="disk_0"{print substr($0,s,l)}' file
  • NR==1첫 번째 라인(헤더 라인)인 경우 NR현재 처리 중인 라인 번호에 대한 awks 내부 변수입니다.
    • for(i=1;i<NF;i++)필드를 반복합니다. NF현재 행의 필드 수를 나타내는 awks 내부 변수입니다.
    • $i=="OS_NATIVE_NAME"왜냐하면 각 필드를 반복하여 필드 값이 다음과 같은지 확인하기 때문입니다.OS_NATIVE_NAME
    • s=index(...)필드가 시작되는 위치를 찾아 나중에 사용할 수 있도록 저장하세요.index()다른 문자열(여기서는 전체 행) 내에서 문자열(여기서는 $i 값 OS_NATIVE_NAME)이 나타나는 위치를 가져오는 awks 문자열 함수입니다.$0
    • l=index(...)-s필드의 길이를 구하고 나중에 사용하기 위해 저장합니다. 이전과 동일한 원리이지만 길이를 얻으려면 s필드에서 빼야 합니다.
  • $1=="disk_0"DEVICEdisk_0첫 번째 필드( 예제) 에서 검색하려는 내용을 찾으세요 . $1첫 번째 필드를 나타냅니다.
    • {print substr($0,s,l)}마지막으로 각 줄을 인쇄하면 문자열은 position에서 시작 s하고 길이를 갖습니다 l.substr()길이가 있는 위치(라인 1을 처리하는 동안 이전에 추출한 두 변수)에서 문자열(여기서는 $0전체 라인) 을 잘라내는 awks 문자열 함수입니다.sl

인쇄(입력의 필드 위치에 관계없이):

sda

답변2

간단한 해결책:

data=$(vxdisk -e list)
devices=$(sed 's/ .*//' <<< "$data")
# I'm just guessing that the relevant column starts in column 80
os_native_name=$(cut -c80- <<< "$data")
row=0
for dev in $devices; do let row++; if [[ "$dev" = disk_1 ]]; then break; fi; done
# now we know our desired data is on the row'th line of os_native_name
# you can retrieve it for instance with
sed -n "$row p" <<< "$os_native_name"

답변3

다음 명령을 시도해 보십시오:

vmdisk -e list | awk 'NR==1 { for(i=1;i<=NF;i++) { ix[$i] = i } } NR>1 { print $ix["OS_NATIVE_NAME"] }'

관련 정보