명령 출력에서 두 번째 열을 추출하려고 합니다.
예를 들어:
$ 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