bash echo 파일 이름없이 bash 변수에 주어진 파일 줄 수


79

bash 스크립트에 다음 세 가지 구성이 있습니다.

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"

echo $(wc -l $JAVA_TAGS_FILE)" lines"

echo "$(wc -l $JAVA_TAGS_FILE) lines"

그리고 스크립트가 실행될 때 둘 다 동일한 출력을 생성합니다.

121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines

즉, 파일 이름도 에코됩니다 (원하지 않음). 이 스크립 렛이 실패하는 이유는 무엇이며 어떻게 출력해야합니까?

121711 lines

?


답변:


157

자체 데이터를 사용한 예

wc에 인수로 파일 이름을 전달하는 대신 JAVA_TAGS_FILE의 리디렉션을 사용하여 NUMOFLINES 변수에 파일 이름이 포함되지 않도록 할 수 있습니다 . 예를 들면 :

NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")

설명 : 파이프 또는 리디렉션을 사용하여 출력에서 ​​파일 이름 방지

WC 입력 파이프 또는 리디렉션 연산자에서 촬영하는 경우 유틸리티는 출력 파일의 이름을 출력하지 않을 것이다. 다음과 같은 다양한 예를 고려하십시오.

# wc shows filename when the file is an argument
$ wc -l /etc/passwd
41 /etc/passwd

# filename is ignored when piped in on standard input
$ cat /etc/passwd | wc -l
41

# unusual redirection, but wc still ignores the filename
$ < /etc/passwd wc -l
41

# typical redirection, taking standard input from a file
$ wc -l < /etc/passwd
41

보시다시피 wc 가 파일 이름을 인쇄 하는 유일한 시간 은 표준 입력의 데이터가 아닌 인수로 전달 될 때입니다. 어떤 경우에는 파일 이름이 인쇄되기를 원할 수 있으므로 언제 표시되는지 이해하는 것이 유용합니다.


1
이 방법은 마지막 줄이 줄 끝 문자로 끝나지 않으면 마지막 줄을 포함하지 않습니다. 아래 수정 사항을 참조하십시오.
ling

15

wc 파일 이름을주지 않으면 파일 이름을 가져올 수 없습니다.

wc -l < "$JAVA_TAGS_FILE"

2
그럼 하지마. wc대답에 표시된대로 파일을 의 stdin에 전달하십시오 . 그래서 cat "$JAVA_TAGS_FILE" | wc -l또는 동등하게 wc -l < "$JAVA_TAGS_FILE". 이렇게 wc하면 파일 이름이 아닌 원시 데이터 만 가져옵니다.
Witiko 2013

12

awk를 사용할 수도 있습니다.

awk 'END {print NR,"lines"}' filename

또는

awk 'END {print NR}' filename


5

(Mac 및 기타 Unix에 적용)

실제로 wc 접근 방식에 문제가 있습니다. 줄 끝 기호로 끝나지 않으면 마지막 줄을 계산하지 않습니다.

대신 사용

nbLines=$(cat -n file.txt | tail -n 1 | cut -f1 | xargs)

또는 더 좋습니다 (gniourf_gniourf에게 감사드립니다) :

nblines=$(grep -c '' file.txt)

참고 : chilicuil의 awk 접근 방식도 작동합니다.


2
매우 복잡한 방법! nblines=$(grep -c '' file)대신 원할 수도 있습니다 (이 경우 불완전한 줄을 계산하는 표준 방법). POSIX에 따르면 불완전한 줄을 계산하고 있습니다 ( 줄이 아님). 실제로 텍스트 파일이 아닌 바이너리 파일을 다루고 있습니다 .
gniourf_gniourf

@gniourf_gniourf 감사합니다. 저는 그것에 대해 몰랐습니다. 훌륭하게 작동하고 더 간결합니다.
ling

그것은 어쩌면 더 나은 솔루션nblines=$(($(cat "file.txt" | wc -l) + 1))
안드레이 Izman

3

매우 간단합니다.

NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )

또는

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')

첫 번째는 고양이의 쓸모없는 사용입니다.
kap

@kap 아니요, 이렇게 생겼어요. 를 제거 cat하면 두 번째 예가 wc -l있습니다. 파일에만 사용할 때 2 개의 열을 반환 하기 때문 입니다.
Slava Semushin

-3

나는 일반적으로 bash의 '백틱'기능을 사용합니다.

export NUM_LINES=`wc -l filename`

'틱'은 '백틱'입니다. 예를 들어`일반 작은 따옴표가 아닙니다.


5
이는 다른 표기법 일 뿐이며 파일 이름이 결과의 일부가되는 문제를 해결하지 못합니다.
Izzy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.