다른 Linux 배포판에서 `df`의 출력 형식이 동일하지 않음

다른 Linux 배포판에서 `df`의 출력 형식이 동일하지 않음

우분투에서는 이 명령의 출력

df --exclude={tmpfs,devtmpfs,squashfs,overlay} | sed -e /^Filesystem/d | awk '{print $6 " " $1 " " $3 " " $4 " " $5}'

이다:

/ /dev/mapper/dockerVG-rootLV 8110496 40591632 17%
/dockerssd /dev/mapper/ssdVG-ssdLV 214133656 274642488 44%
/dockerhdd /dev/mapper/hddVG-hddLV 83278236 1385191240 6%
/var/lib/docker /dev/mapper/hddVG-dockerLV 76046204 412729940 16%

그것이 나에게 필요한 것입니다.

CentOS 6에서는 다음과 같은 결과가 출력됩니다.

 /dev/mapper/vg_rproxy-lv_root
 51475068 43192316 12% /
/boot /dev/sda1 82688 379364 18%
 /dev/mapper/vg_rproxy-lv_home
 77349888 73119692 1% /home

엉망이에요.

CentOS 6의 전체 출력:

$ df
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/mapper/vg_rproxy-lv_root
                      51475068 5661336  43192292  12% /
tmpfs                   957140       0    957140   0% /dev/shm
/dev/sda1               487652   82688    379364  18% /boot
/dev/mapper/vg_rproxy-lv_home
                      77349888  294352  73119692   1% /home

문제는 무엇입니까? 어떻게 해결할 수 있나요?

답변1

tl;dr

사용 df -P.


전체 답변

/dev/mapper/vg_rproxy-lv_root상대적으로 긴 문자열 입니다 /dev/mapper/vg_rproxy-lv_home. dfCentOS에 나타납니다결정하다항목을 두 줄로 분할하면 출력을 추가로 구문 분석할 때 논리가 중단됩니다.

좁은 터미널에서는 제한된 수평 공간에도 불구하고 사람이 읽을 수 있는 반열 형태의 출력을 생성하는 것이 좋습니다. dftty가 아닌 항목(귀하의 경우 파이프)에 쓸 때 이런 일이 발생하지 않기를 바랍니다 .

아마도 dfUbuntu에서는 열의 항목이 Filesystem길면 유사하게 동작합니다. 어쩌면 당신은 상대적으로 짧기 때문에 이것을 경험하지 않았을 수도 있습니다. 모르겠어요. 이건 중요하지 않아요. 중요한 것은 dfPOSIX 도구이며 이를 따라야 한다는 것입니다.사양. 그러나 사양에는 다음과 같이 명시적으로 명시되어 있습니다.

역사적 df구현은 기본 출력이 상당히 다양합니다. 따라서 알려진 모든 역사적 구현을 ​​수용하고 -P이식 가능한 형식으로 정보를 제공하기 위해 이식 가능한 옵션( )을 추가하기 위해 느슨한 방식으로 기본 출력을 설명해야 했습니다 .

옵션 정보:

-P
STDOUT 섹션에 설명된 형식으로 출력을 생성합니다.

마지막으로 STDOUT 섹션의 관련 부분(강조):

구현에서는 정보가 순서대로 열에 표시되도록 헤더 줄과 개별 데이터 줄의 간격을 조정할 수 있습니다.

남은 출력~와 함께-P다음으로 구성된다지정된 각 파일 시스템에 대한 정보 한 줄. 이 줄의 형식은 다음과 같습니다.

"%s %d %d %d %d%% %s\n", <file system name>, <total space>,
    <space used>, <space free>, <percentage used>,
    <file system root>

따라서 df를 사용하지 않는 한 무엇이든 출력할 수 있습니다 -P. -P일부 구현이 없으면 df예측 가능하고 구문 분석 가능한 출력이 생성될 수 있지만 다른 구현은 그다지 많지 않습니다. 그들의 행동은 충분히 문서화될 수도 있고 그렇지 않을 수도 있습니다. 따라서 일반적으로 의 출력을 구문 분석할 때는 df항상 -P.

추가하는 것만으로 -P도 특정 문제를 해결하기에 충분할 것입니다.

참고는 -P형식에만 적용됩니다. 전체 POSIX 사양은 POSIX 로캘에만 적용됩니다. 또한 최신 구현에서는 df기본적으로 1024바이트 블록을 사용하는 경향이 있지만 POSIX에서는 기본값이 512라고 명시합니다. GNU coreutils의 Debian 10에서는 환경에 설정 df되면 POSIX 기본값으로 대체됩니다 . POSIXLY_CORRECT.-k

이것은 (거의) 구문 분석 가능한 출력을 생성하는 이식 가능한 명령입니다.

LC_ALL=POSIX df -Pk

열의 항목 에 공백이 포함될 수 있기 때문에 거의 구문 분석이 가능하다고 Filesystem생각합니다. 제대로 구성된 OS에서는 그렇지 않습니다.

생략 LC_ALL=POSIX해도 예상되는 결과를 얻을 수 있지만 일반적으로 구문 분석을 위해 있어야 합니다. 예를 들어 내 폴란드어 로케일에서는 sed -e /^Filesystem/ddf. LC_ALL=POSIX이 문제를 해결합니다. 아직도 내개인의선호하는 것은 헤더의 어떤 것도 의존하지 않는 것입니다. 나는 sed 1d또는 tail -n +2; 또는 가 이미 파이프라인에 있으므로 awk작업 을 에 위임하세요 . awk이는 다음과 같습니다.

LC_ALL=POSIX df -Pk --exclude={tmpfs,devtmpfs,squashfs,overlay} \
| awk 'NR>1 {print $6 " " $1 " " $3 " " $4 " " $5}'

마지막으로 --exclude=휴대용 옵션이 아닙니다. 분명히 문제의 두 시스템 모두에서 작동하지만 다른 시스템에서는 작동하지 않을 수도 있습니다.

관련 정보