うたカモ技術ブログ

Linux その他

Linux   覚えておくと便利なコマンド

post:     update: 

この記事ではLinuxコンソールを操作する上で便利なツールについてメモします。
このメモ記事は随時更新・追加されます。

目次

  1. 【findコマンド】
  2. 【tarコマンド】
  3. 【cutコマンド】出力結果から文字列を抽出
  4. 【awkコマンド】列単位で抽出・条件判定
  5. 【sedコマンド】置換・削除などの一括編集
  6. 【wcコマンド】テキストの詳細情報の表示
  7. 【mountコマンド】リムバーブルメディアのマウント
  8. 【umountコマンド】リムバーブルメディアのアンマウント
  9. 【grepコマンド】文字列の検索
  10. 【sort / uniqコマンド】並び替えと重複整理
  11. 【head / tail / lessコマンド】長い出力の確認
  12. 【teeコマンド】表示しながら保存
  13. 【du / dfコマンド】ディスク使用量の確認
  14. 【ps / pgrep / pkillコマンド】プロセス管理
  15. 【systemctl / journalctlコマンド】サービス管理とログ確認
  16. 【rsyncコマンド】差分コピー
  17. 【lnコマンド】シンボリックリンクの作成
  18. 【jqコマンド】JSONの整形と抽出

【findコマンド】ファイル検索

利用目的
システム上のどこかにある目当てのファイルを探すときに使用します。 個人的には特定文字列を持つファイルを探すときに良く使います。

ファイル名検索

カレントディレクトリを起点に、<file>という名前のファイルを検索してヒットした場合は絶対パスを表示します。

find ./ -name  <file>
ex) find ./ -name test ... カレントディレクトリを起点にtestファイルを検索します

また、名前の一部として特定文字列<string>を持つファイルの検索も可能です。

find ./ -name <string>*
ex) find ./ -name test* ... カレントディレクトリを起点に先頭の文字列が「test」のファイルを検索します
find ./ -name \*<string>
ex) find ./ -name \*test ... カレントディレクトリを起点に後方の文字列が「test」のファイルを検索します

特定文字列を記述したファイルの検索

カレントディレクトリを起点に、文字列の<content>を記述したファイルを特定します。

find ./ -type f | xargs grep -s <content>
ex) find ./ -type f | xargs grep -s utakamo ... カレントディレクトリを起点に、"utakamo"という文字列を記載したファイルを特定します

【tarコマンド】アーカイブファイルの作成と展開

利用目的
複数のファイルやディレクトリを1つのアーカイブファイルとして作成したり、逆に展開するためのコマンドです。 解析対象のファームウェアのファイルやディレクトリをtarコマンドでアーカイブして、作業PCのローカル環境にダウンロードする際に 良く使用しています。

アーカイブファイルの作成

対象ファイル・ディレクトリ<file or directory>のアーカイブファイルを <archive file>という名前で作成します。

tar cf <archive file> <file or directory> ...
ex) tar cf archive.tar /tmp ... /tmpディレクトリのアーカイブファイルをarchive.tarという名前で作成する

アーカイブファイルを作成して圧縮する場合

以下のコマンドオプションでアーカイブファイルの作成と圧縮を同時に実行可能です。 配布データとして良く見る形式のfile.tar.gzが作成されます。

tar zcvf <archive file> <file or directory> ...
ex) tar zcvf archive.tar.gz /tmp ... /tmpディレクトリのアーカイブファイルをarchive.tar.gzという名前で作成し圧縮します

gz形式のファイルはtar -xzvf archive.tar.gzのようにして展開(解凍)することができます。

アーカイブファイルの展開

<archive file>という名前のアーカイブファイルを展開します。

tar xf <archive file>
ex) tar xf archive.tar ... archive.tarという名前のアーカイブファイルを展開する

【cutコマンド】特定文字列の抽出

利用目的
あるコマンドの出力結果から欲しい情報のみを抽出したいときに良く使用します。 bashスクリプトやその他プログラムコードの中で使用したりもします。

特定のコマンドcmdの実行結果をcutコマンドにパイプして、 指定区切り文字delimiterで抽出した文字列のまとまり(フィールドfield) の出現順番を指定することで目的とする文字列を出力します。

<cmd> | cut -d <delimiter> -f <filed>

例えば、ifconfigコマンドの結果から指定インタフェース(例:et0)のIPアドレスを抽出するには以下のように実行します。 (ifconfigコマンドは出力結果が複数行になるのでgrepコマンドで抽出したいIPアドレスが記述された行を特定しています。)

ifconfig eth0 | grep 'inet ' | cut -d 'i' -f 2 | cut -d ' ' -f 2

AIによる支援の活用

chatgptに代表されるAIを用いてcutコマンドによる文字列抽出の実行パターンを教えてもらうのも手です。 私たちとしてはAIの提示内容を検証するための知識(cutコマンドの基礎的な使い方)を押さえておけば良いと思います。

【awkコマンド】列単位で抽出・条件判定

利用目的
空白区切りやCSV形式などのテキストを、列(フィールド)単位で抽出・整形・条件判定したいときに使用します。

基本形は次の通りです。patternに一致する行に対して actionを実行します。

<cmd> | awk '<pattern> { <action> }'
ex) ip -4 -br addr | awk '{print $1, $3}' ... インタフェース名とIPアドレスのみを表示

条件付きで行を抽出する例です。以下はCPU使用率(3列目)が10%を超えるプロセスのみを表示します。

ps aux | awk '$3 > 10 {print $2, $3, $11}'

AIによる支援の活用

AIに「この出力からawkで第2列と第5列だけ抜きたい」のように相談すると、 実行パターンのたたき台を短時間で得られます。最終的には自身で列番号や条件式の妥当性を確認してください。

【sedコマンド】置換・削除などの一括編集

利用目的
テキストの置換・削除・抽出などを非対話でまとめて実行したいときに使用します。 ログ整形や設定ファイルの軽微な修正で便利です。

次はこの節で使用するsample-config.txtの例です。

# sample-config.txt
api_url=http://example.local
retry=3
debug=true
# temporary note
log_level=info

まずは置換の基本形を覚えると使いやすいです。

sed 's/<before>/<after>/g' <file>
ex) sed 's/http:/https:/g' sample-config.txt ... sample-config.txt内のhttp:をhttps:へ置換して表示

上記ファイルのapi_urlに含まれるhttp:https:へ置換して表示する例は次の通りです(表示のみでファイルは更新しません)。

sed 's/http:/https:/g' sample-config.txt

上記ファイルのコメント行(先頭が#)を除外したい場合は次のように実行できます。

sed '/^#/d' sample-config.txt

ファイルを直接更新する場合は-iオプションを使います。 次はlog_level=infolog_level=warnへ書き換える例です。

sed -i 's/log_level=info/log_level=warn/g' sample-config.txt

AIによる支援の活用

sedの正規表現は記号が多く複雑になりやすいため、AIに案を出してもらってから 小さな入力ファイルで検証して本番ファイルへ適用する流れが安全です。

【wcコマンド】テキストの詳細情報の表示

利用目的
テキストファイルの行数・単語数・バイト数を素早く確認したいときに使用します。 ログ件数の把握や、抽出結果の件数確認でよく使います。

基本的な使い方は次の通りです。

wc <file>
ex) wc access.log ... access.logの行数・単語数・バイト数を表示
wc -l <file>
ex) wc -l access.log ... access.logの行数のみ表示

パイプと組み合わせることで、条件に一致した行の件数確認もできます。

grep ERROR app.log | wc -l
ex) app.log内のERROR行数をカウント

【mountコマンド】リムバーブルメディアのマウント

利用目的
USBメモリなどのリムバーブルメディアのデバイスファイル(例:/dev/sdb1)を特定のファイルシステムに紐づける(マウントする)ことで、 そのデバイスが持つデータの読み書きできるようになります。これはUSBメモリなどに入れたテキストファイルをLinux OS上で 開くための前処理です。

通常、リムバーブルメディアをデバイスに挿入すると、/devディレクトリ直下にsdb1などの疑似デバイスファイルが作成されます。 対応させたいファイルシステム(/media/sdb1)を引数に以下のようにすることで/media/sdb1でそのデバイスを操作することが可能です。

mount /dev/sdb1 /media/sdb1
オプション意味
-tファイルシステムのタイプ指定(指定しない場合は/etc/fstabに基づく自動検出)
-r読み込み専用でマウント
-w書き込み専用でマウント

マウント済みデバイスの確認

mount

【unmountコマンド】リムバーブルメディアのアンマウント

利用目的
リムバーブルメディアをマウントを解除します。USBメモリなどのリムバーブルメディアを安全に取り外すための前処理です。

次のように、リムバーブルメディアがマウントされているディレクトリ(例:/media/sdb1)を指定します。

umount /media/sdb1

コマンドの実行が成功したら、リムバーブルメディアを取り外すことができます。

【grepコマンド】文字列の検索

利用目的
テキストファイルやコマンド実行結果から、特定の文字列を含む行だけを抽出します。

grep -n <keyword> <file>
ex) grep -n TODO todo.md ... todo.mdの中からTODOを含む行番号付きで表示

【sort / uniqコマンド】並び替えと重複整理

利用目的
重複の多いデータを整理するときに、sortで並び替えてからuniqで集計します。

cat access.log | sort | uniq -c | sort -nr
ex) access.log内の同一行の出現回数を多い順に表示

以下はサンプルファイルを作成して、sortuniqの効果を確認する例です。

cat > sample-users.txt << 'EOF'
alice
bob
alice
carol
bob
alice
EOF

sort sample-users.txt
sort sample-users.txt | uniq -c
sort sample-users.txt | uniq -d

実行結果の一例は次の通りです。uniqは隣接行を比較するため、先にsortで並び替えておくのがポイントです。

alice
alice
alice
bob
bob
carol

      3 alice
      2 bob
      1 carol

alice
bob

【head / tail / lessコマンド】長い出力の確認

利用目的
長いログやコマンド結果を先頭・末尾・ページ単位で効率的に確認します。

head -n 20 syslog
tail -n 50 syslog
tail -f syslog
less syslog

【teeコマンド】表示しながら保存

利用目的
標準出力を画面表示しつつ、同じ内容をファイルにも保存します。

ip -4 -br addr | tee ip-addr.txt
ex) IP情報を表示しながらip-addr.txtへ保存

【du / dfコマンド】ディスク使用量の確認

利用目的
duはディレクトリ単位、dfはファイルシステム単位で使用量を確認します。

du -sh *
df -h

【ps / pgrep / pkillコマンド】プロセス管理

利用目的
実行中プロセスの確認、対象プロセスの特定、停止までをCLI上で行います。

ps aux | grep sshd
pgrep -a sshd
pkill -f <pattern>

pkill -fは、プロセス名ではなく「コマンドライン全体」に対して <pattern>をマッチさせて停止します。 パターンが広いと意図しないプロセスまで停止するため、先にpgrep -afで一致対象を確認してから実行するのが安全です。

pgrep -af <pattern>
pkill -f <pattern>
ex) pgrep -af "python3 .*worker.py" で確認後、pkill -f "python3 .*worker.py" で停止

通常終了しない場合は最終手段として-9(SIGKILL)を使います。

pkill -9 -f <pattern>

【systemctl / journalctlコマンド】サービス管理とログ確認

利用目的
systemd環境でサービスの起動状態やログを確認し、障害切り分けに使います。

systemctl status ssh
journalctl -u ssh -n 100 --no-pager

【rsyncコマンド】差分コピー

利用目的
変更差分だけを転送するため、バックアップや同期処理を効率よく実施できます。

rsync -av --delete ./src/ ./backup/src/
ex) srcディレクトリをbackup/srcへ同期(削除差分も反映)

【lnコマンド】シンボリックリンクの作成

利用目的
別ディレクトリにあるファイルやディレクトリへの参照を、別名で作成したいときに使用します。 シンボリックリンクは参照先パスを保持する特殊ファイルで、ショートカットのように扱えます。

ln -s <target> <link-name>
ex) ln -s /var/log/nginx/access.log ./access.log ... カレントディレクトリにaccess.logというリンクを作成

作成したリンクはls -lで確認できます。 矢印(->)の右側が参照先です。

ls -l <link-name>
ex) ls -l access.log ... access.log -> /var/log/nginx/access.log のように表示

リンクのみ削除したい場合はrm <link-name>を実行します。 通常は参照先本体は削除されません。

補足

参照先が削除・移動されるとリンク切れになります。 運用用途で使う場合は、相対パスより絶対パスでリンクを作成する方が管理しやすいです。

ハードリンクとの違い

ln -sは参照先パスを保持するシンボリックリンクを作成しますが、 lnは同じinodeを共有するハードリンクを作成します。 ハードリンクは基本的に同一ファイルシステム内でのみ作成でき、通常はディレクトリには作成しません。

ln <target-file> <hardlink-name>
ex) ln ./report.log ./report.log.bak ... report.logのハードリンクを作成

元のファイル名を削除しても、別名のハードリンクが残っていれば実体データは残ります。 ただし、どちらも同じ実体を指すため、片方の編集内容はもう片方にも反映されます。

BusyBoxとの関係

組み込みLinuxでよく使われるBusyBoxは、1つの実行ファイルを コマンド名ごとのリンクで使い分ける(マルチコール)構成が一般的です。 環境によってシンボリックリンクまたはハードリンクで配置され、 リンクがある環境ではechoとして呼び出せます。 リンクがない場合でもbusybox echoの形式で実行できます。

【jqコマンド】JSONの整形と抽出

利用目的
APIレスポンスやJSON設定ファイルを見やすく整形し、必要なキーだけを抽出します。

次はこの節で使用するsample.jsonの例です。

{
  "service": "web-api",
  "version": "1.0.0",
  "items": [
    { "id": 1, "name": "alpha", "enabled": true },
    { "id": 2, "name": "beta",  "enabled": false },
    { "id": 3, "name": "gamma", "enabled": true }
  ]
}
cat sample.json | jq .
cat sample.json | jq '.items[] | .name'

実行結果の一例は次の通りです。jq .でJSON全体を整形表示し、 jq '.items[] | .name'で配列itemsの各要素から nameだけを抽出できます。

kamo@kamo:~$ cat sample.json | jq .
{
  "service": "web-api",
  "version": "1.0.0",
  "items": [
    {
      "id": 1,
      "name": "alpha",
      "enabled": true
    },
    {
      "id": 2,
      "name": "beta",
      "enabled": false
    },
    {
      "id": 3,
      "name": "gamma",
      "enabled": true
    }
  ]
}
kamo@kamo:~$ cat sample.json | jq '.items[] | .name'
"alpha"
"beta"
"gamma"