비어 있는 경우에도 명령 출력에서 ​​열을 추출합니다.

비어 있는 경우에도 명령 출력에서 ​​열을 추출합니다.

명령 출력에서 ​​두 번째 열을 추출하려고 합니다.

예를 들어:

$ sudo /usr/sbin/pvs
  PV         VG       Fmt  Attr PSize   PFree
  /dev/sdc1  vgswap   lvm2 a--   16.00g      0
  /dev/sdc2  rootvg   lvm2 a--   48.00g   2.70g
  /dev/sde            lvm2 ---   32.00g  32.00g
  /dev/sdf            lvm2 ---   32.00g  32.00g

그런데 문제는 일부 디스크가 VG와 연결되어 있지 않아 이와 같이 출력을 추출하는 동안 VG 이름이 비어 있다는 것입니다.

$ sudo /usr/sbin/pvs | awk '{print $2}'
VG
vgswap
rootvg
lvm2
lvm2

이렇게 추출하고 싶어요 (비어있으면 비워두세요)

vgswap
rootvg

답변1

사용자 전용 기본 형식 대신 사후 처리를 위해 설계된 출력 형식을 사용하십시오.

$ sudo pvs --reportformat json_std | jq -r '.report[].pv[].vg_name'
vgswap
rootvg


또는 pvs원하는 형식으로 원하는 값을 얻으도록 요청하세요.

$ sudo pvs --no-headings --config 'log{prefix=""}' -o vg_name
vgswap
rootvg



정렬 및 들여쓰기를 비활성화하고 구분 기호를 변경하여 기본 출력 형식을 사후 처리하기 쉽게 만들 수 있습니다.

sudo pvs --config $'report{aligned=0 separator="\t"}log{prefix=""}'

값에 줄 바꿈이나 탭이 포함되지 않는 한 이를 간단한 TSV로 만든 다음 다음을 사용하여 후처리할 수 있습니다.

열에는 항상 헤더 vg_name가 있다고 가정합니다 VG.

mlr --tsvlite --headerless-csv-output  cut -f VG

또는:

awk 'NR==1{for (i = i; i <= NF; i++) h[$i]=i; next}
     {print $ h["VG"]}'

또는 해당 vg_name열이 항상 두 번째 열이라고 가정합니다.

awk -F'\t' 'NR > 1 {print $2}'

출력 형식을 변경하지 않고 장치 이름에 개행 문자나 기타 제어 문자 또는 멀티바이트 문자가 포함되어 있지 않다고 가정하고 VG 이름에 공백이 포함될 수 없다는 사실을 바탕으로 VG첫 번째 헤더 행에서 문자열의 오프셋을 변경할 수 있습니다. 후속 행에서 해당 값을 찾을 위치를 알기 위해 기록되었습니다.

sudo pvs | awk '
  NR == 1 {offset = index($0, "VG"); next}
  {$0 = substr($0, offset); sub(/ .*/, ""); print}'

답변2

awk를 사용하십시오.

$ cat file | awk 'NR==1{n=NF; next} {print (NF<n ? "" : $2)}'
vgswap
rootvg


이것은 단순히 첫 번째 줄의 필드 수를 출력하도록 설정한 다음 n, 해당 필드 수가 있으면 $2를 인쇄하고, 그렇지 않으면 줄의 나머지 부분에 대해 빈 문자열을 인쇄합니다.

GNU awk를 사용할 수도 있습니다 FIELDWIDTHS.고정 너비 필드귀하의 의견에서:

$ cat file | awk -v FIELDWIDTHS='13 9 *' 'NR>1{print $2}'
vgswap
rootvg


시스템의 로 바꾸십시오 cat file.sudo /usr/sbin/pvs

관련 정보