Linux の組み込みツールは非常に強力なので、これを使用してデータベースを構築できます。その方法は次のとおりです
データベースは、本格的な企業 Web サイトから、ショッピング リストやファイナンス トラッカーなどの単純なツールに至るまで、多くのアプリの中核部分です。 SQL によるリレーショナル データベースが一般的ですが、Linux はよりシンプルで透過的な代替手段を提供します。
Linux ではどのようなデータベースを構築できますか?
シンプルな材料、強力な結果
Linux では、テキスト ファイルが重要です。多くの堅牢なツールとそれらの連携を促進するエコシステムにより、プレーン テキスト ファイルで多くのことを達成できます。
これには、さまざまな目的に使用できる構造化されたデータのセットであるデータベースの構築が含まれます。テキスト ファイルとコマンド ライン ツールを使用すると、コードと同じように簡単に、単純なプロトタイプを作成し、データを迅速に検査し、データのバージョン管理を行うことができます。
標準的なコマンドセット
Linux には便利なコマンドが数多くあり、その多くはテキストを操作します。これらのコマンドの多くは、標準入力経由でデータを受け取り、いくつかのアクションを実行し、標準出力を生成するフィルターです。
- grep 入力を検索し、1 つ以上のパターンに一致する行を選択します。
- カット 各行の選択された部分を抽出し、標準出力に書き込みます。
- ああ は、より強力なパターン スキャンおよび処理言語です。
- 選別 は期待どおりの動作をしますが、特定の列を並べ替えたり、数値/アルファベット順の並べ替えを正しく処理したりできます。
- 頭 そして しっぽ 出力から行のスライスを抽出できます。
- 参加する 複数のファイル内の関連データをサポートします。
仕事に取り掛かりましょう!
この例では、ToDo アプリ用の単純なデータベースを構築します。標準の Linux ツールを使用して、すべての基本機能を構築できます。最終的には、スクリプト言語を使用するか、リレーショナル データベースに移行することによって、アプリを拡張できます。
テーブルをフラット ファイルとして作成する
最も単純な構造化テキスト形式の 1 つは、DSV (区切り文字で区切られた値) です。これは、CSV (カンマ区切り値) 形式の一般的なケースです。 Linux では、構造化テキスト ファイルではフィールドを区切るためにスペースまたはコロン (:) 文字がよく使用されます。 /etc/passwd ファイルは典型的な例です。
todo リストなどのさまざまな種類のデータを、次のような形式で保存できます。
Buy milk:2024-10-21:2:open
Call bank:2024-10-20:1:closed
任意のテキスト エディタを使用してデータベースを更新できることも、プレーン テキスト形式の利点の 1 つです。 echo からの出力をファイルにリダイレクトすることで、コマンド ラインから直接項目を追加することもできます。
echo "Take out the trash:$(date -I):3:open" > tasks
これは SQL と同等です。
INSERT INTO tasks VALUES('Take out the trash', CURDATE(), '3', 'open')
このコマンドはサブコマンドを使用して現在の日付を取得することに注意してください。入力する場合は少し面倒ですが、スクリプトでははるかに便利です。
テーブル全体を取得する
データの選択は、おそらく最も一般的なデータベース タスクです。基本的なケースは、テーブルからすべてを選択することです。つまり、
SELECT * FROM tasks
データベースのすべての行からすべての列をフェッチします。ファイルベースのデータベースでは、同等のことは簡単です。
cat tasks
切り取りのある列を選択
もう少し洗練すると、選択を特定の列に絞り込むことができます。 SQL では、これは次のようになります。
SELECT task FROM tasks
カット ツールを使用すると、ほぼ同じ機能を実現できます。
cut -d':' -f1 tasks
d オプションは、ファイルの各行のフィールドを区切る文字である区切り文字を指定します。 f オプションを使用すると、特定のフィールドを選択できます。これにより、データベース内のすべてのタスクの簡単なリストが表示されます。
grep または awk で行を選択する
通常、データベースからすべての行をフェッチするのではなく、結果を制限する必要があります。次のように、フィールド値に基づいたフィルタリングが最も明白な要件です。
SELECT * FROM tasks WHERE status=open
この場合、grep は完璧な代替手段です。これを使用して正規表現パターンで行を照合すると、たとえば「オープン」ステータスのすべてのタスクを見つけることができます。
grep 'open$' tasks
この特定のケースでは、ステータスが各行の最後のフィールドであるという事実を利用しています。 $ は文字列の末尾に一致します。行の途中にあるフィールドの場合は、より複雑な正規表現を使用する必要がある場合があります。たとえば、優先度 2 のすべての行を取得します。
grep ':2:(^:)*$' tasks
ただし、grep はテキスト パターンとのみ一致し、次のような複雑な式を処理できません。
SELECT status, task FROM tasks WHERE date<2024-10-21
この SQL は論理比較を使用して、特定の日付より前のタスクを取得します。より複雑な正規表現を構築しようとすることもできますが、これでは grep の機能を超え始めます。
必要なのは、awk のような、より強力なツールです。
awk -F':' '$2<"2024-10-21" 関連情報は以下のリンクからご確認いただけます' tasks
awk は grep と Cut の両方の仕事を実行できます。この例では、次の部分が
$2<"2024-10-21"
これは前提条件であり、以前の日付を持つ行のみが一致することを意味します。次に、コマンドは各行の最初の 2 列を出力します。
結果を末尾と先頭でページ付けします
SQL の LIMIT 句を使用すると、特定の数の結果をフェッチできます。最初の 2 行をフェッチするには、次のようにします。
head -2 tasks
tail を使用して最後の n 行を取得できます。 head と併用すると、LIMIT 句を近似してオフセットを含めることができます。たとえば、行 2 ~ 3 を取得するには:
head -3 tasks | tail -2
sortで行を並べ替える
「ORDER BY」句は、多くの SQL ステートメントの重要な部分です。幸いなことに、Linux には、sort という優れた同等のコマンドがあります。 Cut や awk と同様に、フラグで使用する文字が異なりますが、区切り文字とフィールドを数値で指定できます。今回は、 t は区切り文字を指定し、k はフィールド番号を指定します。
sort -t':' -k2 tasks
これにより、すべてのレコードが日付順に並べ替えられて表示されます。
join を使用してテーブルを結合する
リレーショナル データベースは、あるテーブルのフィールドが別のテーブルのフィールドを参照する、異なるテーブル間の関係に関するものです。ご存知ないかもしれませんが、Linux には、当然のことながら、結合と呼ばれる、SQL の JOIN 句に相当するものがあります。
複数の人のタスクに対応できるように todo データを拡張してみましょう。まず、元のタスク ファイルに次のように新しい名前列を追加します。
そして、ファイル people を作成して、タスクを保存する各個人の詳細を保存します。
t オプションで区切り文字を指定して join コマンドを使用できるようになりました。
join -t':' -1 5 -2 1 tasks people
-1 および -2 オプションは、各ファイルから結合するフィールドの番号を指定します。ここでは、それぞれ 5 番目と 1 番目のフィールドです。 join はデフォルトで最初のフィールドを使用するため、これを次のように単純化できます。
join -t':' -1 5 tasks people
そしてそれは次のものを生成します:
出力を少し整理するには、結合テーブルをパイプして名前フィールドを切り取り、省略します。
join -t':' -1 5 tasks people | cut -d':' -f2-
また、awk を使用すると、2 つの名前を 1 つに結合できます。
join -t':' -1 5 tasks people | awk -F':' '詳しい情報を見る'
すべてをまとめる
最後に、より複雑な SQL 式について考えてみましょう。これは、両方のテーブルを結合して名前を取得し、特定の列を選択し、特定の優先順位で行をフェッチするものです。日付でソートし、最初に一致する行だけをフェッチして終了します。
SELECT task,date,priority,status,first_name,last_name
FROM tasks t
LEFT JOIN people p ON t.name=p.name
WHERE priority=2
ORDER BY date
LIMIT 1
同等のコマンド パイプラインはおそらく理解するのが難しいですが、これらのコア ツールに慣れていれば、それほど複雑ではありません。
join -t':' -1 5 -2 1 tasks people \
| awk -F':' '関連情報は以下のリンクからご確認いただけます' \
| grep ':2:' \
| sort -t ':' -k2 \
| head -1
あなたがハンドルを握る番です
Linux を学ぶことは料理を学ぶことに似ています。 1 つのプロジェクトで得たスキルは別のプロジェクトにも応用でき、これまで誰もやったことのないものを思いつくこともあるかもしれません。だからこそ、Linux の強力な機能に慣れることが重要です。すべてを知っている必要はありませんが、常に学習しておくのは良いことです。
詳しい情報を見る