ファイル内の行、単語、バイト数を数えることは便利ですが、Linuxwc
コマンドの真の柔軟性は他のコマンドと連携することから生まれます。見てみましょう。
wcコマンドとは?
wc
コマンドは小さなアプリケーションです。これはLinuxのコアユーティリティの1つなので、インストールする必要はありません。Linuxコンピュータにすでに搭載されています。
その機能を一言で説明することができます。ファイルまたはファイルの選択内の行、単語、バイトをカウントし、その結果を端末ウィンドウに出力します。また、STDINストリームから入力を取得することもできます。つまり、処理するテキストをパイプで入力できます。これがwc
が真に価値を発揮し始める場所です。
これは、「1つのことをやってそれを完璧にこなす」というLinuxの格言の好例です。パイプ入力を受け入れるため、複数のコマンドの呪文で使用できます。この小さなスタンドアロンユーティリティは、実際には優れたチームプレーヤーであることがわかります。
私がwc
を使用する1つの方法は、私が作成している複雑なコマンドまたはエイリアスのプレースホルダーとしてです。完成したコマンドが破壊的でファイルを削除する可能性がある場合、私は多くの場合wc
を実際の危険なコマンドの代わりとして使用します。
そうすることで、コマンドの開発中に、各ファイルが期待どおりに処理されているという視覚的なフィードバックが得られます。構文に問題がある間は、悪いことが起こる可能性はありません。
wc
はシンプルですが、知っておくべき小さな癖がいくつかあります。
wcを使い始める
wc
を使用する最も簡単な方法は、コマンドラインでテキストファイルの名前を渡すことです。
wc lorem.txt
これにより、wc
がファイルをスキャンして行、単語、バイトをカウントし、それらを端末ウィンドウに書き出します。
単語とは、空白で区切られたものとみなされます。それが実際の言語の単語であるかどうかは関係ありません。ファイルに「frd g lkj」しか含まれていない場合でも、それは3つの単語としてカウントされます。
行は、キャリッジリターンまたはファイルの終わりによって終了する文字のシーケンスです。行がエディターまたは端末ウィンドウで折り返されるかどうかは関係ありません。wc
がキャリッジリターンまたはファイルの終わりに遭遇するまでは、同じ行です。
最初の例では、ファイル全体で1行が見つかりました。「lorem.txt」ファイルの内容を次に示します。
cat lorem.txt
キャリッジリターンがないため、すべてが1行としてカウントされます。別のファイル「lorem2.txt」と、wc
がそれをどのように解釈するかを比較してください。
wc lorem2.txt
cat lorem2.txt
今回は、特定の場所で新しい行を開始するためにキャリッジリターンがテキストに挿入されているため、wc
は15行をカウントします。ただし、テキストを含む行を数えると、12行しかないことがわかります。
他の3行は、ファイルの最後に空行です。これらにはキャリッジリターンのみが含まれています。これらの行にテキストがない場合でも、新しい行が開始されているため、wc
はそれらをそのようにカウントします。
好きなだけwc
にファイルを渡すことができます。
wc lorem.txt lorem2.txt
各ファイルの統計とすべてのファイルの合計を取得します。
ワイルドカードを使用することで、明示的に名前を指定したファイルではなく、一致するファイルを選択することもできます。
wc *.txt *.?
コマンドラインオプション
デフォルトでは、wc
は各ファイルの行、単語、バイトを表示します。-l
(行)、-w
(単語)、-c
(バイト)オプションを使用するのと同じです。
wc lorem.txt
wc -l -w -c lorem.txt
表示する数値の組み合わせを指定できます。
wc -l lorem.txt wc -w lorem.txt wc -c lorem.txt wc -l -c lorem.txt
-c
(バイト)オプションで生成された最後の数値には特に注意が必要です。多くの人は、これが文字をカウントしていると勘違いしています。実際にはバイトをカウントします。文字数とバイト数は同じである可能性があります。しかし、常にそうではありません。
「unicode.txt」というファイルの内容を見てみましょう。
cat unicode.txt
3つの単語と非ラテン文字が含まれています。wc
でファイルのデフォルト設定のバイトを処理し、-m
(文字)オプションで文字を要求してもう一度処理してみます。
wc unicode.txt
wc -l -w -m unicode.txt
バイトの方が文字よりも多くなっています。
ファイルの16進ダンプを見て何が起こっているか確認しましょう。hexdump
コマンドの-C
(正規)オプションは、ファイル内のバイトを16行で表示し、その行の最後にプレーンASCIIの同等物(ある場合)を示します。対応するASCII文字がない場合は、代わりにピリオド「.
」が表示されます。
hexdump -C unicode.txt
ASCIIでは、16進値の0x20
はスペース文字を表します。左から3つの値を数えると、次の値がスペース文字であることがわかります。したがって、最初の3つの値0x62
、0x6f
、および0x79
は「boy」の文字を表します。
0x20
を飛び越えると、もう1つの3つの16進値のセットが表示されます:0x63
、0x61
、および0x74
。これらは「cat」と綴られています。次のスペース文字を飛び越えると、「dog」の文字の3つの値が表示されます。これらは0x64
、0x5f
、および0x67
です。
「dog」の単語のすぐ後ろに、スペース文字0x20
と5つの16進値が表示されます。最後の2つはキャリッジリターン0x0a
です。
他の3つのバイトは、緑で囲んだ非ラテン文字を表しています。これはUnicode文字で、エンコードするには3つのバイトが必要です。これらは0xe1
、0xaf
、および0x8a
です。
したがって、何をカウントしているかを知り、バイトと文字が同じである必要はないことを確認してください。通常、バイトをカウントする方が便利です。ファイル内に実際に何が含まれているかがわかるからです。文字でカウントすると、ファイルの内容で表されるものの数がわかります。
ファイル名を取得
wc
にファイル名を提供する別の方法があります。ファイル名を取得するファイルにファイル名を入れ、そのファイルの名前をwc
に渡します。ファイルが開かれ、ファイル名が抽出され、コマンドラインで渡されたかのように処理されます。これにより、再利用するために任意のファイル名の収集を保存できます。
しかし、大きな落とし穴があります。ファイル名はキャリッジリターンで終了するのではなく、ヌルで終了する必要があります。つまり、各ファイル名の後に、通常のキャリッジリターンバイト0x0a
ではなく、ヌルバイト0x00
がある必要があります。
エディタを開いてこの形式でファイルを作成することはできません。通常、このようなファイルは他のプログラムによって生成されます。しかし、そのようなファイルがある場合、その使用方法を次に示します。
ファイル名を含むファイルは次のとおりです。less
で開くと、less
がヌルバイトを示すために使用する奇妙な「^@
」文字が表示されます。
less source-files-list.txt
wc
でファイルを使用するには、--files0-from
(入力を読み取る)オプションを使用し、ファイル名を含むファイルの名前を渡す必要があります。
wc ---files0-from=source-files-list.txt
ファイルは、コマンドラインで提供されたかのように正確に処理されます。
wcへの入力のパイプ処理
入力wc
に送信するより一般的で、柔軟性があり、生産的な方法は、他のコマンドからの出力をwc
にパイプ処理することです。これはecho
コマンドで示すことができます。
echo "Count this for me" | wc
echo -e "Count this\nfor me" | wc
2番目のecho
コマンドは-e
(エスケープ文字)オプションを使用して、「\n
」改行書式コードなどのエスケープシーケンスを許可します。これにより新しい行が挿入され、wc
が入力を2行として認識します。
あるコマンドから別のコマンドに入力をフィードするコマンドの連鎖を次に示します。
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
- findは、現在のディレクトリから開始して、再帰的にファイル(
type -f
)を探します。rev
はファイル名を反転します。 - cutは、フィールド区切り文字をピリオド「
.
」と定義し、反転されたファイル名の「先頭」から最初に見つかったピリオドまで読み取って、最初のフィールド(-f1
)を抽出します。これでファイル拡張子が抽出されました。 - revは、抽出された最初のフィールドを反転します。
- sortは、昇順のアルファベット順に並べ替えます。
- uniqは、一意のエントリを端末ウィンドウに一覧表示します。
このコマンドは、現在のディレクトリとすべての子ディレクトリにある一意のファイル拡張子をすべて一覧表示します。
uniq
コマンドに-c
(カウント)オプションを追加すると、各拡張子タイプの出現回数がカウントされます。しかし、異なる一意のファイル拡張子の数が知りたい場合は、wc
を最後のコマンドとして行から削除し、-l
(行)オプションを使用できます。
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l
最後に
最後に、wc
があなたのためにできるトリックを1つ紹介します。ファイル内の最長行の長さを教えてくれます。残念ながら、どの行かは教えてくれません。長さだけを教えてくれます。
wc -L taf.c
ただし、タブは8スペースとしてカウントされることに注意してください。エディタで表示すると、その行の先頭に2スペースのタブが3つあります。実際の長さは124文字です。したがって、報告された数字は人為的に拡張されています。
私はこの機能を大いに疑って扱います。つまり、使用しないということです。その出力は誤解を招きます。
その癖にもかかわらず、wc
は、ファイル内の単語だけでなく、あらゆる種類の値をカウントする必要がある場合に、パイプ処理されたコマンドにドロップするのに最適なツールです。
コメントする