文書の行を数える方法は?


1077

このような行があり、実際に何行あるか知りたい...

09:16:39 AM  all    2.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   94.00
09:16:40 AM  all    5.00    0.00    0.00    4.00    0.00    0.00    0.00    0.00   91.00
09:16:41 AM  all    0.00    0.00    4.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:42 AM  all    3.00    0.00    1.00    0.00    0.00    0.00    0.00    0.00   96.00
09:16:43 AM  all    0.00    0.00    1.00    0.00    1.00    0.00    0.00    0.00   98.00
09:16:44 AM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
09:16:45 AM  all    2.00    0.00    6.00    0.00    0.00    0.00    0.00    0.00   92.00

Linuxコマンドを使用してそれらをすべてカウントする方法はありますか?


4
vimを使用してファイルを開き、次にと入力しg <Ctrl-g>ます。行数、単語数、列数、バイト数が表示されます
Luv33preet

31
@ Luv33preetすると、SOに戻って、vimを終了する方法を調べます
Skylar Ittner

5
@SkylarIttnerそして、vimを終了する方法を調べる必要がある場合<esc> :q!は、それが唯一の答えです。(これは冗談です。保存されていないすべての変更が削除されます。冗談は、vimがわからない場合、ファイルをめちゃくちゃにするのは簡単なので、保存しないことをお勧めします)。
ライアン

回答:


2031

使用wc

wc -l <filename>

これは行数を出力します<filename>

$ wc -l /dir/file.txt
3272485 /dir/file.txt

または、<filename>結果からを省略するには、次を使用しますwc -l < <filename>

$ wc -l < /dir/file.txt
3272485

パイプでデータを渡すこともできwcます。

$ cat /dir/file.txt | wc -l
3272485
$ curl yahoo.com --silent | wc -l
63

18
これは素晴らしい!!:次のような行番号に付加ファイル名を取り除くためにはawkを使用する可能性がありますwc -l <file> | awk '{print $1}
CheeHow

80
さらに短くすると、次のことができますwc -l < <filename>
Tensigh 2014年

5
@ GGB667を使用してファイル名を削除することもできますcat <file> | wc -l
baptx

14
ととwatch wc -l <filename>あなたはリアルタイムでこのファイルを追跡することができます。これは、たとえばログファイルに役立ちます。
DarkSide

27
wc -lは「改行」をカウントすることに注意してください。テキストが2行あり、その間に「改行」記号が1つあるファイルがある場合、wcは「2」ではなく「1」を出力します。
コンスタンティン

140

すべての行を数えるには:

$ wc -l file

パターンを使用してラインのみをフィルタリングしてカウントするには、次のようにします。

$ grep -w "pattern" -c file  

または、-vを使用して一致を反転します。

$ grep -w "pattern" -c -v file 

-e、-i、および-x引数を確認するには、grepのマニュアルページを参照してください...


奇妙なことに、grep -c私にとってはうまくいくことがあります。主にwc -l迷惑な「機能」のパディングスペースプレフィックスが原因です。
MarkHu 2016


43

多くの方法があります。使用wcは1つです。

wc -l file

他は含んでいます

awk 'END{print NR}' file

sed -n '$=' file (GNU sed)

grep -c ".*" file

3
はい、しかし、wc -l fileあなたが行うことができますだけで、ファイル名を取得するために、あなたの行数とファイル名を与える:filename.wc -l < /filepath/filename.ext
ggb667

GNU grep -H引数を使用すると、ファイル名とカウントが返されます。 grep -Hc ".*" file
Zlemini 2016年

wc -lファイル内の実際の行ではなく改行文字をカウントするため、この解決策に投票しました。この回答に含まれる他のすべてのコマンドは、行が必要な場合に備えて適切な番号を提供します。
growlingchaos

27

このツールwcは、UNIXおよびUNIXライクなオペレーティングシステムの「ワードカウンター」ですが、-lオプションを追加することで、ファイル内の行をカウントすることもできます。

wc -l fooの行数をカウントしfooます。次のようなプログラムからの出力をパイプ処理することもできls -l | wc -lます。


3
ls -l | wc -l 実際には、合計サイズ行のディレクトリ+1にあるファイルの数が表示されます。ls -ld * | wc -l正しい数のファイルを取得することができます。
Joshua Lawrence Austill 2017

24

ディレクトリ内のすべてのファイルの合計行を確認する場合は、findおよびwcを使用できます。

find . -type f -exec wc -l {} +


15

必要なのは行数だけです(行数と戻ってくる愚かなファイル名ではありません):

wc -l < /filepath/filename.ext

前述のとおり、これらも機能します(ただし、他の理由で劣っています)。

awk 'END{print NR}' file       # not on all unixes
sed -n '$=' file               # (GNU sed) also not on all unixes
grep -c ".*" file              # overkill and probably also slower

3
この回答は、質問が行われてから3年後に投稿されたもので、他の質問をコピーしただけです。最初の部分はささいなことであり、2番目の部分はゴーストドッグの答えが追加したすべてです。反対投票。
fedorqui 'SO stop harming' 2015

4年後..反対投票。10年間の反対投票ができるか見てみましょう!
Damien Roche

1
いいえ、あなたは間違っています。ghostdogの答えは元の質問には答えません。行数とファイル名が表示されます。ファイル名だけを取得するには、filename.wc -l <​​/filepath/filename.extを実行します。それが私が答えを投稿した理由です。これを行うには、awk、sed、およびgrepはすべて少し劣る方法です。適切な方法は、私がリストしたものです。
ggb667 2016

8

nlこのように使用してください:

nl filename

からman nl

行番号を追加して、各FILEを標準出力に書き込みます。FILEがない場合、またはFILEが-の場合は、標準入力を読み取ります。


これは、改行で終わらない1行のテキストがありwc -l、0として報告されるファイルで機能することがわかった最初の回答です。ありがとうございます。
Scott Joudry、2017

7

私はこれを使ってきました:

cat myfile.txt | wc -l

それはファイル名を印刷しないので、あなたはそれawkを修正するために使用する必要がないので、私は受け入れられた答えよりもそれを好みます。受け入れられた答え:

wc -l myfile.txt

しかし、私は最良のものはGGB667の答えだと思います:

wc -l < myfile.txt

たぶんこれから使っていきます。それは私の方法よりも少し短いです。誰かがそれを好む場合に備えて、私は古いやり方を採用しています。出力は、これら2つの方法で同じです。


3
最初と最後の方法は同じです。最後のプロセスは余分なプロセスを生成しないため、より優れています

5

上記は推奨される方法ですが、「cat」コマンドも役立ちます。

cat -n <filename>

ファイルの内容全体を行番号で表示します。


5

複数のファイルの行を数える方法を探しているときにこの質問を見たので、.txtファイルの複数のファイルの行を数えたい場合は、これを行うことができます。

cat *.txt | wc -l

1つの.txtファイルでも実行されます;)


5

wc -l 行は数えません。

はい、この回答はパーティーに少し遅れる可能性がありますが、回答でより堅牢なソリューションを文書化している人はまだいません。

一般的な考えに反して、POSIXはファイルが改行文字で終わることをまったく要求しません。はい、POSIX 3.206 Lineの定義は次のとおりです。

ゼロ個以上の非<改行>文字と終了文字のシーケンス。

ただし、多くの人が気付いていないのは、POSIXはPOSIX 3.195 Incomplete Lineも次のように定義していることです。

ファイルの終わりにある1つ以上の非<改行>文字のシーケンス。

したがって、末尾のないファイルLFは完全にPOSIXに準拠しています。

両方のEOFタイプをサポートしないことを選択した場合、プログラムはPOSIXに準拠していません。

例として、次のファイルを見てみましょう。

1 This is the first line.
2 This is the second line.

EOFに関係なく、2つの行があることに同意するはずです。終了した行数ではなく、開始された行数を確認することでそれを理解しました。つまり、POSIXに従って、これらの2つのファイルは両方とも同じ行数です。

1 This is the first line.\n
2 This is the second line.\n
1 This is the first line.\n
2 This is the second line.

manページはwc、改行のカウントについて比較的明確であり、改行は単なる0x0a文字です。

NAME
       wc - print newline, word, and byte counts for each file

したがって、wc「ライン」と呼ぶものを数えることさえ試みません。wc入力ファイルのEOFによっては、行数のカウントにを使用すると、ミスカウントが発生する可能性があります。

POSIX準拠のソリューション

上記の例のように、を使用grepしてをカウントできます。このソリューションは、より堅牢で正確であり、ファイル内の行が何であるかについて、さまざまな種類のすべてをサポートします。

$ grep -c ^ FILE

4
cat file.log | wc -l | grep -oE '\d+'
  • grep -oE '\d+':数字のみを返すため。


3

wc -l次のように、ファイルの出力をリダイレクト/パイプするだけで十分です。

cat /etc/fstab | wc -l

その後、それはノーを提供します。行のみ。


3

または、ファイル名パターンのあるサブディレクトリのすべての行を数えます(たとえば、ファイル名にタイムスタンプのあるログファイル):

wc -l ./**/*_SuccessLog.csv

2

私はこれが古いことを知っていますが、それでも:フィルタリングされた行をカウントします

私のファイルは次のようになります:

Number of files sent
Company 1 file: foo.pdf OK
Company 1 file: foo.csv OK
Company 1 file: foo.msg OK
Company 2 file: foo.pdf OK
Company 2 file: foo.csv OK
Company 2 file: foo.msg Error
Company 3 file: foo.pdf OK
Company 3 file: foo.csv OK
Company 3 file: foo.msg Error
Company 4 file: foo.pdf OK
Company 4 file: foo.csv OK
Company 4 file: foo.msg Error

送信されたファイルの数を知りたい場合は、次のようにします。

grep "OK" <filename> | wc -l

または

grep -c "OK" filename

2

行数をカウントし、結果を変数に保存するには、次のコマンドを使用します。

count=$(wc -l < file.txt) echo "Number of lines: $count"


1

他の人が言っwc -lたように最高の解決策ですが、将来の参考のためにPerlを使うことができます:

perl -lne 'END { print $. }'

$.行番号が含まれ、ENDブロックはスクリプトの最後に実行されます。


1
動作しません:dir | perl -lne 'END { print $. }' Can't find string terminator "'" anywhere before EOF at -e line 1.'
VeikkoW 2014

1
@VeikkoWは私のために働く。Windowsを使用している場合は、異なる引用規則が適用されます。しかしOPはLinux / Bashについて尋ねました。
tripleee

1
perl -lne '}{ print $. '同じことをします。
トムフェネック


1

wc -l <filename>

これにより、出力の行数とファイル名がわかります。

例えば。

wc -l 24-11-2019-04-33-01-url_creator.log

出力

63 24-11-2019-04-33-01-url_creator.log

使用する

wc -l <filename>|cut -d\ -f 1

出力の行数のみを取得します。

例えば。

wc -l 24-11-2019-04-33-01-url_creator.log|cut -d\ -f 1

出力

63


受け入れられた(10歳の)回答を繰り返すメリットはどこにありますか?
ジェブ

このスレッドの出力で行番号のみを取得するコマンドが見つからなかったためです。
過酷なサロヒ

これは、受け入れられた回答の2番目の例です。wc -l < filename
ジェブ

wc -l <​​filename>は、出力のファイル名と行数を示します。
過酷なサロヒ

いいえ、wc -l < filenameとは異なりwc -l filenameます。最初はリダイレクトを使用し、user85509からの回答に
jeb

1

このドロップインポータブルシェル関数[ℹ]   は魅力のように機能します。次のスニペットを.bashrcファイル(またはシェル環境に相当するもの)に追加するだけです。

# ---------------------------------------------
#  Count lines in a file
#
#  @1 = path to file
#
#  EXAMPLE USAGE: `count_file_lines $HISTFILE`
# ---------------------------------------------
count_file_lines() {
    local subj=$(wc -l $1)
    subj="${subj//$1/}"
    echo ${subj//[[:space:]]}
}

これは、bashおよびzshに加えて、すべてのPOSIX準拠のシェルと完全に互換性があるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.