UNIX系コマンド備忘録

2016-07-14   (Updated : 2020-03-29)

※ 普段 Mac で生活しているので、Mac 前提です

リダイレクト

出力先によって分ける

# 1 : 標準出力
# 2 : 標準エラー出力
$ {Command} 1> stdout.txt 2> stderr.txt

※ 番号の省略は標準出力を意味する

エラーも含めてファイルに出力

  • 2>&1 で 2 を 1 に入れる
$ {Command} > out.txt 2>&1

画面に出力しつつファイルにも吐く

$ {Command} 2>&1 | tee log.txt

検索

文字列検索 : ag

ファイルサイズの大きいディレクトリを探す

  • -d で深さ指定
$ du -m -x -d 2 ~/Desktop | sort -n

プロセス

プロセス確認

# 全部出力して grep
$ ps aux | grep hoge

# ユーザで絞り込む(ww は改行して出力が切れないようにする)
# * Mac の場合は -u でなくて -U
$ ps uww -U user_name

ネットワーク

TCP ポート開いてるか確かめる

  • ICMP なら ping すれば十分だが
  • telnet でもよいけど開いてるか確認したいだけなら
$ nc -vz <host> <port>
$ nc -vz xx.xx.xx.xx 20-30  # 範囲指定も可

Mac の電波遮断

  • ゲームを作っていてローカルで手軽に電波遮断のテストをしたい時に使える
$ networksetup -setairportpower en1 off
$ networksetup -setairportpower en1 on

自分のグローバル ip アドレスを調べる

$ curl ipecho.net/plain; echo

SSH

鍵作成

$ ssh-keygen -t rsa -b 4096 -C "your-email@example.com" -f ~/.ssh/id_rsa
  • 4096 bit の RSA 鍵を作る例
    • (デフォルトの 2048 bit の強度が許容されるのは 2030 年までらしい)
  • -C は公開鍵の末尾につくコメント (デフォルトだとマシンのホスト名)
    • GitHub で使うメールアドレスなどにしておくと無難

公開鍵の fingerprint 確認

$ ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub
  • SSH-KEYGEN (1)
    • -l オプションで表示、-f オプションでファイル指定
    • 最近の表示形式は SHA256/base64 らしいので MD5/hex で見たい場合は -E オプションでフォーマット指定

文字列 / 文字コード

sed

# Mac 版 sed は -i の後にバックアップファイルの拡張子指定が必須
# (Linux 版だとバックアップ不要の場合は省略できる)
$ sed -i '.bak' -e 's/OLD/NEW/g' path/to/input_file

# -e は -f を指定しない場合は省略可能。
# (-f は編集コマンドを記述したスクリプトファイルの指定)

# バックアップ作らなくていい場合はこんな感じでよい
$ sed -i '' 's/OLD/NEW/g' path/to/input_file

複数ファイルの文字列一括置換

# find コマンドと連携
$ find ./ -name "*.cpp" | xargs sed -i '' 's/OLD/NEW/g'

# ag コマンドと連携
$ ag -l "Hoge" | xargs sed -i '' 's/OLD/NEW/g'

文字コードや改行コードを調べる

# Mac にはデフォルトで入ってないので
$ brew install nkf

$ nkf --guess FILE_NAME
  • od コマンド(Octal Dump)とかもある
$ od -c file.txt
# LF なら \n, CR なら \r, CRLF なら \r\n と表示

nkf による文字コード・改行コードの変更

例:

# -w : UTF-8  (BOM 付きは -w8)
# -Lw : Windows 形式の改行コード (CRLF)
$ nkf -w -Lw --overwrite file.txt

BOM なしの UTF-8 ファイルを一括で BOM 付きに変換

Unity の C# スクリプトを BOM 付きで統一したい時などに:

find path/to/Scripts -name *.cs | xargs nkf --overwrite --oc=UTF-8-BOM

時刻

# 現在時刻から 9 時間後の時刻を表示
$ date -v+9H

UTC → JST

  • date コマンドでサクっとやる方法無いのかな?
  • スクリプト言語で力技でやるなら:
$ php -r '$t = new DateTime("2016-07-13 12:00:00 UTC"); $t->setTimeZone(new DateTimeZone("Asia/Tokyo")); print $t->format("Y-m-d H:i:s")."\n"; '

2016-07-13 21:00:00

日時 → UNIXTIME

$ date +%s    # 現在時刻
1410416640

$ date -jf '%Y-%m-%d %H:%M:%S' '2014-09-11 15:24:00' +%s
1410416640

UNIXTIME → 日時

$ date -r 1410416640
2014年 9月11日 木曜日 15時24分00秒 JST

画像ファイル

画像サイズの一括変換

# 画像が置かれたディレクトリに移動して一括サイズ変換(横幅を揃える)
$ mkdir resampled
$ for file in *.jpg; do sips --resampleWidth 640 $file --out resampled/${file%.jpg}.jpg; done

# -Z オプションは縦横長い方を見てアスペクト比維持で縮小
# 縦向き・横向きの画像が混ざってるときに便利
$ sips -Z 640 *.jpg --out resampled/
  • ファイル名にスペースが含まれているとうまくいかないので注意

雑多

ファイルの MD5 をとる

# Mac なら標準で md5 コマンドがある
$ md5 hoge.txt
MD5 (hoge.txt) = d45ac056aeb47c6bcf5c56dc2b6d3d5c

# 上記の出力が気に入らないなら
$ brew install md5sha1sum
$ md5sum hoge.txt
d45ac056aeb47c6bcf5c56dc2b6d3d5c hoge.txt

Human readable を sort する

2009 年以降の Linux の sort には -h オプションという素敵なものがあるらしいが Mac でやるなら gsort を使う

$ brew install coreutils
$ du -sh * | gsort -h

Tips

サーバのログの改行文字を実際に改行させる

$ {Command} 2>&1 | perl -pe 's/\\n/\n/g'