複数のテキストファイルから特定の文字列を検索する方法

複数のテキストファイルから特定の文字列を検索する方法。

参考url:
Linuxコマンド逆引き大全

テキスト・ファイルから特定の文字列を含む(論理)行を抜き出すには,「grep」コマンドを用いる。grepの後に検索したい文字列を指定し,さらにその後に検索対象とするファイルを指定する。

$ grep "Linux" target_file

検索結果は標準出力に出てくるので,検索結果をファイルに残したい場合はリダイレクトを用いる。

$ grep "Linux" target_file > result

また,正規表現を用いることにより,「yyyy/mm/dd」のフォーマットで表記されている日付も探せる。正規表現を用いる場合は,「-e」オプションを付ける。

$ grep -e "[0-9]{4}/[0-9]{2}/[0-9]{2}" target_file

応用:拡張子が”php”であるファイルについて,文字列”Linux”を探す

$ find . -type f -name "*.php" | xargs grep "Linux"

findで特定のファイルを絞り込んだ後に,「xargs」コマンドでファイル名のリストを作成し,grepでそれらファイルの検索を行う。

「xargs」コマンドについてはこちら

応用:検索する際,大文字・小文字を区別しない

$ grep -i "LiNuX" target_file

“Linux”,”linux”,”LINUX”など大文字・小文字を区別せずに検索結果として扱われる。

UNIX系コマンド xargs の便利な使い方メモ

xargsコマンドの便利な使い方のメモ。

参考url:
いまさらxargsの便利さを主張してみる

使い方の例
カレントディレクトリ以下にある、最後の1文字が「~」である全てのファイルを「ls -la」する。

$ find . -name *~ | xargs ls -la
-rw-rw-r--  1 hanawa hanawa 29 Feb 19 18:23 ./c/test.c~
-rw-rw-r--  1 hanawa hanawa  9 Feb 19 18:21 ./hogehoge.txt~

ちなみに、このレシピは十分実用的な例です。xargsを利用してrmのような取り返しのつかないコマンドをいきなり実行するのは怖いので、「xargs rm」する直前に「xargs ls -la」などで対象ファイルを確認しておけばミスがありません。期待通りのファイルが「ls -la」されているのを確認した後で、シェルのヒストリを編集して「ls -la」を「rm」に書き換えて実行するわけです。

アクセス解析「AWStats日本語版」のインストール方法メモ その2

アクセス解析「AWStats日本語版」のインストール方法メモ その2

その1はこちら

  1. Apache の設定
  2. まず、Apache のログファイル名とログ形式を設定します。ファイル名は必ず「ホスト名-access_log」とし、形式は combined にしてください。

    バーチャルホストを使用していない場合

    # vi /etc/httpd/conf/httpd.conf
    
    CustomLog logs/access_log combined env=!no_log
    ↓
    CustomLog logs/blog.96q.org-access_log combined
    

    バーチャルホストを使用している場合

    # vi /etc/httpd/conf.d/virtualhost.conf
    
    <VirtualHost *:80>
    ServerName blog.96q.org
    :
    CustomLog logs/blog.96q.org-access_log combined  ←ログをこのように指定
    </VirtualHost>
    

    Web から AWStats のレポートにアクセスできるように設定します。

    # vi /etc/httpd/conf.d/awstats.conf
    
    #
    # Directives to allow use of AWStats as a CGI
    #
    Alias /classes "/usr/local/awstats/wwwroot/classes/"
    Alias /icon "/usr/local/awstats/wwwroot/icon"
    ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"
    
    #
    # This is to permit URL access to scripts/files in AWStats directory.
    #
    <Directory "/usr/local/awstats/wwwroot">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
    </Directory>

    Apache に設定を反映します。

    # /etc/init.d/httpd reload
    
  3. ログ集計の設定
  4. AWStats 完全日本語版では、オリジナルの AWStats とは違い、一度 Web サーバのログを UTF-8 変換するスクリプトを通してから集計する必要があります(でないと『完全』日本語版にはならなくなる)。

    まず、UTF-8 変換スクリプトを自分の環境に合わせて修正します。

    # vi /usr/local/awstats/wwwroot/cgi-bin/utf8_decode.pl
    
    $Myhost = "bflets.dyndns.org";      # 自ホストのchcheかの判定用.
    ↓
    $Myhost = "96q.org";  # 自ホストのchcheかの判定用.    ←自分のドメイン名に変更する
    

    次に Apache のログを UTF-8 変換スクリプトに通し、AWStats に集計させるスクリプトを作成します。

    # vi /usr/local/bin/awstats-update
    
    #!/usr/bin/env ruby
    
    CONF = "/etc/awstats"
    LOG_DIR = "/var/log/httpd"
    TMP_DIR = "/tmp/hl"
    UTF8_DECODE = "/usr/local/awstats/wwwroot/cgi-bin/utf8_decode.pl"
    AWSTATS = "/usr/local/awstats/wwwroot/cgi-bin/awstats.pl"
    
    Dir.mkdir(TMP_DIR, 0700)
    begin
      Dir.glob(CONF + "/*") do |var|
        if File.basename(var, ".conf") =~ /awstats.(.+)/
          domain = $1;
          log = "#{LOG_DIR}/#{domain}-access_log"
          tmplog = "#{TMP_DIR}/#{domain}-log.utf8"
          system("#{UTF8_DECODE} < #{log} > #{tmplog}&quot;)
          begin
            File.truncate(log, 0)
            system("#{AWSTATS} -config=#{domain} -update&quot;)
          ensure
            File.unlink(tmplog)
          end
        end
      end
    ensure
      Dir.rmdir(TMP_DIR)
    end

    作成したスクリプトに実行権限を与えます。

    # chmod +x /usr/local/bin/awstats-update
    

    cron で自動的に実行されるように crontab を設定します。

    # crontab -e
    

    以下を追加。

    00 *  * * * /usr/local/bin/awstats-update > /dev/null
    

    これで設定は完了です。ログは1時間ごとに集計されて http://xxx.xxx.xxx/awstats/awstats.pl で参照することができます。複数のホストについて設定した場合は、ホスト名を変更してアクセスするだけで自動的に AWStats が適切な設定ファイルを読み込んで動いてくれます。