UNIX Basic 2
シェル
shell(シェル)はどこか東洋的なものであるように思えます。無駄なものをそぎ落とし端的に応える、これがshellの基本的な哲学のようなものだといえます。もともとコンピューターに十分なリソースがないときから人との対話を可能にするために、shell自体はとても小さく作られ、冗長なといかけや応答は削られていきました。その伝統はメモリが十分に使える現在においても継承され、無駄なステップをすべてそぎ落とした端的な表現や指示がコンピューターに対して行えるように設計されています。それはテキストの処理に優れ、データを思うままに抽出・集計し、期待するアウトプットに加工することができます。コマンドを連結し、処理をつなげる。たったこれだけのことが、実にありふれた、簡潔で平易なshellの奥義だといえます
パイプ
パイプ"|"はあるコマンドの結果を次のコマンドに渡し、処理に幾重にもフィルターをかけていくことができます。これにより出力結果や検索結果にフィルターをかけたり、出力結果に対して所定の処理をすることができるようになります。詳細は後述の高度なコマンド利用例をご確認下さい
高度なコマンド
Unix/Linux上で使うことができる有用なコマンドを紹介します、コマンドは単体で使うのではなく、他のコマンドと組み合わせて使うことで無限の応用ができます。コマンドを使うことでテキスト処理プログラムを1から作成する必要がなく、オプションやコマンド自体の組み合わせで一括処理できるため非常に高い生産性を発揮します。以下はよく使うコマンドの組み合わせテクニックの例です。必ずしもすべてを理解してもらう必要はありませんが、単純なコマンドの組み合わせだけで、複雑な処理が組めるというのを理解してもらえればと思います。次章以降でご紹介するshellを利用したプログラムにおいても、コマンドは処理の中心になります
{ grep }
grep(グレップ)は検索用のコマンドですが、よく使うオプションをご紹介します
grep 検索ワード 対象ファイル
OR検索
-eオプションはgrepだけでor検索をできるようにします、任意の単語を含む行を指定ファイルから抽出します。以下は検索ワードAもしくは検索ワードBを含む行を検索するコマンド例となります
grep -e 検索ワードA -e 検索ワードB 対象ファイル
大文字小文字を無視
-iオプションは大文字小文字を区別しません
grep -i 検索ワード 対象ファイル
パイプを使用したAND検索
処理結果にフィルターをかけてパイプ"|"でつなげることで、and検索をすることもできます、以下例をご確認下さい。 まずはファイルを作成します
nano test
エディタでファイルを生成したら以下内容を貼り付けます
1.ab
2.abc
3.def
4.efg
作成したファイルに対してコマンド実行してみます
#abというワードを含む行の抽出
$ cat test | grep ab
1.ab
2.abc
#ab,cというand条件を満たす行の抽出
$ cat test | grep ab | grep c
2.abc
特定文字を含まない行の検索
grep -vは非常に有用なコマンドですが、指定文字を"含まない"行を表示することができます。これを用いることで任意の行をファイル内から除外して表示することができ、例えばリストから指定のIDを消したい場合などに有用です。
grep -v 検索ワード 対象ファイル
特定の文字を含まない例を実行するためファイルを作成します
nano list.csv
以下ファイルをコピーしてファイルに追記して保存して下さい
id,name
01,adam
02,eve
ファイルの準備ができたらコマンド実行を試してみましょう。以下実行例となります
# id=01の行を除外して表示
$ cat list.csv | grep -v 01,
id,name
02,eve
さらに高度な検索
メタキャラクターを使用してさらに高度な検索をすることができます。詳しくはメタキャラクターを参照してください
{ awk }
awk(オウク)は任意の文字を区切り文字として、指定の列を抽出します、デフォルトの区切り文字はスペースになります
スペース区切り
以下例ではスペース区切りの2列目を取り出します、echoコマンドで"abc def ghr"という文字列を出力したものをパイプでawkコマンドに渡し、スペース区切りの2列目を抽出しています
awk '{print $列番号}'
以下はechoコマンドを実行した例と、その実行結果をawkに渡して処理した例になります
# 1. echoの結果
$ echo "abc def ghr"
abc def ghr
# 2. パイプでawkコマンドに処理を渡す
$ echo "abc def ghr" | awk '{print $2}'
def
awkはファイルを対象にして使うことができます。abc.txtというファイルを作ってawkで列抽出を試してみましょう
# 1. echoの出力をファイルにしてファイルを作成
$ echo "abc def ghr" > abc.txt
$ echo "jkl mno pqr" >> abc.txt
$ cat abc.txt
abc def ghr
jkl mno pqr
# 2. ファイルに対してawkコマンドを実行
$ awk '{print $2}' abc.txt
def
mno
任意の区切り文字
-Fオプションで区切り文字を定義することができます、以下例ではカンマを区切り文字としてcsvの2列目を取り出します
awk -F "区切り文字" '{print $列番号}'
$ echo "abc,def,ghr" | awk -F "," '{print $2}'
def
$ cat abc.txt | awk -F "," '{print $2}'
def
mno
列組みなおし
以下例ではcsvファイルの列の並びを入れ替えて出力しています、各列の間に","を入れることでcsvを再構成しています
まずは対象ファイルを作成しましょう
nano abc.csv
以下内容を貼り付けてファイルを保存して下さい
abc,def,ghr
jkl,mno,pqr
$ cat abc.txt | awk -F "," '{print $3","$2","$1}'
ghr,def,abc
pqr,mno,jkl
列と列の間の区切り文字を変えることもできます
$ cat abc.csv | awk -F "," '{print $3":"$2":"$1}'
ghr:def:abc
pqr:mno:jkl
grepとの組合わせ
以下のようなitem.csvというリストを作成します
nano item.csv
以下がitem.csvの内容になりますので、内容をコピーしてファイルを保存して下さい
item_name,category,description,price
りんご,フルーツ,青森県産,100円
みかん,フルーツ,愛媛県産,100円
大根,野菜,,100円
$ cat item.csv | grep フルーツ | awk -F "," '{print $1}'
りんご
みかん
awkはそれ自体で1冊本が書けてしまうほど奥深いコマンドです、上記grepコマンドを使わずともawkコマンドだけでより高度なフィルター処理が可能です。awkコマンドについてはぜひご自身でその可能性を探ってみてください
{ sed }
sed(セド)コマンドは文字列の変換コマンドとして使われます
sed "s/変換文字/変換後文字/g"
以下はabcという文字列をdefという文字列に変換する例です
# 1.echo結果
$ echo "abc"
abc
# 2.echo出力をパイプでsedコマンドに渡す
$ echo "abc" | sed "s/abc/def/g"
def
削除処理
sedで特定文字列を削除する場合は変換文字を空にします。以下例ではabという文字を削除しています
$ echo "abc" | sed "s/ab//g"
c
改行処理
sedを利用して、改行を加えて見やすくしたり、逆に改行をなくして1列にして処理をしやすくしたrすることがあります。\nはUNIXの改行コードです。 先程作成したabc.csvファイルを使って改行処理を実行してみましょう
# 対象ファイルの内容確認
$ cat abc.csv
abc,def,ghr
jkl,mno,pqr
# カンマを改行へ変換
$ cat abc.csv | sed "s/,/\n/g"
abc
def
ghr
jkl
mno
pqr
# 上記処理の改行をさらにスペースへ変換, -zオプションを使用
$ cat abc.csv | sed "s/,/\n/g" | sed -z "s/\n/ /g"
abc def ghr jkl mno pqr
行頭・行末への文字追加
メタキャラクターを使用してさらに高度な変換をすることができます。例えば行頭、行末に一括で特定の文字列を付与することができ、非常に便利です。行頭は^、行末は$で表すことができます。その他メタキャラクタも多数ありますので、詳細についてはメタキャラクターを参照してください。
# 対象ファイルの中身を確認
$ cat abc.csv
abc,def,ghr
jkl,mno,pqr
# 行頭にシャープを追加
$ cat abc.csv | sed "s/^/#/g"
#abc,def,ghr
#jkl,mno,pqr
# 行末にタグを追加
$ cat abc.csv | sed "s/$/#/g"
abc,def,ghr#
jkl,mno,pqr#
# 行頭・行末にタグを追加(HTMLタグへ変換)
$ cat abc.csv | sed "s/^/<p>/g" | sed "s/$/<\/p>/g"
<p>abc,def,ghr</p>
<p>jkl,mno,pqr</p>
{ sort }
sort(ソート)は並び替えを行うためのコマンドですが、パイプ"|"と組み合わせて使うことが多いです。先ほどのabc.csvを解体して並び替えてみましょう
昇順、降順の並び替え
# 対象ファイル
$ cat abc.csv
abc,def,ghr
jkl,mno,pqr
# カンマ区切りを改行に変換し昇順にソート
$ cat abc.csv | sed "s/,/\n/g" | sort -n
abc
def
ghr
jkl
mno
pqr
# アルファベット降順にソート
$ cat abc.csv | sed "s/,/\n/g" | sort -r
pqr
mno
jkl
ghr
def
abc
自然な並び替え
sort -Vを使うと自然な並び替えができて便利です、詳しくはsortのmanページを参照ください
sort -v
{ uniq }
uniq(ユニーク)は重複した行を集約するコマンドです、一般的にパイプでsortと一緒に使うことが多いです。以下例ではコマンドを組み合わせながら文字列を操作し、あえて重複を作った後、最後に重複を排除しています
重複排除の例
# 対象ファイルの中身を確認
$ nano abc.csv
abc,def,ghr
jkl,mno,pqr
# 重複させる
$ cat abc.csv > double.csv
$ cat abc.csv >> double.csv
$ cat double.csv
abc,def,ghr
jkl,mno,pqr
abc,def,ghr
jkl,mno,pqr
# 1列にする (,を改行に変換)
$ cat double.csv | sed "s/,/\n/g"
abc
def
ghr
jkl
mno
pqr
abc
def
ghr
jkl
mno
pqr
# sortする
$ cat double.csv | sed "s/,/\n/g" | sort
abc
abc
def
def
ghr
ghr
jkl
jkl
mno
mno
pqr
pqr
# 重複を排除する(uniq)
$ cat double.csv | sed "s/,/\n/g" | sort | uniq
abc
def
ghr
jkl
mno
pqr
{ wc }
wc(ダブルシー)はカウントに使うコマンドですが、行数カウントに使うことが最も多いです
行数カウント
-lで行数がカウントできます
wc -l
入力値の行数を出せるため例えば、検索した単語が含まれる行数を出すのに便利です
# VERSIONという単語を含む行をカウント
$ cat /etc/os-release | grep VERSION | wc -l
3
{ cut }
cut(カット)コマンドはawkと同じく列抽出に使われます、awkほど高度な処理ができない一方で簡潔に処理を記載することができます。
N列抽出
cut -f 列番号 -d "区切り文字"
# 対象ファイルの中身を確認
$ cat abc.csv
abc,def,ghr
jkl,mno,pqr
# 2列目を抽出
$ cat abc.csv | cut -f 2 -d ","
def
mno
N列目以降を抽出
列指定の際に列番号のあとに-を付けると何列目以降という指定が容易にできます
$ cat abc.csv | cut -f 2- -d ","
def,ghr
mno,pqr
{ tr }
tr(ティーアール)コマンドはsedと同じく文字変換に使われます、sedほど高度な処理ができないですが、以下のように削除処理などは簡潔に記載できます -dは"delete"を意味するオプションです
文字列削除
tr -d 削除文字
$ echo "abc" | tr -d ab
c
{ nl }
nl(エヌエル)は行頭に行番号を振ることができるコマンドです、cat等のコマンドと組み合わせて使うと便利です
行番号の付与
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
#行番号を付与(nl)
$ cat /etc/os-release | nl
1 NAME="Ubuntu"
2 VERSION="20.04 LTS (Focal Fossa)"
3 ID=ubuntu
4 ID_LIKE=debian
5 PRETTY_NAME="Ubuntu 20.04 LTS"
6 VERSION_ID="20.04"
7 HOME_URL="https://www.ubuntu.com/"#
8 SUPPORT_URL="https://help.ubuntu.com/"
9 BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
10 PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
11 VERSION_CODENAME=focal
12 UBUNTU_CODENAME=focal
{ head }
head(ヘッド)はファイルの先頭から指定行を表示するコマンドですが、sortした結果の上位表示などによく使われます
head -行数 対象ファイル
以下はuniqでも使用した例ですが、最後に上位3行をheadで表示しています
先頭から指定行数を表示
# 対象ファイルの中身を確認
$ cat abc.csv
abc,def,ghr
jkl,mno,pqr
# 重複させる
$ cat abc.csv > double.csv
$ cat abc.csv >> double.csv
$ cat double.csv
abc,def,ghr
jkl,mno,pqr
abc,def,ghr
jkl,mno,pqr
# 1列にする (,を改行に変換)
$ cat double.csv | sed "s/,/\n/g"
abc
def
ghr
jkl
mno
pqr
abc
def
ghr
jkl
mno
pqr
# sortする
$ cat double.csv | sed "s/,/\n/g" | sort
abc
abc
def
def
ghr
ghr
jkl
jkl
mno
mno
pqr
pqr
# 重複を排除する(uniq)
$ cat double.csv | sed "s/,/\n/g" | sort | uniq
abc
def
ghr
jkl
mno
pqr
# 上位3行を表示
$ cat double.csv | sed "s/,/\n/g" | sort | uniq | head -3
abc
def
ghr
{ tail }
tail(テイル)はheadとは逆に最終行から指定行を表示するコマンドですが、logファイルの閲覧などによく使われます
tail -指定行 対象ファイル
ログファイルをwatchする
-fオプションはファイルが追記される都度標準出力にお表示することができます、リアルタイムにログを表示するのに便利です
tail -f 対象ファイル
{ diff }
差分を出力
diff(ディフ)は2つのファイルの差分 (difference)を表示します
diff 対象ファイルA 対象ファイルB
以下例ではuniqコマンドの例で作成したabc.csvとdouble.csvの差分を表示しています
$ diff abc.csv double.csv
2a3,4
> abc,def,ghr
> jkl,mno,pqr
Meta charactor
UNIX/Linuxのコマンドライン上で特別な意味をもった文字Meta charactor(メタキャラクター)を扱うことができます。この使用法はワイルドカードや正規表現と呼ばれますが、ここでは単純に特別な意味合いを持った文字と考えましょう、代表的なものを以下紹介します。メタキャラクターを使うことで、非常に柔軟な検索や文字変換、プログラムの際の条件分岐が行えるようになります。
アスタリスク
"*"は任意の文字列を意味しますが、例えばHello Woldという文字列は、アスタリスクを用いて以下のような表現に置き換えられます
Hello World (メタ文字なし)
使用例
grep H* test.txt # test.txt内でHから始まる任意の文字列を検索、Hello Wolrdを含む行もヒット
grep H*d test.txt # test.txt内でHから始まりdで終わる任意の文字列で、Hello Worldむ行もヒット
grep Hello * # Helloという単語を含むすべての"ファイル"を検索(対象ファイル自体をアスタリスクにしています)
行頭
"^"ハットはUNIXのメタ文字としては行の最初を意味します、これを使うことで例えば文章の最初がHelloではじまる行などを容易に検索でき、非常に便利です。検索例などは後続のセクションでご確認いただけます
使用例
grep ^Hello test.txt # test.txt内で行頭がHelloから始まる行を検索
行末
"$"をパラメーターの最後に記載した場合行末という意味を持ちます。単体で使う場合や最後に持ってきた場合行末を意味するようになります(パラメーターの最初につけると変数という別の意味を持ってきますので注意して下さい)
使用例
grep World$ test.txt #test.txt内でWorldという文字列で終わる行を検索
任意の一文字
"."は正規表現を使うコマンドでは任意の位置文字を表します
使用例
grep H.llo test.txt #Hの次の文字は任意となりHelloもヒットします
無効化
各メタ文字に\をつけることで、その意味合いを無効化することができます
\* (メタキャラクターとしてのアスタリスクの無効化、アスタリスクは単なる文字に戻ります)
その他の特殊文字
改行
Unixでは改行コードは\nを使用します、これに対してwindowsの改行コードは\r\nです、windowファイルをunix/linuxにコピーする場合改行コードの変換をしましょう
\n
文字区切り
""を使うことで、どこまでが文字列かをコマンドに対して明示することができるようになります。スペースを含む単語を検索したい場合などに便利です
使用例 (""をつけない場合スペースを含むためエラーになります)
grep "Hello World" test.txt #test.txt内でHello Worldという単語を含む行を検索
高度なエディター (vi)
vi(ブイアイ)は高度なコマンドライン機能を持ったエディタで、Unix/Linuxでは非常に歴史あるエディタです。慣れると非常に高いパフォーマンスを発揮する一方で、習得には少し訓練を要します。nanoで十分という方は読み飛ばしていただいて構いませんが、挑戦できる方はぜひ手を動かして試してみてください。以下はtest.txtというファイルをviで編集する例です
vi test.txt
モード
viにはコマンドモードとインサートモードの2つの状態があります。コマンドモードは文字の検索や削除、その他の一括操作が行える状態で、インサートモードは文字の加筆が行えます
カーソルの移動
コマンドモードであれ、インサートモードであれカーソルの移動は矢印キーで行えます
↑→↓←
コマンドモード
viを最初に起動するとコマンドモードになります、test.txtにはまだ何も記載されていないと思いますので早速インサートモードへ移行しましょう
インサートモードへ移行
インサートモードに移行するためにはコマンドモードでiとうつか、oと打つのが通常です。iと打った場合はカーソルのある行を直接編集できるようになります。また、oと打った場合は行の追加になります
#編集
i
#行の挿入
o
インサートモードへ移行して、1行目にabcという文字をファイルに追記し、2行目にdefという文字を追記しましょう
1. vi test.txt
2. iとうつ
3. abcを追記してEnter
4. defという文字を追記
vi test.txt
--code--
abc
def
--------
コマンドモードへ移行
文字が追記できたらコマンドモードへ戻りましょう、Escapeキーを打つことでコマンドモードへ戻ることができます。
Esc
文字検索
コマンドモードで文字の検索をしたいときはまず/を打ってみてください、文字を検索することができます
/文字列
以下abcを検索してみましょう
/abc
文字削除
コマンドモードで文字の削除をしたいときは、カーソルを該当文字の個所にもっていきxと打ってください
x
試しにaという文字を消してみてください
一括削除
削除したい行に移動してddと打ってみてください
dd
一括コピー
コピーしたい行に移動してyyと打ってみてください
yy
一括貼り付け
文字を挿入したい行にいき、pと打ってみてください
p
元に戻す
編集した内容を基に戻したい場合はundoコマンドで戻してください、コマンドモードで単にuと打てば元に戻ります
u
元に戻したものを、取り消したい場合は
:redo
と打ってください
一括置換
sedと同じような命令文で一括変換が行えます
:%s/変更したい文字列/変更後文字列/g
defをdepに変換してみましょう
:%s/def/dep/g
その他の便利なコマンド
コマンドモードにはその他にも便利なコマンドがありますが、以下よく使うものを列挙します
行頭に移動する
0
行末に移動する
$
ファイルの最初に移動する
:0
ファイルの最後に移動する
shift + G
ファイルを保存する
編集内容を保存する場合は、まずコマンドモードに移行してください、その後:wで保存することができます
1. Esc
2. :w
viを終了する
viを終了する際、編集内容を保存して終了する方法と、編集内容を破棄して終了する方法の2通りがあります
保存して終了
保存して終了する場合はコマンドモードで:wqと入力してください
1. Esc
2. :wq
保存せず終了
保存せずに終了する場合はコマンドモードで:qと入力してください
1. Esc
2. :q
強制終了
うまく終了できない場合は強制終了しましょう、!オプションをつけることで強制終了できます
1. Esc
2. :q! (保存せず強制終了)
or
2. :wq! (保存して強制終了)
自動インデントをなくす
viを操作する際に自動でインデントがつけられ、逆に邪魔なことがあります。その場合はユーザー毎にあらかじめ設定ファイルを作って消しておきましょう
vi $HOME/.vimrc
set noautoindent
set nosmartindent
set nocindent
viにはその他にも多くの便利なコマンドやオプションがありますのでインターネットで使用法を探ってみてください。それがUnix/LinuxをHackするということです
その他のテクニック
候補の表示
コマンドライン上でtab keyを打つと候補を表示することができ、非常に便利です。たとえば、ディレクトリをすべて手で打つよりは ls /hに続いてtabキーを打つと/homeが候補として表示されます
+tab
Administrator
UNIX/Linuxを管理するための最低限の操作を説明します
sudo
特権権限でのコマンド実行はsudo(スードゥー)コマンドで実行します、以下は/etc/passwdファイルを特権ユーザーになって開いている例です
sudo cat /etc/passwd
ユーザーを作る
useradd(ユーザーアド)コマンドでユーザーを作成できます、1人1アカウントをユーザーアカウントを作るのが良いでしょう
sudo useradd ユーザー名
userのパスワードを設定します
sudo passwd ユーザー名
以上のコマンドでuser情報は/etc/passwdファイルに追記されます
userを削除したい場合はuserdelコマンドで削除してください
userdel ユーザー名
グループを作る
グループを作成してユーザー管理する場合、groupadd(グループアド)コマンドで作成しましょう
sudo groupadd グループ名
グループにユーザーを追加する場合はgpasswdコマンドを実行してください
sudo gpasswd -a ユーザー名 グループ名
グループの設定状況は/etc/groupファイルで確認できます
cat /etc/group
グループを削除したい場合はgroupdelコマンドを実行してください
sudo groupdel グループ名
sudo権限付与
作成したユーザーやグループにsudo権限を付けたい場合、visudo(ブイアイスードゥー)コマンドで/etc/sudoersファイルを編集してください
visudo
以下はtestグループに所属するユーザー全員にsudo権限を付けている例です
%test ALL=(ALL:ALL) ALL
sudoのオプションとして他のユーザーにsudoすることもできます、後述のsmall-shellプログラムでは頻繁にsmall-shellユーザー権限での実行を行いますがその際は、sudoに-uオプションをつけて実行します
sudo -u small-shell #特定ユーザー権限でのコマンド実行
SSHでログインする
クラウド環境のLinuxにログインする場合、ssh(エスエスエイチ)プロトコルを使ってLinuxにログインしましょう。localにインストールしているubuntuで以下コマンドを実行してください
ssh -l ユーザー名 サーバIP
Note
クラウド環境でLinuxを使っている場合はパスワード認証は極力使わず、証明書認証を使いましょう。併せてクラウド管理コンソールなどで特定のIPアドレスからの接続のみ許可することを推奨します。別途オンラインで開催するLinux DOJOにて方法をご紹介できればと思います
オートメーション
Unix/Linuxで処理の自動化を行う際にcron(クーロン)を使います。cron自体は非常にすぐれたツールですが、エンジニア以外には少し使い勝手が難しい部分もあります。後述のsmall shellを利用することで、登録や結果の確認が容易になりますのでぜひsmall shell応用コースで登録方法を確認してください
WEB系コマンド
WEB系システムの開発を行う際に、以下コマンドを知っていると非常に有用です。それぞれ奥深いコマンドですので、ここで使い方を網羅的に説明することは避けますが、APIを使う場合はcurlを、jsonフォーマットを扱う際はjqを、というように覚えておいてもらえると良いと思います。
{wget}
wget(ダブルゲット)はWEBページをコマンドラインでファイルとして取得するコマンドです
wget サイト名
wget https://21it.org
{curl}
curl(カール)もwgetと同様にWEBページを取得するコマンドですが、多用なオプションを有するため、例えば他サイトのAPIと連携する際に利用することができます。curlを使ったAPI実装例が豊富に紹介されています。ぜひ自分で一度curlコマンドを調べてみて使ってみてください
{jq}
jq(ジェイキュー)はWEB上でのデータ交換の際に使われるjsonフォーマットのデータを扱うためのコマンドです。コマンドラインで容易にjsonデータを解析できるためWEBサイトの開発の際に便利に使えます。curlとjqを組み合併せることで他サイトとの連携が容易に実装できます。こちらもプログラムを開発をするなかで身に着けるのが良いでしょう
体系的な学習
Linuxについてより深く、体系的に理解したい場合はLPICの教材などで学習することをお勧めします。LPIC1相当の知識があればLinuxを扱うには十分だといえます