このエントリーをはてなブックマークに追加


grepでタブを検索する方法

grepコマンドをターミナルで実行した場合、タブの検索ができません。
以下の方法でタブを検索することができます。


$'\t' を利用する

2012/6/22 追記

bashで動作確認をしました。
man bashをみると以下の記述がありました。

クォート
       クォート (quoting) を使うと、特定の文字や単語のシェルに対する特別な意味を取り除けます。クォー
       ト を用いると、特殊文字の特殊な扱いを無効にすることや、予約語が予約語として識別されることを防
       いだり、パラメータの展開を防げます。
<snip>
        $’string’ の形式を持つ単語は特殊な扱いを受けます。この単語は string に展開され、それから ANSI
       C 標準で仕様が決められている、バックスラッシュでエスケープされている文字に置き換えられます 。
       バックスラッシュエスケープシーケンスは、 (もし存在すれば) 以下のようにデコードされます:
              \a     警告 (ベル)
              \b     バックスペース
              \e     エスケープ文字
              \f     フォームフィード文字
              \n     改行文字
              \r     復帰文字
              \t     水平タブ文字
<snip>

実際、$'\t'がtabになるかを確認してみます。
16進数で09なのでHT(水平タブ)になります。

[sakura@centos ~]$ echo -n $'\t' | hexdump -C
00000000  09                                                |.|
00000001
[sakura@centos ~]$ echo -n $'\t\t' | hexdump -C
00000000  09 09                                             |..|
00000002

実際に以下のようなファイルでgrepしてみました。

# one tab between the words.
centos  5.7
centos  5.8
centos  6.1
centos  6.2
ubuntu  10.04
ubuntu  12.04

# two tab between the words.
fedora          16
fedora          17
debian          lenny
debian          squeeze

# first character is tab.
        linux
        windows
        freebsd
  • 実行結果
    いくつかの実行結果を記します。
    • 先頭がタブではじまる行を検索
      $ grep ^$'\t' tab_test_file.txt 
              linux
              windows
              freebsd
    • 2つのタブ
      $ grep $'\t\t' tab_test_file.txt 
      fedora          16
      fedora          17
      debian          lenny
      debian          squeeze
    • 1つのタブで検索
      $ grep $'\t' tab_test_file.txt 
      centos  5.7
      centos  5.8
      centos  6.1
      centos  6.2
      ubuntu  10.04
      ubuntu  12.04
      fedora          16
      fedora          17
      debian          lenny
      debian          squeeze
              linux
              windows
              freebsd
    • centosタブで検索
      $ grep centos$'\t' tab_test_file.txt 
      centos  5.7
      centos  5.8
      centos  6.1
      centos  6.2
    • タブの後ろの1がある場合
      $ grep $'\t'1 tab_test_file.txt 
      ubuntu  10.04
      ubuntu  12.04
      fedora          16
      fedora          17
      $ grep $'\t\t'1 tab_test_file.txt 
      fedora          16
      fedora          17

以上、動作確認したシェルはbashだけですが、$'\t'でタブを指定してgrepする方法を記述しました。

[:space:]を利用する

grepに\tを引数としてわたしてもタブ文字はヒットしません。
検索方法‪としてスペースとタブの区別はできませんが[:space:]が有効です。

[:space:]の実行方法

下記のコマンドでタブを検索すると上記でも記した通り、スペースもヒットしてしまいますので注意してください。

grep "[[:space:]]" ファイル名

タブをターミナル画面に入力し検索する方法

bashを利用している場合は、タブキーを押してもタブ文字は入力されませんので、Ctrl+V, TABの操作でタブ文字を入力することができます。

赤字の部分がキー操作になります。Ctrl+V、TABキーの順番で入力します。

grep "Ctrl+V, TAB" ファイル名

タブを検索するgrep用シェルを作成する

エディタを起動しタブを検索するgrepコマンド用シェルを作成すれば簡単に検索することができます。
下記、スクリプトのgrep " "はタブが入力されています。以下のスクリプトをコピーしてもスペースとしてコピーされますので使用する場合はタブに変更するかgrep_tab.shをダウンロードしてください。

#!/bin/sh
grep "	" $1

使用方法は以下の通りです。
./grep_tab.sh ファイル名

関連資料



添付ファイル: filegrep_tab.sh 1723件 [詳細] filetab_test_file.txt 1393件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-03 (金) 22:57:57