回答:
標準的な方法はwc
、を使用する方法です。引数を使用して、カウント対象(バイト、文字、単語など)を指定します。-l
回線用です:
$ wc -l file.txt
1020 file.txt
cat matlab.git.diff | sed -e '/^\+[ ]*.*\%$/d' | wc -l
。/regexp/d
それが一致する場合に行を削除しregexp
、そして-e
ために十分な(IMNSHO)構文をオンにしますregexp
。
grep -v '^+ *%' matlab.git.diff | wc -l
か?
grep
ようなコメントケースと見なすためにコマンドを変更することは可能ですか?" + Hello"
+
grep -v '^ *+' matlab.git.diff | wc -l
引用符は実際には行の一部であることを意図していないと仮定し+
ます。少なくとも1つのスペースが必須です。星*
を\+
に置き換えるか、星の前に別のスペースを追加するだけです。おそらくスペースだけを一致させるのではなく、任意の空白を一致させたいでしょう。このため、スペースをに置き換え[[:space:]]
ます。%
あなたの例にはないので、マッチングも削除したことに注意してください。
マイケルが言っwc -l
たように、行くべき道です。しかし、どういうわけかあなたが不可解に持っているbash
場合perl
、またはawk
そうwc
ではないが、いくつかのソリューションがあります:
$ LINECT=0; while read -r LINE; do (( LINECT++ )); done < file.txt; echo $LINECT
$ perl -lne 'END { print $. }' file.txt
そしてはるかに読みにくい:
$ perl -lne '}{ print $.' file.txt
$ awk 'END {print NR}' file.txt
スティーブンDはGNUを忘れましたsed
:
sed -n '$=' file.txt
また、ファイル名を出力せずにカウントが必要で、使用している場合wc
:
wc -l < file.txt
ちょっとだけ:
cat -n file.txt | tail -n 1 | cut -f1
grep -c ''
、またはtr -dc '\n' | wc -c
、またはnl -ba -nln | tail -n 1 |sed -e 's/[^0-9].*//'
...これらのいずれかが(行を数える以上のことを行うプログラムを作成するために構築するものとは対照的に)wc -l
純粋で(ba)sh 以外に有用ですか?
sed 's/.*//' file.txt | uniq -c
uniq -c -w 0 file.txt
することができますcut -c -7
。それとも、もっとPOSIXly: uniq -c file.txt | awk '{c+=$1}END{print c}'
。どうですかdc
(POSIXではありませんが)?uniq -c file.txt | cut -c -7 | sed '$alax' | dc -e '[pq]sb[+z1=blax]sa' -
。bc
POSIX:uniq -c file.txt | cut -c -7 | sed -n ':a;${s/\n/ + /gp;b};N;ba' | bc
です。限られた行の長さを想定した場合の簡単な答え:uniq -c -f 100000 file.txt
。
使用時の警告の言葉
wc -l
wc -lは\ nをカウントすることで機能するため、ファイルの最終行が事実上改行で終わっていない場合、行カウントは1オフになります(したがって、ファイルの末尾に改行を残す古い規則)。
特定のファイルが最後の行を改行で終了する規則に従っているかどうかはわからないので、改行に関係なくカウントに最後の行を含めるこれらの代替コマンドを使用することをお勧めします。
sed -n $= filename
perl -lne 'END { print $. }' filename
awk 'END {print NR}' filename
grep -c '' filename