답변:
head 너무 작동합니다.
head -c 100 file # returns the first 100 bytes in the file
.. 처음 100 바이트를 추출하여 반환합니다.
head이를 위해 사용 하는 것이 좋은 점은 tail일치 구문이 있다는 것입니다 .
tail -c 100 file # returns the last 100 bytes in the file
이들을 결합하여 바이트 범위를 얻을 수 있습니다. 예를 들어 파일에서 두 번째 100 바이트 를 가져 오려면 처음 200 바이트를 읽고 headtail을 사용하여 마지막 100 바이트 를 가져옵니다.
head -c 200 file | tail -c 100
head다음 tail마지막 10 바이트 를 가져 오는 데 사용 합니다. 예 :head -c 20 file | tail -c 10
dd를 사용하여 임의의 바이트 청크를 추출 할 수 있습니다.
예를 들면
dd skip=1234 count=5 bs=1
입력에서 출력으로 1235 ~ 1239 바이트를 복사하고 나머지는 버립니다.
표준 입력에서 처음 5 바이트를 가져 오려면 다음을 수행하십시오.
dd count=5 bs=1
입력 파일 이름을 지정하려는 경우 dd에는 구식 인수 구문 분석이 있으므로 다음을 수행합니다.
dd count=5 bs=1 if=filename
또한 dd는 자신이 한 일을 자세하게 발표하므로이를 버리려면 다음을 수행하십시오.
dd count=5 bs=1 2>&-
또는
dd count=5 bs=1 2>/dev/null
dd bs=1dd가 한 번에 한 문자를 읽고 쓰도록 강제하기 때문에 일반적으로이 솔루션에 반대하는 것이 좋습니다 head. 카운트가 클 때보 다 훨씬 느립니다 . 하지만 count = 5에서는 눈에 띄지 않습니다.
dd, 그게 트릭을 할 것 같습니다. 건배!
head -c구현 dd bs=5 count=1방식은 일
머리 :
head-파일의 첫 부분 출력
헤드 [ 옵션 ] ... [ 파일 ] ...
각 FILE의 처음 10 줄을 표준 출력으로 인쇄합니다. 둘 이상의 FILE을 사용하는 경우 각 파일 앞에 파일 이름을 제공하는 헤더를 붙입니다. FILE이 없거나 FILE이-인 경우 표준 입력을 읽습니다.
긴 옵션에 대한 필수 인수는 짧은 옵션에도 필수입니다.
-c , --bytes = [-] N
각 파일의 처음 N 바이트를 인쇄합니다. 선행 '-'를 사용하여 각 파일의 마지막 N 바이트를 제외하고 모두 인쇄합니다.
라인을 grep 한 다음 예를 들어 다음과 같이자를 수도 있습니다.
grep '텍스트'파일 이름 | 컷 -c 1-5
나는 6 년 전 질문에 대한 대답이라는 것을 알고 있습니다.
그러나 나는 몇 시간 동안 비슷한 것을 찾고 있었는데 , cut -c 가 정확히 그것을 수행하고 오프셋을 지정할 수도있는 추가 보너스를 제공한다는 것을 알게되었습니다.
cut -c 1-5 는 Hello 를 반환 하고 cut -c 7-11 은 world 를 반환 합니다 . 다른 명령이 필요하지 않습니다.
몇 년 전에 답변 / 수락되었지만 현재 허용 된 답변은 iso-8859-1과 같은 문자 당 1 바이트 인코딩 또는 라틴 문자와 같은 가변 바이트 문자 집합의 단일 바이트 하위 집합에 대해서만 정확합니다. UTF-8 내). 대신 멀티 바이트 스플 라이스를 사용하더라도 UTF-16과 같은 고정 멀티 바이트 인코딩에서만 작동합니다. 이제 UTF-8이 보편적 인 표준이되고 있다는 점을 감안할 때, 이 언어 목록을 원어민 수 와 원어민 / 보조 사용에 따른 상위 30 개 언어 목록을 살펴보면 다음 을 지적하는 것이 중요합니다. 간단한 가변 바이트 문자 친화적 (바이트 기반 아님) 기술, cut -c및 사용tr /sed 문자 클래스들.
이중 바이트 대 문자 문제 (하나는 관련 인해 두 가지 일반적인 라틴 중심의 실수 / 가정 사항 실패 다음 비교 head대 cut, 다른 하나는 [a-z][A-Z]대를 [:upper:][:lower:])
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
이 (: FreeBSD의에이 가공 한 미세하지만 모두 참고 cut및 tr저 생각에 대한 UTF-8 그리스 여전히 엉망 GNU / 리눅스에) :
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
더 최근의 또 다른 답변은 이미 "컷"을 제안했지만 직접적으로 관련된 문자 대 바이트 문제가 아니라 임의의 오프셋을 지정하는 데 사용할 수있는 부수적 인 문제 때문입니다.
귀하의 경우 cut처리하지 않습니다 -c"처음에 대해 제대로 가변 바이트 인코딩과 X문자"(교체X 사용자의 숫자로 )에 대해 다음을 시도 할 수 있습니다.
sed -E -e '1 s/^(.{X}).*$/\1/' -e q -하지만 첫 번째 줄로 제한됩니다.head -n 1 | grep -E -o '^.{X}' -첫 번째 줄로 제한되고 두 개의 명령을 연결합니다.dd -이미 다른 답변에서 제안되었지만 정말 번거 롭습니다.sed여러 줄에 걸쳐있는 문자를 처리하기위한 슬라이딩 윈도우 버퍼가 있는 복잡한 스크립트이지만 다음과 같은 것을 사용하는 것보다 번거 롭거나 깨지기 쉽습니다.dd당신이 경우 tr변수 바이트 인코딩과 문자 클래스를 처리하지 않습니다 정확하게 당신이 시도 할 수 :
sed -E -e 's/[[:upper:]]/\L&/g (GNU 관련)printf 'Πού ' | cut -c 1그냥 횡설수설을 반환합니다 ... '머리'처럼 동작합니다.
다음은 다음을 사용하여 마무리하는 간단한 스크립트입니다. dd 언급 된 접근 방식 .
#!/usr/bin/env bash
function show_help()
{
IT="
extracts characters X to Y from stdin or FILE
usage: X Y {FILE}
e.g.
2 10 /tmp/it => extract chars 2-10 from /tmp/it
EOF
"
echo "$IT"
exit
}
if [ "$1" == "help" ]
then
show_help
fi
if [ -z "$1" ]
then
show_help
fi
FROM=$1
TO=$2
COUNT=`expr $TO - $FROM + 1`
if [ -z "$3" ]
then
dd skip=$FROM count=$COUNT bs=1 2>/dev/null
else
dd skip=$FROM count=$COUNT bs=1 if=$3 2>/dev/null
fi
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo또한" world\n"영원히 잃어버린 소비 합니다.