"du" 명령의 출력에서 ​​첫 번째 단어(크기)를 추출하기 위해 ${xx%% *}를 사용할 수 없는 이유는 무엇입니까?

"du" 명령의 출력에서 ​​첫 번째 단어(크기)를 추출하기 위해 ${xx%% *}를 사용할 수 없는 이유는 무엇입니까?

저는 스크립트를 작성하고 디렉터리 크기를 추출하고 싶습니다. 거기서 나는 내가 이해하지 못하는 이상한 효과를 발견했습니다.

나는 "du" 명령을 사용했습니다:

> x=$(du mydir)
> echo $x
8192 mydir

여태까지는 그런대로 잘됐다. 하지만 이제는 모든 문자를 제거하여 크기를 추출하고 싶습니다.엑스첫 번째 공간부터 시작하세요. 그런데 그때 이해가 됐어요

> echo ${x%% *}
8192 mydir

8192 뿐만이 아닙니다.

따라서 "du"에 의해 생성되지 않은 다른 변수로 확인했습니다.

> y="8192 mydir"
> echo ${y%% *}
8192

이게 왜 적용되나요?와이하지만 그렇지 않다엑스? 나도 확인했다엑스그리고와이같은 문자열입니다.

저는 여기서 정말 혼란스러워요. 누군가가 이 질문에 대답할 수 있다면 기쁘겠습니까?

답변1

변수를 큰따옴표로 묶으면 분명히 공백이 여러 개 있다는 것을 알 수 있습니다. 사실 탭 문자인데, 일부 시스템에서는 좀 더 명확하게 볼 수 있습니다.

echo "$x" | cat -e

따라서 탭(또는 공백)을 이 구조에 일치시켜 가장 긴 시퀀스를 제거할 수 있습니다."공백이나 탭 뒤에 아무 것도 포함되지 않음" 문자열 값의 끝에 바인딩$x

echo "${x%%[[:blank:]]*}"

답변2

xxd아니면 hd그런 것들을 조사하기 위한 좋은 도구입니다. 예:

$ du sample
32  sample

$ du sample | xxd -g 1
00000000: 33 32 09 73 61 6d 70 6c 65 0a        32.sample.

16진수 표기법이 녹슨 경우 다음을 사용할 수 있습니다 ascii.

$ ascii -x
   00 NUL    10 DLE    20      30 0    40 @    50 P    60 `    70 p 
   01 SOH    11 DC1    21 !    31 1    41 A    51 Q    61 a    71 q 
   02 STX    12 DC2    22 "    32 2    42 B    52 R    62 b    72 r 
   03 ETX    13 DC3    23 #    33 3    43 C    53 S    63 c    73 s 
   04 EOT    14 DC4    24 $    34 4    44 D    54 T    64 d    74 t 
   05 ENQ    15 NAK    25 %    35 5    45 E    55 U    65 e    75 u 
   06 ACK    16 SYN    26 &    36 6    46 F    56 V    66 f    76 v 
   07 BEL    17 ETB    27 '    37 7    47 G    57 W    67 g    77 w 
   08 BS     18 CAN    28 (    38 8    48 H    58 X    68 h    78 x 
   09 HT     19 EM     29 )    39 9    49 I    59 Y    69 i    79 y 
   0A LF     1A SUB    2A *    3A :    4A J    5A Z    6A j    7A z 
   0B VT     1B ESC    2B +    3B ;    4B K    5B [    6B k    7B { 
   0C FF     1C FS     2C ,    3C <    4C L    5C \    6C l    7C | 
   0D CR     1D GS     2D -    3D =    4D M    5D ]    6D m    7D } 
   0E SO     1E RS     2E .    3E >    4E N    5E ^    6E n    7E ~ 

이를 통해 다음 사항을 빠르게 발견할 수 있습니다.

  • 33 => 3
  • 32 => 2
  • 09 => HT 또는 가로 탭
  • 73 => 초
  • ...

다시 말해서. 32<HT>sample. 33 32 20 73 ...그것이 당신이 얻는 것이라면 공간은 0x20입니다 .

또 다른 도구는 od여기에서 옵션을 사용하는 것 입니다 -c( -a또는 -ac그것도 좋을 것입니다):

$ printf %s "$x" | od -c
0000000   3   2  \t   s   a   m   p   l   e

또한 올바르게 인용하면 실제 내용도 제공됩니다.

해결책은 다음과 같습니다.@roaimas 또는 이와 유사한 예

$ read -r size name<<< $(du sample)
$ echo "$size"
32

그것은 모두 당신이 원하는 것에 달려 있습니다. awk아니면 당신이 좋은 후보자가 될 수도 있습니다.

관련 정보