技術書を読んでブログで定期的(できたら毎週💦)アウトプットすることを目標にしております🏃
今回は第4弾として、新しいLinuxの教科書のChapter 12〜20を読んで学んだことや、本をきっかけに自分で調べたことをまとめてみました💡
実務未経験者の学習内容アウトプットですので、おかしな点等あればご指摘いただけますと幸いです🙇♂️
学んだこと
テキスト処理でよく使われるコマンド
uniqコマンドの注意点
- 連続した重複行のみを処理する
uniq
は連続している重複行のみを処理する。ファイル全体で重複している行を見つけるには、先にsort
コマンドで行をソートする必要がある。 - 大文字と小文字は区別される
uniq
は大文字と小文字を区別する。つまり、「Apple」と「apple」は異なる行として扱われる。 - オプションを使って動作を調整する
-c
オプションを使用すると、各行が何回現れたかをカウントして表示できる。-d
オプションは重複している行のみを表示し、-u
オプションは重複していない行のみを表示する。
実行結果の例
以下の内容を含むexample.txt
ファイルを考える。
apple
banana
Apple
banana
banana
cherry
基本コマンド uniq example.txt
の実行結果(事前に sort
していない場合)
apple
banana
Apple
banana
cherry
この場合、連続していない banana
行は削除されない。
sort
と組み合わせた場合 sort example.txt | uniq
の実行結果
Apple
apple
banana
cherry
ここでは、sort
によって行がソートされた後、uniq
が連続する重複行を削除する。
重複カウント sort example.txt | uniq -c
の実行結果
1 Apple
1 apple
3 banana
1 cherry
各行がファイル内で何回現れたかが表示される。
trコマンドの注意点
標準入力からのみデータを読み取る
tr
コマンドはファイル名を直接取れない。代わりに、パイプ(|
)やリダイレクション(<
)を用いてデータを渡す必要がある。
- 誤った使用法(直接ファイル名を指定する)
tr 'A-Z' 'a-z' example.txt
- 正しい使用法(パイプまたはリダイレクションを使用する)
cat example.txt | tr 'A-Z' 'a-z'
文字置換は1文字単位
各文字はその位置に応じて置換される。例えば、下記コードの場合、a
は x
に、b
は y
に、c
は z
に置換される。
cat example.txt | tr abc xyz
sedコマンド
テキストファイルの中のテキストを処理するためのコマンドラインツール。sed
はテキストを読み込み、指定されたコマンドに基づいて加工・変換し、その結果を標準出力に表示する。
sedの特徴
- テキストのストリーム処理:
sed
は入力されたテキストを一行ずつ処理する。各行が独立して扱われるため、ファイル全体を一度に読み込まない。 - パターンとアクション:
sed
は「パターン」と「アクション」を組み合わせて使う。パターンはテキストの特定の部分を指定し、アクションはその部分に対して行う操作(置換、削除、挿入など)を指定する。 - 非破壊的操作: 基本的に、
sed
はファイル自体を変更しない。アクションの結果は標準出力に表示され、元のファイルはそのまま保持される。
基本構文
sed [オプション] 'コマンド' ファイル名
例 1: テキストの置換
sed 's/old/new/' file.txt
このコマンドはfile.txt
の中で最初に現れる”old”を”new”に置換する。全ての”old”を置換するには、「s/old/new/g」
のようにg
フラグを使う。
例 2: 行の削除
特定の行を削除することもできる。例えば、以下のコマンドは3行目を削除する。
sed '3d' file.txt
例 3: 行の表示
特定の行のみを表示することも可能。以下のコマンドは2行目のみを表示する。
sed -n '2p' file.txt
-n
オプションは、デフォルトの出力を抑制し、指定された行のみを表示する。
awk
コマンド
テキストファイルやデータストリームを行ごとに読み込み、指定されたパターンにマッチする行に対して特定のアクションを実行する。sedと似ているが、awkはsedより高機能であり、より複雑なテキスト処理やデータ抽出等に適している。
基本的な構文
awk '条件 { アクション }' ファイル名
- 条件: 処理する行を選択するためのパターンや条件。
- アクション: 条件にマッチした行に対して実行するコマンドや処理。
具体例
file.txtのサンプル内容
Alice 120 300
Bob 100 200
Charlie 150 400
David 80 150
Eve 200 500
例 1: フィールドの表示
コマンド:
awk '{ print $1, $3 }' file.txt
このコマンドは各行の1番目と3番目のフィールド(名前と3番目の数値)を表示する。
出力結果:
Alice 300
Bob 200
Charlie 400
David 150
Eve 500
例 2: 条件付き処理
コマンド:
awk '$2 > 100 { print $1 }' file.txt
このコマンドは、2番目のフィールド(中央の数値)が100より大きい行の1番目のフィールド(名前)のみを表示する。
出力結果:
Alice
Charlie
Eve
例 3: 合計の計算
コマンド:
awk '{ sum += $2 } END { print sum }' file.txt
このコマンドは、2番目のフィールドの値(各行の中央の数値)を合計する。END
ブロックは、awk
がファイルのすべての行を処理し終えた後に実行される特別なセクション。通常、awk
はファイルの各行を一行ずつ読み込み、それぞれに対して指定されたアクションを実行するが、END
ブロック内のアクションはファイルの末尾に達した後に一度だけ実行される。
出力結果:
650
例 4: ファイルの加工
コマンド:
awk '{ print NR, $0 }' file.txt
このコマンドは、各行に行番号を追加して表示する。
NR
: 現在処理中の行の行番号。awk
はファイルの各行を1行ずつ読み込む際、それぞれに行番号を自動的に割り当てる。$0
: 現在処理中の行の全ての内容を表す。
出力結果:
1 Alice 120 300
2 Bob 100 200
3 Charlie 150 400
4 David 80 150
5 Eve 200 500
シェルスクリプト
シェルスクリプトとは?
一連のコマンドや手順を自動化するためのスクリプト。通常、テキストファイルにシェルで実行するコマンドを記述し、それを一つの実行可能なファイルとして保存する。
これにより、手動でコマンドを一つずつ実行する代わりに、複数のコマンドを含むスクリプトを一度に実行して、作業を自動化することができる。
シェルスクリプトの例
この例では、ユーザーのホームディレクトリ内のファイル数をカウントし、結果を表示するスクリプトを作成する。
#!/bin/bash
# ユーザーのホームディレクトリへ移動
cd ~
# ファイルの数をカウント
count=$(ls | wc -l)
# 結果を表示
echo "あなたのホームディレクトリには ${count} 個のファイルがあります。"
- このスクリプトをテキストエディタで作成し、
count_files.sh
という名前で保存する。 - ターミナルを開き、スクリプトが保存されているディレクトリに移動する。
- スクリプトに実行権限を与える:
chmod +x count_files.sh
- スクリプトを実行する:
./count_files.sh
シェルスクリプト実行結果の例
スクリプトを実行すると、以下のような出力が得られる(ファイル数はユーザーのホームディレクトリに依存する)
あなたのホームディレクトリには 42 個のファイルがあります。
シェルスクリプトを使用するメリット
1. 自動化
- 反復作業の簡略化: シェルスクリプトを使うと、繰り返し行う必要のあるタスク(例えばファイルのバックアップ、システムの状態のチェックなど)を自動化できる。
- エラーの減少: 手作業でコマンドを入力するときに発生しやすいミスを防ぐことができる。
2. 時間の節約
- 高速実行: 一連のコマンドをスクリプトとして実行する方が、手動で一つずつ実行するよりも時間を節約できる。
- 即座に再利用可能: 一度作成したスクリプトは保存しておき、必要なときにいつでも簡単に再利用できる。
3. 移植性
- 異なるシステムでの使用: 同じシェルを使用している他のLinuxシステムで、ほとんどまたは全く変更せずにスクリプトを実行できる。
シバンとは?
「シバン(Shebang)」は、スクリプトファイルの最初の行に書かれる特別な指示子(ディレクティブ)。シバンはスクリプトを実行する際に、どのシェルやインタプリタを使ってそのスクリプトを実行すべきかをシステムに教える役割を持つ。
シバンの書き方
シバンは次のように書かれる:
#!/bin/shellのパス
ここで、#!
はシバンの開始を表し、その後にシェルやインタプリタの絶対パスが続く。
例えば、Bashスクリプトの場合、シバンは通常以下のようになる:
#!/bin/bash
これは、このスクリプトを/bin/bash
(Bashシェル)を使用して実行するようシステムに指示する。
シバンの目的と重要性
- 正しいシェルの指定: Linuxシステムには多くの種類のシェルが存在し、それぞれに独自の特徴や構文がある。シバンにより、スクリプトが意図したシェルで実行されることが保証される。
- 移植性の向上: シバンを使用することで、異なるシステム間でスクリプトを移植しやすくなる。スクリプトがどのシェルを必要とするかが明示されているため、適切な環境で実行される可能性が高まる。
- 直接実行可能: シバンを含むスクリプトは、ファイルに実行権限を与えることで直接実行することができる(例:
./script.sh
)。これにより、スクリプトを実行する際に毎回シェルを指定する必要がなくなる。
シェルスクリプトの実行方法
シェルスクリプトを実行する方法はいくつかあるが、一般的には ./
を使って直接実行する方法と、source
コマンド(またはその短縮形である .
)を使って実行する方法の2種類がよく使われる。
./
を使って実行する方法
./script.sh
のようにスクリプトを実行すると、そのスクリプトは現在のシェルから分離された新しいサブシェル(プロセス)で実行される。- スクリプト内で設定または変更された変数や環境設定は、スクリプトの実行が終了すると失われます。つまり、スクリプトが終了した後の現在のシェルには影響を与えない。
- この方法でスクリプトを実行するには、スクリプトファイルに実行権限が必要(
chmod +x script.sh
で設定)。
source
コマンド(または .
)で実行する
source script.sh
または. script.sh
とすることで、スクリプトは現在のシェル内で実行される。新しいサブシェルは作成されない。- スクリプト内で設定または変更された変数や環境設定は、スクリプトの実行が終了しても現在のシェルに保持される。これはシェルの設定や環境変数を変更するスクリプトを実行する場合に便利である。
source
コマンドを使ってスクリプトを実行する場合、スクリプトファイルに実行権限がなくても実行できる。
シェルスクリプトを書くために必要なシェルの文法の基礎知識
コメント
#
で始まる行はコメントとして扱われ、実行されない。
例:
# これはコメントです
echo "Hello World" # この部分もコメントです
実行結果:
Hello World
変数
変数に値を代入し、それを使用できる。
例:
name="Alice"
echo "Hello, $name"
実行結果:
Hello, Alice
変数の書き方の注意点
1. 変数名と値の間にスペースを入れない
- 正しい:
name="Alice"
- 誤り:
name = "Alice"
変数を定義する際、変数名と等号(=
)の間にスペースを入れてはいけない。スペースを入れると、シェルはそれを別々のコマンドまたは引数として解釈してしまう。
2. 変数名には特殊文字を使用しない
- 変数名にはアルファベット(大文字・小文字)、数字、アンダースコア(
_
)のみを使用する。 - 変数名にハイフン(
-
)やスペースなどの特殊記号を使用しないこと。
3. 変数の値が空白や特殊文字を含む場合はダブルクォートを使用
- 例:
greeting="Hello, world!"
変数の値に空白、特殊文字(*
、?
、$
など)、またはシェルによって解釈される他の文字が含まれている場合は、値をダブルクォートで囲むこと。
4. 変数展開時のクォートの使用
- 変数展開時にも、特に変数の値に空白や特殊文字が含まれる可能性がある場合は、変数をダブルクォートで囲むこと。
- 例:
echo "$name"
条件分岐(if文)
条件に基づいて異なるアクションを実行する。
例:
name="Alice"
if [ "$name" == "Alice" ]; then
echo "Hello, Alice"
else
echo "You are not Alice"
fi
実行結果:
Hello, Alice
ループ
繰り返し処理を行う。
for
例:
for i in 1 2 3; do
echo "Number $i"
done
実行結果:
Number 1
Number 2
Number 3
while
例:
count=1
while [ $count -le 3 ]; do
echo "Count $count"
count=$((count + 1))
done
実行結果:
Count 1
Count 2
Count 3
関数
再利用可能なコードブロックを定義する。
例:
say_hello() {
echo "Hello, $1"
}
say_hello "Alice"
実行結果:
Hello, Alice
&&
と ||
演算子
&&
は「AND」演算子として機能し、左側のコマンドが成功(終了ステータスが0)した場合にのみ、右側のコマンドを実行する。||
は「OR」演算子として機能し、左側のコマンドが失敗(終了ステータスが非0)した場合にのみ、右側のコマンドを実行する。
例:
mkdir /tmp/mydir && echo "Directory created"
rm /tmp/nonexistentfile || echo "Cannot remove file"
実行結果:
mkdir /tmp/mydir && echo "Directory created"
: このコマンドは、/tmp/mydir
ディレクトリが正常に作成された場合にのみ “Directory created” を出力します。rm /tmp/nonexistentfile || echo "Cannot remove file"
: このコマンドは、/tmp/nonexistentfile
が存在しないため削除できない場合に “Cannot remove file” を出力します。
改行
バックスラッシュ(\
)は、シェルスクリプトにおいて「次の改行を無視する」という意味を持つ。つまり、スクリプト上で改行されているコマンドも、実際の実行時には一つの行として扱われる。
例:
echo "This is a very long line, but we can split it " \
"over multiple lines for readability"
実行結果:
This is a very long line, but we can split it over multiple lines for readability
正規表現
テキスト検索を行うときに、条件にマッチする文字列集合を表現するための記法である。
正規表現は、文字列の検索、置換、データ抽出など様々な場面で役立つ。
基本的な正規表現の要素
- ドット(.)
- 任意の1文字にマッチする。
例:a.b
は「a」に続く任意の1文字と「b」にマッチする(「acb」、「aab」など)。
- 任意の1文字にマッチする。
- アスタリスク(*)
- 直前の文字の0回以上の繰り返しにマッチする。
例:a*
は「a」のない文字列や「a」が1回以上続く文字列にマッチする(「」、「a」、「aaa」など)。
- 直前の文字の0回以上の繰り返しにマッチする。
- プラス(+)
- 直前の文字の1回以上の繰り返しにマッチする。
例:a+
は「a」が1回以上続く文字列にマッチする(「a」、「aa」など)。
- 直前の文字の1回以上の繰り返しにマッチする。
- クエスチョンマーク(?)
- 直前の文字の0回または1回の繰り返しにマッチする。
例:a?
は「a」がないか、または1回だけある文字列にマッチする(「」、「a」)。
- 直前の文字の0回または1回の繰り返しにマッチする。
- 角括弧([])
- 括弧内の任意の1文字にマッチする。
例:[abc]
は「a」、「b」、「c」のいずれか1文字にマッチする。
- 括弧内の任意の1文字にマッチする。
- ハイフン(-)
- 角括弧内で使用され、文字の範囲を指定する。
例:[a-z]
は任意の英小文字1文字にマッチする。
- 角括弧内で使用され、文字の範囲を指定する。
- キャレット(^)
- 行の開始にマッチする。また、角括弧内で使用されると、否定を意味する。
例:^a
は行の始まりの「a」にマッチし、[^a]
は「a」以外の任意の1文字にマッチする。
- 行の開始にマッチする。また、角括弧内で使用されると、否定を意味する。
- ドルマーク($)
- 行の終了にマッチする。
例:a$
は行の終わりの「a」にマッチする。
- 行の終了にマッチする。
正規表現の例
^The
:「The」で始まる行にマッチ。end$
:「end」で終わる行にマッチ。^The end$
:「The end」という行全体にマッチ。r[au]n
:「run」または「ran」にマッチ。
アーカイブと圧縮
アーカイブとは?
複数のファイルやディレクトリを一つのファイルにまとめること。もしくは、まとめたファイルのこと。
圧縮とは?
ファイルのサイズを小さくすること。ストレージの節約や転送時間の短縮が可能になる。
アーカイブと圧縮の一般的なコマンド
tar
コマンド
複数のファイルやディレクトリを一つのアーカイブファイルにまとめることや、そのアーカイブからファイルを取り出すことができる。
tar
コマンドの基本構文
アーカイブ作成: tar -cvf [アーカイブ名].tar [ファイル/ディレクトリ]
アーカイブ展開: tar -xvf [アーカイブ名].tar
アーカイブ作成の例
tar -cvf archive.tar file1.txt file2.txt dir1
このコマンドは file1.txt
、file2.txt
というファイルと dir1
というディレクトリを archive.tar
というアーカイブにまとめる。
アーカイブ展開の例
tar -xvf archive.tar
このコマンドは archive.tar
内に含まれている file1.txt
、file2.txt
、dir1
を元の形に戻す。
tarコマンドのオプション
-c
: 新しいアーカイブを作成する。-x
: アーカイブからファイルを展開する。-v
: 処理中のファイル名を表示する(verboseモード)。-f
: アーカイブファイル名を指定する。
gzip
コマンドとbzip2
コマンド
ファイルの圧縮と解凍を行うためのコマンド。
gzip
コマンドの基本構文
gzip
圧縮: gzip [ファイル名]
解凍: gunzip [ファイル名.gz]
または gzip -d [ファイル名.gz]
bzip2
コマンドの基本構文
圧縮: bzip2 [ファイル名]
解凍: bunzip2 [ファイル名.bz2]
または bzip2 -d [ファイル名.bz2]
gzip
コマンドとbzip2 コマンドの重要ポイント
gzip
とbzip2
は 単一ファイルのみを圧縮するために設計されています。複数のファイルやディレクトリを圧縮するには、先にtar
コマンドでアーカイブを作成する必要がある。gzip
は一般的に速度が速いですが、bzip2
はより高い圧縮率を提供する。- 圧縮や解凍後、元のファイルはデフォルトで削除される。元のファイルを保持したい場合は、
gzip
の-k
オプションを使用する(bzip2
にはこのオプションはない)。
パッケージ管理
パッケージとは?
パッケージは、ソフトウェアやアプリケーションをインストールするためのファイル群のこと。これには、実行ファイル、設定ファイル、ドキュメントなどが含まれる。
パッケージ管理システムの主な機能
- インストール: 新しいソフトウェアをシステムに追加する。
- アップデート: 既存のソフトウェアを最新のバージョンに更新する。
- 削除: システムからソフトウェアを削除する。
- 依存関係の管理: ソフトウェアが正しく動作するために必要な他のパッケージも一緒に管理する。
主なパッケージ管理システム
- APT (Advanced Package Tool): DebianやUbuntuなど、Debianベースのディストリビューションで使用される。
- インストール:
sudo apt-get install [パッケージ名]
- アップデート:
sudo apt-get update
(パッケージリストの更新)、sudo apt-get upgrade
(インストールされたパッケージのアップグレード) - 削除:
sudo apt-get remove [パッケージ名]
- インストール:
- YUM (Yellowdog Updater, Modified): Red Hat、CentOSなど、Red Hatベースのディストリビューションで使用される。
- インストール:
sudo yum install [パッケージ名]
- アップデート:
sudo yum update [パッケージ名]
(特定のパッケージ)、sudo yum update
(全パッケージ) - 削除:
sudo yum remove [パッケージ名]
- インストール:
感想など
- AWSデプロイの時によく分からないまま作成したシェルスクリプトや、Dockerfileを作成している時に理解不十分なまま使用していたパッケージ管理関連のコマンド(apt-getやyum等)について、書籍で詳しく解説されており、理解を深めることができて良かった。
- Chapter19(Git関連部分)は、Gitを他の書籍等で学習済みの人は飛ばしてもいいんじゃないかと感じた。(自分はGitの理解不十分なので一応一通り目を通した。)
コメント