5683
当方ubuntu14.10を使っています.

自分の環境ではwhatisデータベースは`/var/cache/man/index.db`に存在しています(これも正直確証はありません).  
直接見てもバイナリのようになっていてよくわからない文字列が並んでいました.

データベースへのアクセスの方法を教えてくださると助かります.
CC BY-SA 3.0
2015-02-01T04:52:15.200
5680
2015-02-01T23:12:44.500
7797
question
ubuntu
whatisデータベースにアクセスする方法を教えてください
ごく大雑把に説明します。

まず、ファイルの素性を調べると、

```

    $ file /var/cache/man/index.db
    /var/cache/man/index.db: GNU dbm 1.x or ndbm database, little endian
    
```

dbm 形式のファイルであることが分かります。また、`man mandb` を参照しますと、以下の様に書かれています。

>
```

>     Name                Type          Async   Filename
>     ──────────────────────────────────────────────────────────
>     Berkeley db         Binary tree   Yes     index.bt
>     GNU gdbm v >= 1.6   Hashed        Yes     index.db
>     GNU gdbm v <  1.6   Hashed        No      index.db
>     UNIX ndbm           Hashed        No      index.(dir|pag)
>  
```

`Hashed` となっていますので、index.db の中身を表示してみましょう。以下は perl を使う例です。

```

    #!/usr/bin/perl -w
    
    use GDBM_File;
    
    tie(%dbm, 'GDBM_File', "/var/cache/man/index.db", &GDBM_READER, 0444) || die;
    
    while ( ($key, $val) = each(%dbm) ) {
      chop($key); chop($val);
      print "$key = $val\n";
    }
    
    untie(%dbm);
    
```

これを `show_dbm_hash.pl` として保存して実行します。

```

    $ ./show_dbm_hash.pl
    vgagl = -       7       7       1335881665      A       -       -       gz      a fast framebuffer-level graphics library based on svgalib
    bf_copy = -     1       1       1391041525      A       -       -       gz      shell script to copy a bogofilter working directory
    grub-mkstandalone = -   1       1       1400180564      A       -       -       gz      make a memdisk-based GRUB image
                                   :
                                   :
    
```

`ls` コマンドと `URI::Escape`(perl module) を例にして、内容の説明をします。

```

    ls = -  1   1   1421207414  A   -   -   gz  list directory contents
    uri::escape = URI::Escape   3pm 3   1335817207  A   -   -   gz  Percent...
    
```

`$val` に相当する部分(`=` の右側)はタブ区切りになっていて、最大で 9
個の文字列が並んでいます。それぞれのフィールド値の意味は以下の通りです(部分的に不明)。

```

    0: レコード名(man のタイトル名)
       レコードキー($key)と同じ場合には - が入ります。
       uri::escape では URI::Escape となっています。
    1: man ファイルの拡張子
       ls コマンドの場合、man ファイルは /usr/share/man/man1/ls.1.gz、
       URI::Escape では /usr/share/man/man3/URI::Escape.3pm.gz となっています。
    2: man のセクション番号
    3: man ファイルの mtime
       date --date '@1421207414' などとすると、日付が分かります。
    4: 不明
    5: 不明
    6: 不明
    7: man ファイルが圧縮されている場合、その拡張子
    8: whatis コマンドの description 部分
    
```
CC BY-SA 3.0
2015-02-01T05:51:23.623
5683
2015-02-01T23:12:44.500
2015-02-01T23:12:44.500
5680
answer