Help us understand the problem. What is going on with this article?

ファイルの中にある特定文字列を数える

More than 5 years have passed since last update.

Linux上のとあるファイルの中から特定の文字列が何個含まれてるか

状況例

hoge.txt
hogefugapiyohogefugapiyo
hogehogehogehogehogehoge

みたいなファイルから「hoge」の数を知りたい時。
(ちなみに 8 こ)

ビルトインのコマンドで何とか出現回数を調べようと思ったのですが、上手く行かなかったのでPythonでスクリプト書いてみました。
(grepだと一行に複数回の出現に対応できなかったりするので)

特定文字列の数を計算するスクリプト

match_count.py
# -*- coding: utf-8 -*-
#!/usr/bin/env python

import sys
import os.path


def clean_args(args):
    if len(args) == 2:
        search_word = args[1] 
        return (True, None, search_word)
    if len(args) != 3: 
        print "[Usage] match_count.py $filename $search_word"
        return (False, None, None)

    target_file_path = args[1]
    search_word       = args[2] 

    if not os.path.exists(target_file_path):
        print "[Error] File is not exist."
        return (False, None, None)

    return (True, target_file_path, search_word)


def count_words(filename, search_word):

    if filename is not None:
        # python 2.4だったのでwith使えず
        stream = open(filename, 'r')
        counter = _count(stream, search_word)
        stream.close()
        return counter
    else :
        return _count(sys.stdin, search_word)


def _count(stream, search_word):
    counter = 0
    for line in stream:
        counter += line.count(search_word)
    return counter


def main():

    args = sys.argv
    (is_valid, filename, search_word) = clean_args(args)
    if not is_valid:
        sys.exit()

    print count_words(filename, search_word)


if __name__ == '__main__':
    main()

このファイルをLinux上で作って、実行権限をつけます。

使い方

$ ./match_count.py hoge.txt hoge
8

みたいな感じでhogeにマッチした数を取得できます。

パイプにも対応してみたので

$ cat hoge.txt | ./match_count.py hoge
8

みたいにしても使えます。
複数ファイルをcatしたりすれば捗るかな。

kimihiro_n
Python, Goでサーバーサイド書いてます。
http://kimihiro-n.appspot.com/
jxpress
技術力で「ニュースの産業革命」を起こす。言語処理・データ解析分野の専門家が集まる、News Techベンチャー。
https://jxpress.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away