지정된 수의 문자를 읽는 Linux 명령 (예 : cat)


120

cat파일에서 지정된 양의 문자를 반환 할 수있는 Linux 와 같은 명령이 있습니까?

예를 들어 다음과 같은 텍스트 파일이 있습니다.

Hello world
this is the second line
this is the third line

그리고 저는 "hello"가 될 처음 5 개의 문자를 반환하는 것을 원합니다.

감사


주어진 답변 중 어느 것도 스트림에서 N 바이트 만 소비하지 않습니다. 예를 들어 : mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo또한 " world\n"영원히 잃어버린 소비 합니다.
Yeti

답변:


192

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

@Miffy :로 처음 20 바이트를 읽은 head다음 tail마지막 10 바이트 를 가져 오는 데 사용 합니다. 예 :head -c 20 file | tail -c 10
Dan

47

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

2
dd bs=1dd가 한 번에 한 문자를 읽고 쓰도록 강제하기 때문에 일반적으로이 솔루션에 반대하는 것이 좋습니다 head. 카운트가 클 때보 다 훨씬 느립니다 . 하지만 count = 5에서는 눈에 띄지 않습니다.
ephemient

2
"dd count = 1 bs = 5"는 어떻습니까? 한 번에 5 바이트를 읽는 헤드가 있습니다. 그래도 머리는 아마도 더 명확한 해결책 일 것입니다.
Ben Combee

1
감사합니다. 사실 바이너리 파일을 '잘라 내기'방법을 찾고 있었는데 dd, 그게 트릭을 할 것 같습니다. 건배!
sdaau 2010

없이이 비지 박스에 생명의 은인이었다 head -c구현 dd bs=5 count=1방식은 일
제이 Paroline을

11

머리 :

이름

head-파일의 첫 부분 출력

개요

헤드 [ 옵션 ] ... [ 파일 ] ...

기술

각 FILE의 처음 10 줄을 표준 출력으로 인쇄합니다. 둘 이상의 FILE을 사용하는 경우 각 파일 앞에 파일 이름을 제공하는 헤더를 붙입니다. FILE이 없거나 FILE이-인 경우 표준 입력을 읽습니다.

긴 옵션에 대한 필수 인수는 짧은 옵션에도 필수입니다.
-c , --bytes = [-] N 각 파일의 처음 N 바이트를 인쇄합니다. 선행 '-'를 사용하여 각 파일의 마지막 N 바이트를 제외하고 모두 인쇄합니다.


3

머리 또는 꼬리도 할 수 있습니다.

머리 -c X

파일의 처음 X 바이트 (UTF-16 파일 인 경우 문자 일 필요는 없음)를 인쇄합니다. tail은 마지막 X 바이트를 제외하고 동일한 작업을 수행합니다.

이것은 (및 절단) 휴대 가능합니다.


3
head -Line_number file_name | tail -1 |cut -c Num_of_chars

이 스크립트는 특정 줄과 위치에서 정확한 문자 수를 제공합니다. 예 :

head -5 tst.txt | tail -1 |cut -c 5-8

5 행의 문자와 5 행의 문자 5 ~ 8을 제공합니다.

참고 : tail -1헤드에 표시되는 마지막 줄을 선택하는 데 사용됩니다.


2

라인을 grep 한 다음 예를 들어 다음과 같이자를 수도 있습니다.

grep '텍스트'파일 이름 | 컷 -c 1-5


입력 파일이 더 \ n을의와 끝없는 스트림의 경우이되지 작업을 수행
아제 Brahmakshatriya

2

나는 6 년 전 질문에 대한 대답이라는 것을 알고 있습니다.

그러나 나는 몇 시간 동안 비슷한 것을 찾고 있었는데 , cut -c 가 정확히 그것을 수행하고 오프셋을 지정할 수도있는 추가 보너스를 제공한다는 것을 알게되었습니다.

cut -c 1-5Hello 를 반환 하고 cut -c 7-11world 를 반환 합니다 . 다른 명령이 필요하지 않습니다.


2
당신의 권리!. head -c는 시작 문자 만 읽고 tail -c는 마지막 문자를 읽는 것과 달리 파일 중간에서 텍스트를 반환 할 수있는보다 일반적인 단일 명령의 가능성을 강조하고 싶었습니다. 그리고 grep을 사용하지 않고 :).
bobbyus 2014 년

2

몇 년 전에 답변 / 수락되었지만 현재 허용 된 답변은 iso-8859-1과 같은 문자 당 1 바이트 인코딩 또는 라틴 문자와 같은 가변 바이트 문자 집합의 단일 바이트 하위 집합에 대해서만 정확합니다. UTF-8 내). 대신 멀티 바이트 스플 라이스를 사용하더라도 UTF-16과 같은 고정 멀티 바이트 인코딩에서만 작동합니다. 이제 UTF-8이 보편적 인 표준이되고 있다는 점을 감안할 때, 이 언어 목록을 원어민 수원어민 / 보조 사용에 따른 상위 30 개 언어 목록을 살펴보면 다음 을 지적하는 것이 중요합니다. 간단한 가변 바이트 문자 친화적 (바이트 기반 아님) 기술, cut -c및 사용tr /sed 문자 클래스들.

이중 바이트 대 문자 문제 (하나는 관련 인해 두 가지 일반적인 라틴 중심의 실수 / 가정 사항 실패 다음 비교 headcut, 다른 하나는 [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의에이 가공 한 미세하지만 모두 참고 cuttr저 생각에 대한 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그냥 횡설수설을 반환합니다 ... '머리'처럼 동작합니다.
LEo

온라인 문서에 따르면 아직 사용할 수 없습니다. "문자 목록에 나열된 위치의 문자 만 인쇄하려면 선택하십시오. 지금은 -b와 동일하지만 국제화로 인해 변경 될 것입니다." [ gnu.org/software/coreutils/manual/html_node/…
LEo

@LEo 두 번째 의견의 링크를 기반으로 GNU 기반 OS, 아마도 GNU / Linux를 사용하고있는 것으로 보이므로이 경우 예상됩니다. 내 대답의 끝에 언급합니다. 그 당시에는 FreeBSD에서 (& 아마도 다른 OS에서) 저를 위해 작동했지만 GNU / Linux에서는 작동하지 않았습니다 (& 아직 작동하지 않았습니다).이 경우 마지막에 대체 방법을 언급했습니다. 나는 개인적으로 누군가가 GNU 도구 세트가 그 점에서 다른 사람들과 마찬가지로 작동하는 데 필요한 국제화를 수행 할 자유 시간을 찾고 자원 할 때까지 기다릴 수 없습니다.
rowanthorpe

0

다음은 다음을 사용하여 마무리하는 간단한 스크립트입니다. dd 언급 된 접근 방식 .

extract_chars.sh

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.