7行のファイルがあるとしましょう。たとえば、
a
b
c
#
d
e
実行するとgrep -c '#' -c -v filenamehere
6行が表示されます。
スペースを削除するために5行を表示したいと思います。
答え1
あなたのファイルに七しかし、空ではなく、で始まらない行を計算しようとしています#
。
$ grep -c '^[^#]' file
5
最初に文字以外の文字を含む行数を数えます#
。
この式は[^#]
ではなく単一の文字と一致します#
。式全体が行の先頭と一致しません^[^#]
。#
空行はこの式と一致せず、#
¹で始まる行も一致しません。
空でない行のみを計算するには:
$ grep -c '.' file
6
少なくとも1つの文字を含む行の数を数えます。
完全性のために空行数を数えます。
$ grep -c -v '.' file
1
空行または次から始まる行を計算するには#
:
$ grep -c -v '^[^#]' file
2
と両方とも-c
「-v
グローバル」オプションです。grep
コマンドラインに入力すると、ジョブ全体の動作が変わります。複数回-c
指定することは-v
意味がなく、オプション引数を受け入れません。
また、最初の引数を除くすべてのオプションの後にパターンまたは正規表現を指定する場合は、このパターンが検索中のパターンであることを知るために使用し-e 'pattern'
てください。grep
つまり、
grep -e '.' -c -v file
または
grep -c -e '.' -v file
または
grep -c -v '.' file
GNUは、grep
パス名オペランドの前にオプションが表示されるようにコマンドラインを並べ替えますが(POSIXLY_CORRECT
環境で設定されていない場合)、通常はgrep
すべての実装で機能する移植可能なシェルコードを書こうとします。
ほとんどの実装では、文字ではなく文字(ユーザーロケール文字マップで有効な文字を形成しないバイトシーケンス)で始まる行も除外されますgrep
。LC_ALL=C grep
この問題を解決するために使用できます。これは移植可能な文字セットの一部であるため有効であるため、#
特定のシステムのロケール間で変更されることなく維持する必要があります。