Linux基礎 #2 - コマンド

Last Edited: 10/17/2024

このブログ記事では、bashの基礎的なコマンドを紹介します。

DevOps

前回の記事では、OS、カーネル、シェルについて説明し、環境をセットアップしました。今回の記事からは、シェルを操作するために役立つコマンドを紹介していきます。 特に、bash(Bourne Again Shell)のコマンドをカバーします。bashはほとんどのLinuxディストリビューションのデフォルトのコマンドラインインタープリタです。 bashコマンドに既に慣れている方もいるかもしれませんが、知らなかったフラグやショートカット、ワイルドカード、コマンドがあるかもしれませんので、ぜひ再確認してください。 また、Dockerコンテナにセットアップした環境では利用できないコマンドもあることに注意してください。

ファイルの操作

Linuxでは、すべてがファイルとして扱われるため、ファイルをナビゲートして操作できることが重要です。以下は、ファイルに関連する基本的なbashコマンドです。

ファイル関連のコマンド
コマンド説明備考
pwd現在の作業ディレクトリを表示N/A
cdディレクトリを変更絶対パスまたは相対パスを指定できます。ショートカットとして、cd .(現在のディレクトリ)、cd ..(親ディレクトリ)、cd ~(ホームディレクトリ)、cd -(前のディレクトリ)があります。
lsディレクトリの内容を表示パスを指定して、そのディレクトリの内容を表示できます。.で始まる隠しファイルは、-a(すべて)のフラグを使わない限り表示されません。-l(詳細表示)のフラグを使うと、詳細な情報を表示できます。-a-lを組み合わせて-laとすることで、すべてのファイルを詳細に表示できます。
touch新しいファイルの作成またはタイムスタンプの更新touch newfileのように使用して、新しい空のファイルを作成します。既存のファイルを指定すると、タイムスタンプを更新できます(ls -lで確認可能)。
fileファイルタイプを確認Linuxでは、ファイルの拡張子とタイプが厳密に対応している必要はありません。ファイルのタイプを確認するには、file example.jpgを使用します。
catファイル内容を表示concatenate(連結)の略で、短いファイルの内容を表示するのに便利です。スペースで区切って複数のファイルを指定することで、内容を連結して表示できます。
less大きなテキストファイルをページ表示ファイルをページごとに表示します。キーボードコマンドでナビゲートします(qで終了、矢印キーで前/次ページ、g/Gでファイルの先頭/末尾、/<単語>で単語検索、hでヘルプ表示)。
cpファイルをコピーcp <from> <to>でファイルをコピーします。ワイルドカードとして、*(複数文字)、?(1文字)、[<文字>](範囲内の文字)を使用できます。複数のファイルやディレクトリをコピーする場合は、-r(再帰的)フラグを追加します。上書きを防ぐために、-i(インタラクティブ)フラグを使用できます。
mvファイルやディレクトリを移動・名前変更mv <filename> <newfilename>でファイルの名前を変更したり、mv <filename> <directory>でファイルを別のディレクトリに移動できます。-iフラグで上書きを防ぐか、-b(バックアップ)フラグで既存のファイル名に~を追加してバックアップを作成します。
mkdir新しいディレクトリを作成ディレクトリ名を指定して新しいディレクトリを作成します。-p(親ディレクトリ)のフラグを使用して、サブディレクトリを一度に作成することもできます(例:mkdir -p grandparent/parent/child)。
rmファイルを削除削除されたファイルは元に戻せません。書き込み保護されたファイルを警告なしに削除するには、-f(強制)フラグを使用します。その他のオプションとして、-i(すべての削除で確認)や-r(ディレクトリ全体の削除)があります。また、rmdirでディレクトリを削除できます。
findファイルやディレクトリを検索find <directory> -name <filename>でファイル名を検索します。ディレクトリを検索するには、find <directory> -type d -name <directory>を使用します。

これらは、ファイル操作やナビゲーションに頻繁に使用されるコマンドの一部です。これらのコマンドに慣れている場合でも、 備考を再確認して、知らなかった機能がないか確認する価値があります。ここで紹介したショートカットやワイルドカードは、 他のコマンドでも使用できます。Linuxのファイルシステムについては、今後の記事でさらに詳しく説明していきます。

標準ストリーム

CLIはテキストを操作するため、テキストを扱う能力が非常に重要です。echoコマンドはprint関数のように、 標準入力(stdin)を受け取り、標準出力(stdout)を返します。たとえば、echo Hello Worldと実行すると、 キーボードからの標準入力(stdin)を受け取り、標準出力(stdout)としてHello Worldを返します。 標準出力はデフォルトでは画面に表示されます。

標準出力を画面ではなく、リダイレクト演算子>を使ってテキストファイルに書き込むこともできます。 例えば、echo Hello World > example.txtとすることで、標準出力をexample.txtというファイルに書き込みます。 ただし、これではexample.txt内の既存のテキストが上書きされます。上書きを避けたい場合は、>>を使用してテキストを追記できます。 標準入力(stdin)もテキストファイルに設定することができ、<を使用して、例えばecho < example.txtとします。 これらの演算子を使用して、stdinとstdoutの両方をテキストファイルに設定し、コンテンツをコピーすることも可能です。 たとえば、echo < example1.txt > example2.txtといった形です。ブログのC++シリーズをフォローしている方は、 <<>>を目にしたことがあるかもしれませんが、これらは上記の動作を模倣するために設計されています。

stderrの場合、通常のリダイレクト演算子は使用できません。代わりに、ファイルディスクリプタ(0, 1, 2がそれぞれstdin、stdout、stderrに対応)を使用する必要があります。 たとえば、存在しないディレクトリを見ようとするエラーをテキストファイルに記録するには、ls fake 2> log.txtのようにします。 stdoutとstderrの両方を記録したい場合は、&>を使用してcommand &> log.txtのようにします。

また、標準出力(stdout)を画面やテキストファイルではなく、別のプロセスの標準入力(stdin)として使用することができ、 これにはパイプ演算子|を使用します。これにより、ls -la /long_directory | lessのように、 長い出力をlessで確認することができます。パイプ演算子とteeを組み合わせることで、 コマンドの出力を2つの異なるストリームに書き込むことも可能です。たとえば、ls -l | tee example.txtとすれば、 画面に結果を表示しつつ、同時にテキストファイルにも書き込まれます。

テキストファイルの操作

コマンドの標準出力(stdout)や標準エラー出力(stderr)をテキストファイルに記録した後、 テキストファイルを操作して調査する必要があります。以下は、テキストファイルに関連する基本的なbashコマンドです。

テキストファイル関連のコマンド
コマンド説明備考
cutコンテンツの抽出-c(キャラクター)フラグを使って文字単位で抽出することができます(例:cut -c 5 example.txt)。または、-f(フィールド)フラグでフィールド単位の抽出が可能です(例:cut -f 2 example.txt)。特別な文字も含まれ、TABで区切られたものはデフォルトでフィールドとして扱われます。フィールドの区切り文字を変更したい場合は、-d(デリミタ)フラグを使って、例えば cut -f 2 -d ";" example.txt と指定します。
paste行の結合 TABで区切って、複数行を一行に結合することができます(例:paste -s example.txt)。複数のテキストファイルを指定して結合し、リダイレクト演算子で新しいファイルを作成することも可能です。-d フラグを使用して、デフォルトのTAB区切りを変更することができます。
head先頭のn行を表示デフォルトでは最初の10行が表示されますが、-n(番号)フラグで変更できます(例:head -n 15 long.txt)。
tail最後のn行を表示headと同様に動作します。-f(フォロー)フラグを使用して、テキストファイルの変更を追跡することができます。終了するには Ctrl+C を押します。
expandTABをスペースとして表示テキストファイルの内容をTABをスペースに置き換えて表示します。リダイレクト演算子を使って、変換後のテキストを新しいファイルに保存することができます。unexpandコマンドを使うと、スペースをTABに戻すことができます。
join共通フィールドでファイルを結合各行にスペースで区切られた共通フィールド(例:ID)がある場合、joinを使って結合できます。どのフィールドを使用するかを、-1-2フラグで指定し、どのファイルのどのフィールドを使うかを決定します(例:join -1 2 -2 1 example1.txt example2.txt)。ファイルを分割するには、splitコマンドを使用できます。
sort行をソートデフォルトではアルファベット順に行をソートしますが、-r(逆順)フラグで逆順にしたり、-n(数字)フラグで数値によるソートができます。
tr変換標準入力の文字セットを別の文字セットに変換できます(例:tr a-z A-ZHELLOを出力)。-dフラグを使って文字を削除することもできます。
uniq隣接する重複行を削除テキストファイル内の隣接する重複行を削除します。-c(カウント)フラグで重複行のカウントを取得したり、-u(ユニーク)フラグでユニークな行だけを表示したり、-d(重複)フラグで重複した行のみを表示することができます。隣接しない重複を削除するには、sortと組み合わせて使用します(例:sort example.txt | uniq
wcワードカウントを表示テキストファイルの行数、単語数、バイト数を表示します。各項目を個別に表示するには、-l(行)、-w(単語)、-c(キャラクター)フラグを使用します。また、nlコマンドを使って、テキストファイルに行番号を追加することもできます。
grep正規表現で検索 grep(global regular expression print)は、正規表現を使ってファイル内のテキストパターンを検索します(例:grep hello example.txt)。-i(大文字小文字無視)フラグを使ってケースを無視した検索が可能で、他のコマンドとパイプで組み合わせて使用できます。

テキストファイルに関連する他の多くのコマンドもありますが、上記は頻繁に使用する基本的なものです。 特にgrepは、最もよく使われるコマンドの一つで、詳しく調べる価値があります。前述のように、 これらのコマンドはリダイレクトやパイピングと組み合わせることができるため、GUIでは実現できない柔軟性を提供します。

その他の便利なコマンド

ディレクトリのナビゲーションやテキストファイルの操作に関連するコマンド以外にも、重要で役立つコマンドがいくつかあります。

その他の便利なコマンド
コマンド説明備考
helpコマンドのヘルプを表示他のbashコマンドに関する役立つ情報を提供します。例えば、利用可能なフラグやコマンドの簡単な説明を表示します。help echoのように使います。
manマニュアルコマンドの詳細なマニュアルを表示します。簡単な説明にはwhatisコマンドを使用することもできます。
aliasコマンドのエイリアスを作成長くて頻繁に使うコマンドには、エイリアスを設定して短縮できます。例えば、alias foobar='ls -la'のようにコマンドに新しい名前を割り当てます。エイリアスはunalias foobarのように解除できます。
historyコマンド履歴を表示使用したコマンドの履歴を表示します。clearコマンドで画面をクリアすることもできます。
env環境変数を表示既に設定されている環境変数を表示します。例えば、echo $HOMEecho $USERなどで特定の環境変数を確認できますが、envコマンドで全ての環境変数を表示できます。

長くて複雑なコマンドを再実行したい場合、上下の矢印キーを使用してコマンド履歴を呼び出すことができます。他にも生産性を高める興味深いコマンドやショートカットがまだたくさんあり、 今後の記事で紹介するかもしれません。

結論

この記事では、ファイルのナビゲーションやテキストファイルの操作に関連する基本的なコマンドについて説明しました。 すべてのコマンドや概念を網羅したわけではありませんが、それらは今後の記事でカバーされます。 内容が多いと感じるかもしれませんが、実際に試していくことで早く慣れるでしょう。コマンドを試す際に不明点があれば、helpコマンドを使うかこの記事を見返してみてください。

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース

  • Linux Journey. n.d. Kernel. Linux Journey.