답변:
head
파일에서 첫 번째 줄을 가져오고 -n
매개 변수를 사용하여 추출 할 줄 수를 지정할 수 있습니다.
line=$(head -n 1 filename)
line="$(head -1 FILENAME)"
line=`head -1 FILENAME`
head...
이 서브 쉘을 여는가 $()
?
$()
구문은 더 쉽게 알 수 있지만 절대적으로 간결함에 대한 가치는 명확합니다. gnu.org/software/bash/manual/html_node/…
bash를 사용하여 첫 번째 줄을 읽으려면 read
statement를 사용하십시오 . 예 :
read -r firstline<file
firstline
변수가 될 것입니다 (다른 것에 할당 할 필요가 없습니다)
cat ... | read VAR
셸에서 실행 되므로 @sorin 은 대부분의 셸에서 실패합니다 ( zsh
내가 아는 한 모두 제외 ). $VAR
호출 쉘이 아닌 서브 쉘 (파이프 라인이 실행을 완료하자마자 존재하지 않음)에서 설정 됨을 의미합니다 . 이 문제를 해결할 수 있습니다 read VAR <<EOF\n$(cat ...)\nEOF
(각각 \n
줄 바꿈).
cat
은 순수한 오버 헤드입니다. 훨씬 더 효율적으로 read -r var <file
보다 cat file | read
어쨌든, 심지어 경우 후자에 설명 된 이유로 실패하지 않았다 BashFAQ # 24 .
cat
다음read -r var < <(otherprog ...)
이것으로 filename
변수 의 첫 줄을 충분하게 저장합니다 $line
.
read -r line < filename
나는 또한 awk
이것을 좋아 한다.
awk 'NR==1 {print; exit}' file
줄 자체를 저장하려면 var=$(command)
구문을 사용하십시오 . 이 경우, line=$(awk 'NR==1 {print; exit}' file)
.
또는 심지어 sed
:
sed -n '1p' file
동등 line=$(sed -n '1p' file)
합니다.
read
with를 공급할 때의 샘플 seq 10
, 즉 1에서 10까지의 숫자 시퀀스를 참조하십시오 .
$ read -r line < <(seq 10)
$ echo "$line"
1
$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1
sed '1!d;q'
(또는 sed -n '1p;q'
)는 awk
논리 를 모방하여 파일을 더 이상 읽지 못하게합니다. 우리는 첫 번째 라인을 원하기 때문에, 우리는 다른 방법으로 부정 행위를 할 수 sed q
또는 awk '1;{exit}'
심지어 grep -m1 ^
(적은 코드, 같은 필수 로직). (이것은 downvote 문의에 대한 답변이 아닙니다.)
grep
매우 똑똑한 것을 찾습니다 . 물론 말할 수도 있습니다 head -n 1 file
.
head -n1
더 빠를 것입니다 (더 작은 이진로드). 더 빠릅니다 (이진이로드 read
되지 않음). 나는 grep -m1 --color .
첫 번째 줄을 인쇄 할 때 특히 좋아 합니다. 줄을 색칠하기 때문에 표 제목에 적합합니다.
line=$(head -1 file)
잘 작동합니다. (이전 답변). 그러나
line=$(read -r FIRSTLINE < filename)
read
내장 bash 명령 처럼 약간 빠릅니다 .
read
아무것도 인쇄하지 않기 때문에 ( line
빈 줄임) 서브 쉘에서도 실행되므로 ( FIRSTLINE
첫 번째 줄로 설정되지만 서브 쉘에서만 설정되므로 나중에 사용할 수 없으므로 ) 작성된대로 작동 하지 않습니다 . 해결책 : 그냥 사용하십시오read -r line <filename
질문은 어느 것이 가장 빠른지 묻지 않았지만 sed 답변에 추가하기 위해 패턴 공간이 여전히 큰 파일에서 스캔되므로 -n '1p'가 제대로 수행되지 않습니다. 호기심으로 나는 'head'가 sed를 좁게 이겼다는 것을 알았습니다.
# best:
head -n1 $bigfile >/dev/null
# a bit slower than head (I saw about 10% difference):
sed '1q' $bigfile >/dev/null
# VERY slow:
sed -n '1p' $bigfile >/dev/null
read
접근법 보다 훨씬 더 많은 오버 헤드 .$()
서브 쉘을 분기하고 외부 명령 ( 모든 외부 명령)을 사용한다는 것은execve()
호출하고 링커와 로더를 호출 함을 의미합니다 (일반적으로 공유 라이브러리를 사용하는 경우).