書籍概要

Software Design plus

AWK実践入門

著者
発売日
更新日

概要

UNIX登場期から使われ続けているawkを習得すれば,ログデータや各種テキストデータから必要な情報を引き出すことができます。手軽なデータ解析,テキスト整形ツールとしての有用性はクラウド時代の今でも変わりありません。

本書は最新のgawk 4系に対応し,「awkをはじめて使う人から,プロのプログラマまで使っていただける」ことを目指した以下の目的でまとめています。

  • awkと正規表現のリファレンスとしての活用
  • awkプログラミングをサポートするスクリプトライブラリ集
  • awkを使った問題解決の事例集

こんな方におすすめ

  • コマンドラインインターフェイスを利用するすべてのエンジニア
  • ログをはじめとする各種テキストデータを手軽に分析したい方
  • awkを初めて使う方
  • プロのプログラマ

目次

第1章 awkとコマンドラインインターフェイス(CLI)

  • 1.1 プログラミング言語awk
    • awkの歴史
    • awkの種類
  • 1.2 コマンドラインインターフェイスを駆使してawkを使いこなす
    • CLI
    • あなたとOSの仲立ち「SHELL」
    • コマンドの実行
    • コマンドの直列実行
    • 複数のコマンドをつなぐ「パイプ」
    • 入出力先を変更する「リダイレクト」
    • 画面で確認しながら,ファイルにも「リダイレクト」したいならtee
    • SHELLじゃなくて,awkに解釈してもらいたいところは「エスケープ」しよう
  • 1.3 コマンドラインツールいろいろ
    • catでファイルの結合と出力
    • 行の並べ替えはsortにおまかせ
    • 重複行をまとめるuniq
    • wcで行,単語,文字を数える
    • 文字列検索のスペシャリストgrep
    • テキストストリームをまとめて加工sed
    • どのツールを使う?
  • 1.4 エディタを使ってスクリプトを書く
  • 1.5 bashのコマンドライン編集機能
  • Column
    •  もっとCLIを理解したい人へ
    •  gawkのインストール

第2章 awkの言語仕様

  • 2.1 awkの使い方
  • 2.2 言語の構造
  • 2.3 入力列の構造
    • レコード
    • フィールド
  • 2.4 パターン
    • [1]BEGINとEND
    • [2]BEGINFILEとENDFILE
    • [3]比較演算式と論理演算式
    • [4]正規表現
    • [5]パターンの範囲
    • [6]複合パターン
  • 2.5 アクション
  • 2.6 定数
  • 2.7 変数,型
  • 2.8 特別な変数
  • 2.9 配列
    • [1]多次元配列
    • [2]配列要素の消去
  • 2.10 式,演算子
    • [1]算術演算
    • [2]比較演算
    • [3]論理演算
    • [4]文字列演算子
  • 2.11 制御構造
    • [1]順次構造
    • [2]選択構造 if構文
    • [3]選択構造 switch構文
    • [4]反復構造 while構文
    • [5]反復構造 do構文
    • [6]反復構造 for構文
    • [7]配列の要素を列挙するfor構文
    • [8]添字の順序の指定
    • [9]制御文 breakとcontinue
    • [10]制御文 nextとexit
  • 2.12 出力
    • [1]print
    • [2]printf
  • 2.13 関数
    • [1]数学関数
    • [2]文字列操作関数
    • [3]型関数
  • 2.14 ユーザー定義関数
  • 2.15 Indirect関数
  • 2.16 入力
  • 2.17 外部プログラムとの連携
  • Column
    •  制御の流れ

第3章 正規表現

  • 3.1 正規表現とは
    • [1]正規表現とパターン
    • [2]文字と文字列
    • [3]正規表現の構文
    • [4]正規表現の流れ図
  • 3.2 正規表現式の演算
    • [1]文字列の選択 選択 A|B
    • [2]文字列の連結 連結 AB
    • [3]あってもなくてもよい文字列 一項選択 A?
    • [4]文字列のグループ化 括弧 (A)
    • [5]文字列の正の繰り返し 正閉包 A+
    • [6]空列を含む繰り返し 閉包 A*
    • [7]指定された回数の繰り返し {n, m}
  • 3.3 文字の指定
    • [1]何にでもマッチする文字 ワイルド文字 .
    • [2]特別な意味を持つ文字 メタ文字
    • [3]特別な文字を普通の文字に エスケープ \c
    • [4]普通には表せない文字 特殊文字
    • [5]新しい特殊文字 gawkのみで利用可能な特殊文字
    • [6]文字の範囲の指定 文字クラス [abc]
    • [7]文字の順序と範囲の指定 順序による指定 [a-c]
    • [8]文字クラスの表記法
    • [9]文字の範囲の除外 範囲の除外 [^abc]
    • [10]文字クラス中の特別な文字
    • [11]文字コードによる文字の指定 73,\x6a
    • [12]全角文字
  • 3.4 正規表現と文字列マッチング
    • [1]正規表現の使い道
    • [2]awk中の特別な文字
    • [3]マッチングと一致列の位置
    • [4]入力列の位置指定
    • [5]マッチングで取り出される文字列 最左最長な一致列
  • 3.5 正規表現の作り方と使い方
    • [1]応用例(1) 整数と実数
    • [2]応用例(2) 郵便番号と電話番号
  • Column
    •  空式ε
    •  正規表現の等式クイズ
    •  正規表現の仕様:POSIXとLSB
    •  文字列の否定
    •  正規表現のすごろくゲーム

第4章 awkスクリプト集

  • 4.1 1行スクリプト(ワンライナー)
    • [1]表示する行の指定
    • [2]表示する行の範囲の指定
    • [3]空白行の削除
    • [4]連続する同じ行の削除
    • [5]ファイルを読み込んだ後の処理
    • [6]行やフィールドの個数
    • [7]行やフィールドの番号付け
    • [8]ある文字列を含む行やフィールドの個数
    • [9]ある文字列にマッチするフィールドの検索
    • [10]数値フィールドの総計
    • [11]フィールド単位の加工
    • [12]フィールドや行の順序をひっくり返して表示
    • [13]1行の出力幅の指定
    • [14]マッチングによる文字列の置換
    • [15]エスケープ・シーケンスを用いた文字列の置換
    • [16]区切りの変更
    • [17]アイテムが重複している行を抽出する
  • 4.2 文字列操作関数
    • [1]文字列の挿入と削除
    • [2]文字列の繰返しと裏返し
    • [3]アスキーコードへの変換
    • [4]文字の置換
  • 4.3 ユーザー定義の数値処理関数
    • [1]最大公約数
    • [2]ランダム整数列の発生
    • [3]四捨五入
    • [4]秒数を時間単位に変換
    • [5]曜日の算出
    • [6]階乗
    • [7]数式への代入
    • [8]数式の定数倍
    • [9]数式の加法
    • [10]数式の乗法
  • 4.4 入出力補助関数
    • [1]オプション指定値の読み込み
    • [2]一時ファイル名の作成
    • [3]カラー出力
  • 4.5 レコードとフィールドの処理
    • [1]ファイルの先頭部分と末尾部分
    • [2]フィールドの出現回数
    • [3]フィールドの配列への格納
    • [4]フィールドの整形出力
    • [5]フィールド配列の二段出力
  • 4.6 基本的なテキスト処理
    • [1]テキストの大きさ
    • [2]記号の出現回数
    • [3]タブとスペースの変換
    • [4]1行の長さをそろえて表示
    • [5]行番号と桁番号の表示
  • 4.7 数表の処理
    • [1]n進数の変換
    • [2]集計(1)
    • [3]集計(2)
    • [4]フィールド値によるソート
    • [5]クイックソート
    • [6]マージソート
  • 4.8 複雑な正規表現の生成
    • [1]文字列自身を表す正規表現
    • [2]正規表現式の連結と繰返し
    • [3]文字列の先頭部分と巡回
  • 4.9 正規表現の拡張マッチング関数
    • [1]最左最短マッチング
    • [2]連続マッチング(1)
    • [3]連続マッチング(2)
  • Column
    •  クイックソートのアルゴリズム
    •  マージソートのアルゴリズム

第5章 awkの活用

  • 5.1 文字列のデータ収集と統計処理
    • [1]awkで暗号解読支援
    • [2]ローリングハッシュによる文字列の部分一致
    • [3]編集距離による文字列の類似度
    • [4]少しランダムな整数列の生成
    • [5]マルコフ情報源によるランダム文字列の生成
  • 5.2 データベース管理
    • [1]カレンダー
    • [2]住所録
    • [3]小遣い帳
    • [4]連想配列による集合演算
    • [5]レコード形式とCSV形式のデータベース
    • [6]関係データベースのテーブルの結合
    • [7]買い物かごの分析
  • 5.3 サーバー管理とログ解析
    • [1]Webサーバーのログの解析
    • [2]SNSのデータ分析
  • 5.4 組み合わせの計算と位相グラフのデータ構造
    • [1]関数のグラフ
    • [2]順列と組み合わせの列挙
    • [3]正整数の分割の列挙
    • [4]木構造の算法とディレクトリ構造への応用
    • [5]有向グラフの隣接行列
    • [6]ダイクストラ法によるネットワークの最短経路
  • 5.5 awkでパズルとゲーム
    • [1]簡単な性格診断
    • [2]三目並べ
    • [3]ライフゲーム
    • [4]迷路の探索
    • [5]ソリティアの解法
    • [6]ナンバースライドの解法
    • [7]覆面算の解法
  • 5.6 英文テキストの処理
    • [1]英文テキストのスタイル
    • [2]単語の検索
    • [3]文の検出
    • [4]正規表現のマクロ
  • 5.7 日本語テキストの処理
    • [1]表形式での出力
    • [2]文書整形
    • [3]辞書による置換
    • [4]対話的な文字列の置換
  • 5.8 awkとプログラミング言語
    • [1]言語の構文解析のレベル
    • [2]括弧の対応
    • [3]awkでlisp?
    • [4]後置記法の数式電卓
  • 5.9 1行エディタ
    • [1]1行エディタの起動とコマンド入力形式
    • [2]1行エディタのコマンド
    • [3]使用例
    • [4]プログラムの解説と拡張の指針
  • Column
    •  動的計画法
    •  編集距離と生命情報工学
    •  マルコフモデルとマルコフ連鎖
    •  関係データベースの正規化
    •  階乗記数法と単純順列の列挙
    •  awkプログラムを作るコツ
    •  前置記法と後置記法
    •  スタックとキュー

付録 gawkクイックリファレンス

  • A.1 gawkの実行方法
  • A.2 gawkで使用できるパターン
  • A.3 アクションの中で使用できる文
  • A.4 記号\でエスケープされた特殊文字
  • A.5 特別な意味を持つ変数
  • A.6 gawkで使える演算子
  • A.7 配列の開放
  • A.8 組み込み関数
  • A.9 gawkで定義済みのファイル名
  • A.10 gawkで使用する正規表現
  • A.11 数学定数
  • A.12 アスキーコード表

サポート

ダウンロード

(2015年11月20日更新)

2015年11月19日以前にダウンロードされたscript_20150529.zipには収録内容に間違いがありました。申し訳ございません。ご面倒をおかけしますが,最新版となるscript-20151118.zipをダウンロードし直してください。

「script_20150529.zip」版とは「\chap5\sec511」に収録されている「crypto.awk」のみの修正となります。

本書で使用しているサンプルスクリプトとテキストデータがダウンロードできます。ダウンロードしたzipファイルを解凍してご利用ください。サンプルは章ごとのフォルダに分けて収録されています。

書籍掲載ファイル名の左側に記載されている[2]が「chap2」フォルダ,[4]が「chap4」フォルダです。5章については「chap5」フォルダの中に,さらに細かな分類でフォルダ分けをしてあります(例:書籍で[5-1-1]とあるファイルは「sec511」フォルダ内)。利用についての詳細は本書,およびサンプル内のテキストを参照のこと。

ダウンロード
サンプルスクリプト&テキストデータ(script-20151118.zip)

免責:本サンプルスクリプトおよびサンプルテキストデータを使用することによって,使用者が受けたあらゆる不利益に対して,原著者および技術評論社はその責任を負いません。

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2016年2月4日更新)

P.27 本文

指定しなければ1文字のスペースまたはタブになりますが、
指定しなければ1文字以上のスペースまたはタブの連なり(混在も含む)になりますが、

P.30 実行結果の1行目

$ gawk -f beginfile file file2
$ gawk -f beginfile.awk file file2

P.31 実行結果の1行目

$ gawk -f beginfile file file2
$ gawk -f beginfile2.awk file file2

P.38 OFSの実行例

$ awk '{$1 = $1; print $0}' datafile
$ gawk '{$1 = $1; print $0}' datafile

P.73 傍注†

テストはjgawkで行いました。
テストはgawkで行いました。

P.104 図3-9 一致列の3行目

abcabbdabbe
abcabbdabbe

P.102 「例」の表中4行目

[A?Za?z]
[A-Za-z]

P.102 「例」の表中5行目

[ぁ?ん]
[ぁ-ん]

P.142 本文(数式)

3×52+4×5-5=(3×5+4)×5-4
3×52+4×5-5=(3×5+4)×5-5

P.187 リスト5-1の下から4行目

gsub(substr(lower, k, 1), substr(upper, list[k], k), $0)
gsub(substr(lower, k, 1), substr(upper, list[k], 1), $0)

P.191 2つめの実行結果の1行目

$ gawk -f exch.awk -f con crypto.txt
$ gawk -f exchange.awk -f - crypto.txt

P.213 実行結果2の1行目

$ gawk -f cashbk2.awk note1992
$ gawk -f cashbk2.awk note.txt

P.214 実行結果3の1行目

$ gawk -f cashbk3.awk note1992
$ gawk -f cashbk3.awk note.txt

P.253 本文

END部で,描画している関数名を graph() に固定している,
BEGIN部で,描画している関数名を graph() に固定している,

P.254 図5-7 (c)重複組み合わせ 3種2個 6通り

0	1	2
--------------------
□	0	00
		11
		22
	1	11
		22
	2	22
0	1	2
-------------------
□	0	00
		01
		02
	1	11
		12
	2	22

P.272 本文

高さheght[]
高さheight[]

P.279 実行結果(正規ラベル木からの親子関係の記述)の全面差し替え

$ gawk -f tree_struct.awk inp5.txt | sort
/
/ /a /b
/a /a/b /a/c /a/d
/a/b /a/b/b /a/b/c
/a/b/b
/a/b/c /a/b/c/f
/a/b/c/f
/a/c /a/c/a
/a/c/a
/a/d /a/d/e /a/d/f
/a/d/e /a/d/e/a
/a/d/e/a
/a/d/f
/b /b/d
/b/d /b/d/e
/b/d/e /b/d/e/f
/b/d/e/f
$ gawk -f tree_path.awk -v WH="/" inp5.txt | sort
/  /a /b
/a  /a/b /a/c /a/d
/a/b  /a/b/b /a/b/c
/a/b/b
/a/b/c  /a/b/c/f
/a/b/c/f
/a/c  /a/c/a
/a/c/a
/a/d  /a/d/e /a/d/f
/a/d/e  /a/d/e/a
/a/d/e/a
/a/d/f
/b  /b/d
/b/d  /b/d/e
/b/d/e  /b/d/e/f
/b/d/e/f

P.281 実行結果(有向グラフの隣接行列)の全面差し替え

$ awk -f graph_adjacency.awk inp1.txt
  A B C D E F
A 0 1 1 0 0 0
B 0 0 0 1 0 0
C 0 0 0 0 0 1
D 1 0 1 0 0 1
E 1 1 0 0 0 0
F 0 0 0 0 0 0
$ gawk -f graph_adjacency.awk inp1.txt
  A B C D E F
A 0 1 1 0 0 0
B 0 0 1 1 0 0
C 0 0 0 0 1 0
D 0 0 0 0 0 1
E 0 1 0 1 0 1
F 0 0 0 0 0 0

P.282 実行結果(有向グラフの推移閉包と最短経路数)の1行目

awk -f graph_minpath.awk inp1.txt
gawk -f graph_minpath.awk inp1.txt

P.290 リスト5-35の5行目

fname = "PersonAsses.txt"
fname = "person_asses.txt"

P.297 実行結果(ライフゲーム)の1行目

$ gawk -f life.awk life1.txt
$ gawk -f life.awk life.txt

P.301 実行結果の2行目以降差し替え

2 2 2 2 1 1
1 0 1 2 0 0
0 0 1 2 1 1
0 1 1 2 2 2
0 0 0 0 1 2
2 2 0 0 1 1
1 2 1 0 0 0
2 2 1 0 1 1
2 1 1 2 2 2
2 2 2 2 1 2

P.301 リスト5-38の5行目

if ( nx < NF )  nx = NF
if ( ny < NF )  ny = NF

P.301 リスト5-38の10行目

ny = NR
nx = NR

P.302 リスト5-38(つづき)の15行目

maze[x][y] = 0
Maza[x][y] = 0

P.302 リスト5-38(つづき)の23行目

printf Maze[kx][ky] " "
printf Maze[kx][ky]+0 " "

P.324 データ5-33のファイル名

[5-6-2] word.tmp
[5-6-2] word.txt

P.325 実行結果3の1行目

$ gawk -f word.awk +41 eng.dat > res.dat
$ gawk -f word.awk +41 eng.txt > res.txt

P.325 実行結果3の3行目

$ gawk -f word.awk +42 res.dat
$ gawk -f word.awk +42 res.txt

P.338 リスト5-48(つづき)の下から8行目

c = jsubstr(buf, I, 1)
c = substr(buf, I, 1)

P.339 リスト5-48(つづき)の9行目

c = jsubstr(buf, i, 1);
c = substr(buf, i, 1);

P.339 リスト5-48(つづき)の11行目

c = jsubstr(lbuf, jlength(lbuf), 1);
c = substr(lbuf, length(lbuf), 1);

P.339 リスト5-48(つづき)の13行目

lbuf = jsubstr(lbuf, 1, jlength(lbuf) - 1);
lbuf = substr(lbuf, 1, length(lbuf) - 1);

P.339 リスト5-48(つづき)の14行目

c = jsubstr(lbuf, jlength(lbuf), 1);
c = substr(lbuf, length(lbuf), 1);

P.339 リスト5-48(つづき)の20行目

buf = jsubstr(buf, i);
buf = substr(buf, i);

P.357 1つめの実行結果

$ gawk -f ed.awk data1 data2
   : OPEN; text area 1-5 for data1
   : OPEN; text area 6-16  for data2
  1: Hello!                      ← data1の1行目の内容
$ gawk -f ed.awk eng1.txt eng2.txt
   : OPEN; text area 1-5 for eng1.txt
   : OPEN; text area 6-7 for eng2.txt
  1:         "I AM A CAT"eng1.txtの1行目の内容

P.361 本文

:do $1=""; n=jindex($0, ":"); $0=tolower(substr($0, n))
:do $1=""; n=index($0, ":"); $0=tolower(substr($0, n))

P.362

実行例1(awkプログラムを起動させて、エディタ内のテキスト(eng1.txt)全体を編集する)
実行結果1(awkプログラムを起動させて、エディタ内のテキスト(eng1.txt)全体を編集する)

P.362 実行結果1の5~6行目

   : CALL; awk -f sentence.awk a:/tmp/awk2 > a:/tmp/awk3
   : DONE; load area 1-5 from a:/tmp/awk3, new area 1-5
   : CALL; awk -f sentence.awk ./awk2 > ./awk3
   : DONE; load area 1-5 from /awk3, new area 1-5

P.362 傍注††

"-f CON"
"-f - "

P.363

実行例2(awkプログラム(out.awk)の編集中に適当なサンプルデータを与えて実験する)
実行結果2(awkプログラム(out.awk)の編集中に適当なサンプルデータを与えて実験する)

P.363 実行結果2の7行目

:awk+ -f # jpn.dat
:awk+ -f # jpn.txt

P.363 実行結果2の12行目

   : CALL; awk -f fld.awk -f a:/tmp/awk2 jpn.dat
   : CALL; awk -f fld.awk -f ./awk2 jpn.txt

P.365 1つめの実行結果の1行目

$ gawk -f ed.awk eng1.txt eng2.dat
$ gawk -f ed.awk eng1.txt eng2.txt

P.365 1つめの実行結果の3行目

   : OPEN; text area 6-16 for eng2.dat
   : OPEN; text area 6-7 for eng2.txt

P.366 本文

これは,文字数単位の位置目盛になっているので,jindex(),jsubstr() や4.8節の jmatch() によるマッチング情報といっしょに使います。
文字数単位の位置目盛になっているので、5.7節jfld.awk内の関数str_width()を用いることで、いわゆる全角文字にも対応します。

P.367 2つめの実行結果の3行目

F
F:

P.369 1つめの実行結果の4行目

E
E:

P.369 2つめの実行結果の12行目

eng2.dat
eng2.txt

P.369 2つめの実行結果の14行目

eng2.dat
eng2.txt

P.369 2つめの実行結果の16行目

:save 4 > eng1.txt1
:save 4 > eng1.txt

P.369 2つめの実行結果の17行目

eng1.dat
eng1.txt

P.374 リスト5-55(つづき)ページ最後の行

if ( arg == "" ) { wid = length(str) } else { wid = jlength(str) }
if ( arg == "" ) { wid = length(str) } else { wid = length(str) }

P.375 リスト5-55(つづき)3行目

if ( arg == "+" && length(jsubstr(str, i, 1)) == 2 ) {
if ( arg == "+" && length(substr(str, i, 1)) == 2 ) {

P.398 

word.tmp …… 323, 324
word.tmp …… 323

P.398 索引追加

word.txt …… 324

補足情報

P.27 「フィールド」についての補足情報

本文中,区切り文字(フィールドセパレータ)のデフォルトについて言及している個所があります。「1文字以上のスペースまたはタブの連なり(混在も含む)」(下記「お詫びと訂正」も参照ください)とは,正規表現で言うところの

[ \t]+

です。

FSにはデフォルトで" "(スペースが1つ)入っているだけなのですが,この場合(FS=" "と再定義した場合でも)なぜか例外的に,フィールドの区切りが正規表現での

[ \t]+

のように振る舞います。

試しに,FSにスペース以外の文字(たとえば'a',もちろんタブ'\t'であっても)を入れると,a“1文字”が区切りとみなされ,

1a1    → NF=2
1aa1   → NF=3
1aa1a1 → NF=4

となります。

では,スペース1文字をフィールドの区切りにしたいときはどうすれば良いかというと,

FS="[ ]"

とスペースを1つ[]で括った形で記述します。

これは,以下のワンライナーで(BEGINでのFSに入れる文字を変えて)確認すると確かめられます。入力は標準入力からになるので,キーボードから適当な行を入力して,改行を入力後に表示されるフィールド数を確認してください(ENDでFSを表示しているのは確認用です)。

gawk 'BEGIN{FS="[ \t]+"} {print NF} END{print "|" FS "|"}'

awkの実行で問題が発生する場合,およびWindows環境についての補足情報

(2015年7月7日更新)

動作結果の異常や,エラーによって処理が中断してしまうような場合,まずは次の点についてご確認ください。

  1. お使いのgawkが対応している文字コード(本書執筆にあたっては,OS XおよびLinux上で動作するUTF-8に対応しているバイナリを使用いたしました)が適切であるか
  2. お使いのgawkが対応しているスクリプトおよびテキストデータのファイルタイプ(本書執筆にあたっては,Unix形式に対応したもので確認しております)が適切であるか

サポートページからダウンロードできるスクリプトおよびデータにつきましても,上記条件に適合したものを提供させていただいております。

また,本書での確認対象外ではありますが,Windows環境で動作するいくつかのバージョンのgawk.exe,たとえば,

A) gawk 4.0.1
http://osdn.jp/projects/sfnet_ezwinports/downloads/gawk-4.0.1-w32-bin.zip/
日本語等のマルチバイトを含むスクリプト,データを扱えない
B) gawk(mbcs マルチバイト文字セット対応版)3.1.5
http://www.vector.co.jp/soft/dl/win95/util/se376460.html
UTF-8のデータを適切に扱えないようです(対象のデータとスクリプトがShift-JISであれば,動作するケースはあります)

等では,本書サンプルが適切に動作しないケースを確認しております(2015年7月3日時点)。

お使いのgawkが対応している文字コードやファイルタイプは,gawkの配布時に添付されているドキュメントやWebページ上,“gawk --version”コマンド等で確認できることがあります。gawkをソースコードからコンパイルしてお使いいただいている場合は,ソースコードと一緒に配布されているドキュメントやgawkのbuild時(configure等)のオプション指定をご確認願います。

上記の1.,2.に不適合がある場合は,テキストの文字コードやファイルタイプの変更を試みる,本書執筆時の環境と同様のOS,gawkを試す(参考:1章のコラム)等の対応をしていただけるようお願い致します。

商品一覧