쉘 스크립트에서 변수로 출력하는 텍스트 파일이 있습니다. 그러나 처음 50 자만 필요합니다.
사용을 시도 cat ${filename} cut -c1-50
했지만 처음 50 자 이상을 사용하고 있습니까? cut
이 텍스트 파일은 하나의 긴 문자열 일 수 있지만 실제로 의존하는 행 을 찾은 것일 수 있습니다 (100 % 확실하지 않음).
cat
명령 에서 첫 번째 X 문자를 얻기 위해 파이프로 연결할 수있는 유틸리티가 있습니까?
쉘 스크립트에서 변수로 출력하는 텍스트 파일이 있습니다. 그러나 처음 50 자만 필요합니다.
사용을 시도 cat ${filename} cut -c1-50
했지만 처음 50 자 이상을 사용하고 있습니까? cut
이 텍스트 파일은 하나의 긴 문자열 일 수 있지만 실제로 의존하는 행 을 찾은 것일 수 있습니다 (100 % 확실하지 않음).
cat
명령 에서 첫 번째 X 문자를 얻기 위해 파이프로 연결할 수있는 유틸리티가 있습니까?
답변:
head -c 50 file
처음 50 바이트를 반환합니다.
모든 OS에서 명령이 항상 동일하게 구현되는 것은 아닙니다. Linux 및 macOS에서는이 방식으로 작동합니다. Solaris (11)에서 / usr / gnu / bin /의 gnu 버전을 사용해야합니다.
GNU coreutils 5.97
)이 그렇지 않습니다.
-c
유효한 옵션으로 정의되지 않으므로 로컬 환경에 따라 다릅니다. unix.com/man-page/posix/1/head
dd status=none bs=1 count=50 if=${filename}
처음 50 바이트를 반환합니다.
status=none
Ubuntu 14.04, coreutils 8.21을 사용할 때 가지고 있지만 2>/dev/null
이전 버전 을 사용하는 경우 사용하는 것이 좋습니다 .
read()
50 바이트 중 하나 를 수행합니다. (가) 경우 file
예를 적은 문자 파이프가 한 번에 사용할 수있는 것입니다, 다음 적은 바이트가 반환됩니다. 에 해당하는 head -c50
것을 사용하려면 GNU specific을 사용해야합니다 iflag=fullblock
.
지금까지 대부분의 답변은 1 바이트 = 1 문자로 가정하며 ASCII가 아닌 로케일을 사용하는 경우에는 그렇지 않을 수 있습니다.
약간 더 강력한 방법 :
testString=$(head -c 200 < "${filename}") &&
printf '%s\n' "${testString:0:50}"
이것은 다음을 가정합니다.
ksh93
, bash
(또는 최근 zsh
또는 mksh
지원하는 유일한 멀티 바이트 문자 집합 생각하는 것은 ( mksh
UTF-8 만 이후 set -o utf8-mode
및 버전)) head
가 지원 -c
(대부분의 요즘,하지만 엄격하게 표준되지 않음).locale charmap
및 file -- "$filename"
확인). 그렇지 않으면 ie로 설정하십시오. LC_ALL=en_US.UTF-8
)head
모든 문자가 최대 4 바이트로 인코딩되는 최악의 경우 UTF-8을 가정 하여 파일의 처음 200 바이트를 사용했습니다 . 이것은 내가 생각할 수있는 대부분의 경우를 다루어야합니다.head
또는 nōn-standard -c
옵션 을 추가하는 또 다른 구현을 가정합니다 . 그러나 이미 GNU bash가 필요합니다. (참고 : mksh
UTF-8 모드는 UTF-8로 인코딩 된 파일에 대해이 작업을 수행 할 수 있습니다.) OP에 옥텟 또는 멀티 바이트 문자가 필요한지 물어 보면 "문자"만 모호한 / gerneric 용어입니다.
$filename
하거나 $testString
포함하지 않는다고 가정합니다 -
.
${var:offset:length}
여기에서 사용 하는 구문은 실제로 제공 ksh93
되며 최신 버전 zsh
( zsh
자체 있음 $testString[1,50]
) 에서도 지원됩니다 . 당신은 필요 ${testString:0:50}
로 ksh93
하고 zsh
그러나.
grep -om1 "^.\{50\}" ${filename}
다른 변형 (파일의 첫 줄)
(IFS= read -r line <${filename}; echo ${line:0:50})
read
와 echo
? 아니면 bash expansion
?
grep
(regexp), 그렇습니다. 여기서는 쉘을 사용합니다 (힌트 : 첫 번째 줄이 클 수 있습니다). (이것으로 말하면, bashism은 POSIX에도 없지만 대부분의 쉘은 그것을 구현합니다.)
head -c 50 file.txt
예를 들어 file.txt의 처음 50자를 인쇄합니다.
hexdump
16 진 문자로 인쇄하는 데 사용하십시오 .hexdump -n 50 -v file.bin
예를 들어 file.bin의 처음 50 바이트를 인쇄합니다.
-v
verbose 옵션 을 사용하지 않으면 hexdump
반복되는 줄이 별표 ( *
)로 바뀝니다. 여기를 참조하십시오 https://superuser.com/questions/494245/what-does-an-asterisk-mean-in-hexdump-output/494613#494613 .
sed를 사용하면 문제를 쉽게 해결할 수 있습니다.
sed -e 's/^\(.\{50\}\).*/\1/' yourfile
sed -n -e '1s/^\(.\{50\}\).*/\1/p' ${filename}
|
?cat ${filename} | cut -c1-50