はじめに
Linux初心者の備忘録です。
学んだそばからすぐに忘れるので困っています。
「あ、また忘れてるわ_φ(・_・メモメモ」ということがあれば追記していきます。
※ Ubuntu-20.04 を使用しています。
echo
パイプ|
やリダイレクト>
と組み合わせると美味しくなる文字列を標準出力するコマンド。
改行は出力したくない
echo -n
ファイルやディレクトリの操作
ls
ファイルとディレクトリを分けて表示する
-F
【再帰的】サブディレクトリも含めた一覧を取得する
-R
ファイル種別がわかりやすく表示する
ls -F
@ : シンボリックリンク
* : 実行ファイル
隠しファイルも表示する
ls -a
ファイルのパーミッションを確認する
ls -l
複数フォルダを同時に確認する
ls /usr /etc
ファイル名の始まりや終わりの一部文字列を指定して表示する
- aから始まるファイルを表示する
ls a*
- .txtで終わるファイルを表示する
ls *.txt
cp
ディレクトリの内容も含めてコピーする
cp -r
ファイル属性も含めてコピーする
cp -a
シンボリックリンク
作成する
ln -s <リンク元 > <リンク先>
削除する
rm
ディレクトリ
深いディレクトリを一気に作成したい
mkdir -p daily_report/2023/04
空のディレクトリを削除する。(ファイルがあればエラーになる)
rmdir <ディレクトリ名>
フォルダ内のファイルも含めて削除する。(書き込み権限のないファイルはエラーになる)
rm -r <ディレクトリ名>
フォルダ内のファイルも含めて削除する。(強制的)
rm -rf <ディレクトリ名>
複数ファイルを一気に移動したい
- 2023で始まるファイルを親フォルダに移動する
mv 2023* ../
ファイルの情報を表示する
ファイルの詳細情報を表示する
stat
ファイルの形式を表示する
file
ファイルを探す
-
現在のディレクトリ配下で「.txt」ファイルを探す
find . -type f -name "*.txt"
-
上記コマンドで検索したファイルのパーミッションを確認する。(階層を超えて一覧化できる)
find . -type f -name "*.txt" | xargs ls -l
アーカイブと圧縮
アーカイブ: 複数ファイルをまとめること
圧縮: 容量を小さくすること
アーカイブして圧縮する(gzip)
tar -czf
アーカイブを展開する。(圧縮の有無は自動判定)
tar -xf
アーカイブファイルの内容を確認する
tar -tf
テキスト操作
cat
ファイルの内容を表示する。ファイルの内容を連結(concatenate)という用途もある。
行番号を付けて表示する
cat -n
複数ファイルを連結する
cat ファイル1 ファイル2 ファイル3 > 連結ファイル
less
スクロールする
j
# 1行下にスクロール
k
# 1行上にスクロール
f
# 1画面下にスクロール
b
# 1画面上にスクロール
ファイル内で検索する
/<検索したい文字列>
# 下方向に検索
?<検索したい文字列>
# 上方向に検索
n
# 次の検索結果に移動する
N
# 前の検索結果に移動する
head, tail
head
, tail
では先頭・末尾の10行を表示する
行数の指定
head/tail -数字
wc
ファイルの文字数/単語数/行数を表示する
行数だけを表示する
wc -l
grep
ファイルから文字列を含む行を表示する
ディレクトリ全体を対象に検索する
grep -r 文字列 対象ディレクトリ
複数の文字列または正規表現で検索する
grep -e 文字列1 -e 文字列2
grep -e 正規表現
指定した文字列を含まない行を検索する
``grep -v 文字列`
コマンドライン入力操作
カーソル移動する
Ctrl + b
# 後方に1文字
Ctrl + f
# 前方に1文字
Ctrl + a
# 行頭へ
Ctrl + e
# 行末へ
文字を削除する
Ctrl + h
# BackSpaceキーと同様
Ctrl + d
# Deleteキーと同様
Ctrl + w
# 1単語ずつ後方削除
コマンド履歴を使う
Ctrl + p
# 1つ前のコマンド履歴へ
Ctrl + n
# 次のコマンド履歴へ
コマンド履歴を検索する
Ctrl + r
vim操作
カーソル移動する
0
# 行の先頭
$
# 行の末尾
G
# 最終行
指定行G
# 指定行へ移動
->※:set number
で行番号を付与できる
検索する
/
# 下検索
?
# 上検索
検索結果の移動は、n
またはN
削除する
x
# カーソル位置の文字を削除する
その他、d
の後に移動コマンドを組み合わせて削除ができる
d$
, d0
, dw
など
dd
# カーソルのある行を削除
アンドゥ
u
テキスト処理
sed
文字列を編集して標準出力に出力する。元のファイルは変更されないためフィルタとして使える。
「Stream Editor」
行を削除する
sed 1d <ファイル名>
# 1行目を削除する
sed '3,$d' <ファイル名>
# 3行目から最終行まで削除する。$
を利用する際は' 'で囲う必要がある
sed /^a/d <ファイル名>
# aから始まる行を削除する
行を置換する
-
大阪を東京に置換する。行の最初の文字列のみ置換の対象
sed 's/Osaka/Tokyo/' <ファイル名>
-
g
フラグを付けると見つかったすべての文字列が置換される
sed 's/Osaka/Tokyo/g' <ファイル名>
-
「Osaka」を「/Osaka/」に置換する
- 区切り文字は
/
である必要はない。sの後ろの文字が自動的に区切り文字になる
sed 's!Osaka!/Osaka/!g' <ファイル名>
- 区切り文字は
awk
「オーク」と発音する
フィールド(列)選択
-
lsコマンドの結果から、5列目と9列目を表示する
ls -l <ファイル名> | awk '{print $5,$9}'
-
一番最後の列と、その1つ前の列を表示する
ls -l <ファイル名> | awk '{print $(NF-1),$NF}'
正規表現で文字列のパターン指定
-
$9
(9列目)が「先頭がVB」にマッチする行を表示する
ls -l <ファイル名> | awk '$9 ~ /^VB/ {print $5,$9}'
-
先頭がl(つまりシンボリックリンク)の行を表示する
ls -l <ファイル名> | awk '/^l/ {print $5,$9}'
フィールドの区切り文字を指定する
- カンマ(,)を区切り文字として扱う場合
awk -F,
データで計算する
-
最終フィールドの値を合計する
awk '{sum += $NF} END{print sum} <ファイル名>
-
平均値を計算する
awk -F, '{sum += $NF} END{print "Average:",sum/NR}' <ファイル名>
awkスクリプトを保存して、再利用する
-
保存
上記の{sum += $NF} END{print "Average:",sum/NR}
をaverage.awk
で保存すると、 -
読み込み
awk -f
-> ex.)awk -F, -f average.awk <ファイル名>
suとsudo
su
-> ユーザを切り替える。
sudo
-> 一般ユーザがスーパーユーザとしてコマンドを実行するために使用する。
プロセスとジョブ
プロセス
メモリ上で実行状態にあるプログラムのこと。
ps
# プロセスIDの確認
kill <プロセスID>
# プロセスを終了させる
ジョブ
シェルのコマンドラインの1つの行が、1つのジョブにあたる。
jobs
でジョブ番号が確認できる。
kill %<ジョブ番号>
# ジョブを終了させる
違い
プロセスは、Linuxカーネルから見た処理の単位であり、システム全体で一意のプロセスIDをもつ。
ジョブは、シェルごとの処理の単位で、複数のシェルからコマンドを打つとジョブ番号は重複しうる。
※まだ上手く言語化できておりません・・・。
シェルスクリプト
#!bin/bash
ファイルの先頭が「#!」ならば、その後ろのコマンド(/bin/bash)を実行します、という宣言をしており、
Linuxカーネルは
実行方法の違い
./sample.sh
bash ./sample.sh
source ./sample.sh
. ./sample.sh
- 1のみシバンが必須
- 1と2は同じ動作
- 3と4は同じ動作
- 1と2はサブシェル(※)で実行されるが、3と4ではカレントシェルの中で実行されるためシェル環境の影響を受ける。また、元のシェルに影響をおよぼすことに注意が必要である。
※ サブシェル: 現在のシェルから新しく起動される子プロセスのシェル。サブシェルは元のシェルとは別物である。環境変数は引き継がれますが、エイリアスなどの設定は引き継がれない。
さいごに
今後も経験を積みながら更新していきます。