bash 스크립트에서 파일의 첫 줄을 얻는 방법?


249

bash 변수에 파일의 첫 줄을 넣어야합니다. grep 명령을 사용하는 것 같지만 줄 수를 제한하는 방법이 있습니까?

답변:


397

head파일에서 첫 번째 줄을 가져오고 -n매개 변수를 사용하여 추출 할 줄 수를 지정할 수 있습니다.

line=$(head -n 1 filename)

3
read접근법 보다 훨씬 더 많은 오버 헤드 . $()서브 쉘을 분기하고 외부 명령 ( 모든 외부 명령)을 사용한다는 것은 execve()호출하고 링커와 로더를 호출 함을 의미합니다 (일반적으로 공유 라이브러리를 사용하는 경우).
Charles Duffy

2
더 짧을 수도 있습니다 :line="$(head -1 FILENAME)"
nikolay

3
또한 :line=`head -1 FILENAME`
샤이 아론

주변의 백틱 head...이 서브 쉘을 여는가 $()?
Jaime Hablutzel

@JaimeHablutzel 그렇습니다. $()구문은 더 쉽게 알 수 있지만 절대적으로 간결함에 대한 가치는 명확합니다. gnu.org/software/bash/manual/html_node/…
Joseph Sikorski

61

bash를 사용하여 첫 번째 줄을 읽으려면 readstatement를 사용하십시오 . 예 :

read -r firstline<file

firstline 변수가 될 것입니다 (다른 것에 할당 할 필요가 없습니다)


1
파이프의 각 구성 요소는 별도의 하위 cat ... | read VAR셸에서 실행 되므로 @sorin 은 대부분의 셸에서 실패합니다 ( zsh내가 아는 한 모두 제외 ). $VAR호출 쉘이 아닌 서브 쉘 (파이프 라인이 실행을 완료하자마자 존재하지 않음)에서 설정 됨을 의미합니다 . 이 문제를 해결할 수 있습니다 read VAR <<EOF\n$(cat ...)\nEOF(각각 \n줄 바꿈).
zrajm

@sorin cat은 순수한 오버 헤드입니다. 훨씬 더 효율적으로 read -r var <file보다 cat file | read어쨌든, 심지어 경우 후자에 설명 된 이유로 실패하지 않았다 BashFAQ # 24 .
찰스 더피

... 당신보다 더 복잡 뭔가를 실행하는 경우 cat다음read -r var < <(otherprog ...)
찰스 더피

14

이것으로 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)합니다.


readwith를 공급할 때의 샘플 seq 10, 즉 1에서 10까지의 숫자 시퀀스를 참조하십시오 .

$ read -r line < <(seq 10) 
$ echo "$line"
1

$ line=$(awk 'NR==1 {print; exit}' <(seq 10))
$ echo "$line"
1

1
sed '1!d;q'(또는 sed -n '1p;q')는 awk논리 를 모방하여 파일을 더 이상 읽지 못하게합니다. 우리는 첫 번째 라인을 원하기 때문에, 우리는 다른 방법으로 부정 행위를 할 수 sed q또는 awk '1;{exit}'심지어 grep -m1 ^(적은 코드, 같은 필수 로직). (이것은 downvote 문의에 대한 답변이 아닙니다.)
Adam Katz 2016 년

@AdamKatz 매우 좋은 방법입니다. 감사합니다! 나는 grep매우 똑똑한 것을 찾습니다 . 물론 말할 수도 있습니다 head -n 1 file.
fedorqui 'SO 중지 피해'

예, head -n1더 빠를 것입니다 (더 작은 이진로드). 더 빠릅니다 (이진이로드 read되지 않음). 나는 grep -m1 --color .첫 번째 줄을 인쇄 할 때 특히 좋아 합니다. 줄을 색칠하기 때문에 표 제목에 적합합니다.
Adam Katz

12
line=$(head -1 file)

잘 작동합니다. (이전 답변). 그러나

line=$(read -r FIRSTLINE < filename)

read내장 bash 명령 처럼 약간 빠릅니다 .


21
두 번째 방법은 read아무것도 인쇄하지 않기 때문에 ( line빈 줄임) 서브 쉘에서도 실행되므로 ( FIRSTLINE첫 번째 줄로 설정되지만 서브 쉘에서만 설정되므로 나중에 사용할 수 없으므로 ) 작성된대로 작동 하지 않습니다 . 해결책 : 그냥 사용하십시오read -r line <filename
Gordon Davisson

5

echo소스 파일의 첫 번째 목록 만 대상 파일에 추가하십시오.

echo $(head -n 1 source.txt) > target.txt

3
어느 head -n 1 source.txt > target.txt것이 똑같이 달성 할 것입니다.
YoYo

4

질문은 어느 것이 가장 빠른지 묻지 않았지만 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.