web-dev-qa-db-ja.com

ファイル名なしでbash変数に指定されたファイルのbashエコー行数

Bashスクリプトには次の3つの構造があります。

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

77

独自のデータを使用した例

ファイル名を引数として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がファイル名を出力するのは、標準入力のデータとしてではなく、引数として渡されたときだけです。場合によっては、ファイル名を印刷したいことがあるので、いつ表示されるかを理解しておくと便利です。

146
Todd A. Jacobs

wcは、ファイル名を指定しないとファイル名を取得できません。

wc -l < "$Java_TAGS_FILE"

また、awkを使用することもできます。

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

または

awk 'END {print NR}' filename

12
Javier López

(Mac、およびおそらく他のUnixに適用)

実際、wcアプローチには問題があります。行末記号で終了しない場合、最後の行はカウントされません。

代わりにこれを使用してください

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

またはそれ以上(gniourf_gniourfに感謝):

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

注:chilicuilによるawkアプローチも機能します。

5
ling

それは非常に簡単です:

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

または

NUMOFLINES=$(wc -l $Java_TAGS_FILE | awk '{print $1}')
3
Slava Semushin