81

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

4

6 に答える 6

160

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

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

于 2012-08-18T21:31:02.690 に答える
15

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

wc -l < "$JAVA_TAGS_FILE"
于 2012-08-18T21:17:53.503 に答える
12

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

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

または

awk 'END {print NR}' filename

于 2015-08-11T12:33:09.073 に答える
6

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

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

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

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

またはさらに良い(gniourf_gniourfに感謝):

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

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

于 2015-10-18T05:32:13.373 に答える
3

それは非常に簡単です:

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

また

NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')
于 2012-08-18T21:18:35.853 に答える
-3

私は通常、bashの「バックティック」機能を使用します

export NUM_LINES=`wc -l filename`

'tick'は'backtick'であることに注意してください。例:`は通常の一重引用符ではありません

于 2014-07-18T12:45:56.267 に答える