はじめに
最低限のLinux基本操作は少しずつ慣れてきたけどは、もう少し効率的に操作できるようになりたい!
そんな初心者が次のステップに行くための、知っておくとに役立つコマンドをまとめてみました。
この記事では、単にコマンドを覚えるのではなく、実際に手を動かしながら、現場でよく使う「ちょっと便利なテクニック」を練習問題として紹介していきます。最後に確認テストも用意しているので、ぜひ挑戦してみてください!
0. 練習環境の準備
- Linux環境を用意する
(例)
- Windows:WSL(Ubuntu)
- macOS:ターミナル
- クラウド:Cloud Shell(AWS / GCP / OCI など)
ターミナルを開いて、次が動けば準備完了です。
whoami
pwd
- 作業用ディレクトリを作成
mkdir unix_practice
cd unix_practice
それでは始めていきましょう!
1. ファイルを作る(ヒアドキュメント)
まずは、練習で使うデータを作ります。
cat << EOF > long_file_name_for_history_practice.txt
apple
banana
grape
EOF
確認:
cat long_file_name_for_history_practice.txt
これは ヒアドキュメントという書き方で、
複数行の文字列をまとめてファイルに書き込む方法です。
cat << EOFは、EOFが出てくるまでの入力を
標準入力としてcatに渡し、ファイルに書き込む構文です。
複数行のテキストを一度に作りたいときに便利です。
2. ファイルの中身を検索する(grep)
作ったファイルの中から、特定の文字列を探します。
grep apple long_file_name_for_history_practice.txt
3. 直前の引数を再利用する(!$)
直前のコマンドで使った 長いファイル名を、
手入力せずに再利用します。
vi !$
(すぐ閉じてOKです)
例えば、
catで中身を見たファイルをそのまま編集する時、「今見たファイルをそのまま開いて編集」のような場面で使えますね。
4. エディタを使わずに新しいファイルを作る(cat >)
次の内容を memo.txt に作成してください。
cat > memo.txt
入力内容:
TODO
- write report
- review
- submit
終了は Ctrl + D
5. 既存ファイルに追記する(cat >>)
作成したファイルの末尾に追記します。
cat >> memo.txt
入力内容:
- follow up
6. 変数展開を理解する(ヒアドキュメント)
変数展開あり
cat << EOF > env_info.txt
User: $USER
Home: $HOME
EOF
確認:
cat env_info.txt
(実行例)
ubuntu@ubuntu:~/unix_practice$ cat << EOF > env_info.txtinfo.txt
User: $USER
Home: $HOME
EOF
ubuntu@ubuntu:~/unix_practice$ ls
env_info.txt long_file_name_for_history_practice.txt memo.txt
ubuntu@ubuntu:~/unix_practice$ cat env_info.txt
User: ubuntu
Home: /home/ubuntu
この書き方では、
$USERや$HOMEが
コマンド実行時に実際の値へ置き換えられてから
ファイルに書き込まれます。
変数展開なし
EOFをシングルクォートで囲んでいるため、ヒアドキュメント内で変数展開が行われません。
$USER や $HOME は文字列のままファイルに書き込まれます。
cat << 'EOF' > env_info_literal.txt
User: $USER
Home: $HOME
EOF
(実行例)
ubuntu@ubuntu:~/unix_practice$ cat << 'EOF' > env_info_literal.txt
User: $USER
Home: $HOME
EOF
ubuntu@ubuntu:~/unix_practice$ cat env_info_literal.txt
User: $USER
Home: $HOME
7. 実行ユーザーとシェルを確認する
これらのコマンドは、
「誰が」「どのシェルで」作業しているかを確認するためのものです。
whoami は実行ユーザー、echo $0 は使用中のシェルを表示します。
ps -p $$ では、現在のシェルプロセスを詳細付きで確認できます。
whoami
表示されたユーザー名は root か、それとも一般ユーザーか確認しましょう。
echo $0
bash/sh/zshのどれが表示されましたか?それは 自分が想定しているシェルでか確認してみましょう。
ps -p $$
ps -p $$ は、「今このターミナルで動いているシェル」を確認するコマンドです。
(実行例)
ubuntu@ubuntu:~/unix_practice$ ps -p $$
PID TTY TIME CMD
716588 pts/0 00:00:00 bash
PIDはそのシェルのプロセスID、TTYは紐づいている端末を表します。
CMDが bash なので、現在のシェルは bash であることが分かります。
8. ファイル名を変更し、引数を使い回す
touch original_name.txt
mv original_name.txt renamed_file.txt
直前の引数だけを再利用して、
シンボリックリンクを作成します。
ln -s !$ !:1
!$
→ 直前のコマンドの 最後の引数
→ renamed_file.txt
!:1
→ 直前のコマンドの 最初の引数
→ original_name.txt
つまり、このコマンドは、renamed_file.txt へのリンクをriginal_name.txt という名前で作るという意味になります。
9. 大きなファイルを探す(df/find)
ディスクの使用状況を確認します。
df -h
-hはサイズを人が読みやすい形式で表示します
ホームディレクトリ配下で、
1MB以上のファイルを探します。
find ~ -size +1M -exec ls -lh {} \;
件数を確認:
find ~ -size +1M | wc -l
10. Webの内容を取得して加工する(curl + grep)
Webページを取得します。
curl -s https://example.com
<title> を含む行だけ表示:
curl -s https://example.com | grep title
Webページをファイルとして保存:
curl -s -o example.html https://example.com
curl は
「Webをブラウザで見る」以外の選択肢を提供するコマンドです。
確認・取得・保存を、すべてコマンドラインで完結できます。
11. ログを解析する(grep / awk)
ログファイルを使って、
**「必要な行を絞る」「必要な部分だけ取り出す」**練習をします。
ログファイルを作成します。
cat << EOF > app.log
info: start
error: file not found
warning: low memory
error: timeout
EOF
error で始まる行だけ表示:
grep '^error' app.log
: の前の文字列だけ表示:
awk -F: '{print $1}' app.log
grepで 行を絞り、awkで 中身を切り出す。この2つを組み合わせることでエラーの内容だけ表示する、というようなことも出来ます。
(実行例)
ubuntu@ubuntu:~/unix_practice$ grep '^error' app.log
error: file not found
error: timeout
ubuntu@ubuntu:~/unix_practice$ awk -F: '{print $1}' app.log
info
error
warning
error
ubuntu@ubuntu:~/unix_practice$ grep '^error' app.log | awk -F: '{print $2}'
file not found
timeout
上記のように正規表現を効果的に使うことで、grep で「どの行を対象にするか」を細かく指定することができます。
| パターン | 意味 | 用途例 |
|---|---|---|
^ |
行の先頭 | 行頭が特定の文字列かどうか |
$ |
行の末尾 | 行末が特定の文字列かどうか |
[] |
括弧内のいずれか | 特定の文字種を含む行 |
[^ ] |
否定(〜以外) | 数字以外の文字を含む行 |
. |
任意の1文字 | 文字数や位置が決まったパターン |
* |
直前の文字の0回以上 | 同じ文字の繰り返し |
12. ディレクトリ移動を管理する(pushd / popd)
pushd / popd は、
移動したディレクトリをスタック(履歴)として管理するためのコマンドです。
「元の場所に戻る」を何度も行う作業で特に便利です。
pushd .
pushd /etc
pushd /var
dirs
popd
popd
-
pushd <dir>:移動しつつ、元の場所を記録する -
dirs:移動履歴(スタック)を表示 -
popd:1つ前の場所に戻る
→ 元のディレクトリを意識せずに移動できるのがポイントです。
13. データを集計する(awk)
CSVファイルを作成します。
cat << EOF > sales.csv
Alice,10,20,30
Bob,5,15,10
Charlie,8,12,20
EOF
- 1行が1人分のデータ
- カンマ区切りで「名前, 数値, 数値, 数値」が並んでいます
名前と合計値を表示:
awk -F, '{print $1,$2+$3+$4}' sales.csv
このコマンドでやっていること
-
-F,
→ 区切り文字を カンマ に指定しています -
$1
→ 1列目(名前) -
$2 + $3 + $4
→ 2〜4列目の数値を足し算 -
print
→ 計算結果を表示
つまり、「各行について、名前と数値の合計を表示する」という処理をしています。
合計が40以上の人だけ表示:
awk -F, '{sum=$2+$3+$4; if(sum>=40) print $1,sum}' sales.csv
確認テストをしてみよう!
ここまで
確認テスト(実践)
問題1
次の内容を持つファイル check1.txt を作成してください。
red
blue
green
答え(クリックして表示)
cat << EOF > check1.txt
red
blue
green
EOF
問題2
check1.txt の中から blue を含む行だけ表示してください。
答え(クリックして表示)
grep blue check1.txt
問題3
直前のコマンドで使ったファイルを、
ファイル名を入力せずに表示してください。
答え(クリックして表示)
cat !$
問題4
note.txt を作成し、次の順で内容を完成させてください。
FIRST
SECOND
答え(クリックして表示)
cat > note.txt
FIRST
Ctrl+D
cat >> note.txt
SECOND
Ctrl+D
問題5
実行中のユーザー名が入ったファイル user.txt を作成してください。
答え(クリックして表示)
cat << EOF > user.txt
User: $USER
EOF
問題6
$USER という文字列がそのまま入るファイル
user_literal.txt を作成してください。
答え(クリックして表示)
cat << 'EOF' > user_literal.txt
User: $USER
EOF
問題7
今使っているシェルを確認してください。
答え(クリックして表示)
echo $0
または
ps -p $$
問題8
a.txt を作成し、b.txt に名前を変更してください。
その後、変更後のファイルを 引数の再利用で表示してください。
答え(クリックして表示)
touch a.txt
mv a.txt b.txt
cat !$
問題9
ディスクの使用状況を確認してください。
答え(クリックして表示)
df -h
問題10
ホームディレクトリ配下で、
1MBより大きいファイルを探してください。
答え(クリックして表示)
find ~ -size +1M
問題11
Webページを取得し、page.html という名前で保存してください。
答え(クリックして表示)
curl -s -o page.html https://example.com
問題12
次のファイルがあるとします。
cat << EOF > log.txt
info: start
error: failed
warning: low memory
error: timeout
EOF
error の行だけを表示してください。
答え(クリックして表示)
grep '^error' log.txt
問題13
先ほどの log.txt から、
: の前の文字列だけを表示してください。
答え(クリックして表示)
awk -F: '{print $1}' log.txt
問題14
今いるディレクトリを記録したあと /etc に移動し、
元の場所に戻ってください。
答え(クリックして表示)
pushd .
pushd /etc
popd
おわりに
お疲れ様でした!最後の確認テストまで完走できたでしょうか。
今回紹介したテクニックは、どれも実務のちょっとした場面で役立つものばかりです。一度にすべてを覚えるのは大変ですが、作業中に「あ、これあの記事で見たな」と思い出したときに読み返してもらえると嬉しいです。
少しずつ使えるコマンドを増やして、日々のターミナル操作をより快適にしていきましょう!
参考
本記事は先輩エンジニア @engchina さんの記事を参考にさせていただき作成しました!