コマンドライン処理チートシート

  • 同じことを2度ググらないための備忘録
  • 簡単なことでも2週間叩かないと意外にアレっとなる
  • そのやり方、ダサいよ、という指摘がある方はブコメで悪口を書くか、ブログのコメント欄で教えてください

もくじ

基本構文

数値比較条件

  • test <value> (-eq|-gt|-lt|-ge|-le) <value>
  • [ <value> (-eq|-gt|-lt|-ge|-le) <value> ]
$ #=> 10 == 10
$ if [ 10 -eq 10 ]; then echo true; else echo false; fi
true
$ if test 2 -eq 10; then echo true; else echo false; fi
false

文字比較条件

  • test <value> (==|!=) <value>
  • [ <value> (==|!=) <value> ]
$ if [ "abc" == "abc" ]; then echo true; else echo false; fi
true
$ if [ "abc" == "def" ]; then echo true; else echo false; fi
false
$ if [ "abc" != "def" ]; then echo true; else echo false; fi
true

数値計算

整数の計算

$ echo $((1 + 2 - 3 * 4))
-9

expr を使うという方法もある

小数の計算

awk を使う方法

$ echo "" | awk '{print 1 + 2 - 3 * 4 / 5}'
0.6

bc を使う方法

$ echo "scale=2; 1 + 2 - 3 * 4 / 5" | bc
.60

jq を使う方法

$ jq -n "1 + 2 - 3 * 4 / 5"
0.6000000000000001

時刻計算

時刻 => unixtime

# 現在時刻の unixtime
$ date +&s
1556175641

# 特定時刻の unixtime
$ date --date '2019-04-24 10:46:30+00:00' +%s
1556102790

unixtime => 時刻

# unixtime から日時表記へ
$ date --date "@1556175641"
Thu Apr 25 16:00:41 JST 2019

ISO8601 形式へ

$ date --iso-8601=seconds
2019-04-25T16:05:20+09:00

タイムゾーン計算

$ TZ=UTC date --iso-8601=seconds
2019-04-25T07:05:40+00:00

echo

改行コードを含む文字列の出力

$ echo -e "1\n2\n3\n4\n5\n"
1
2
3
4
5

改行しない

-n オプション

$ echo -n hoge; echo fuga
hogefuga

cat

ヒアドキュメント

$ cat << eos
> 1
> 2
> 3
> 4
> 5
> eos
1
2
3
4
5

awk

列の抽出

$ echo 1 2 3 4 5 | awk '{print $3}'
3

行の抽出

$ echo -e "A\nB\nC\nD\nE\n" | awk 'NR==3'
C

CSV の処理

$ cat csv.csv
taro,16,100
jiro,14,200
saburo,11,300

$ #=> 列の抽出
$ cat csv.csv | awk -F, '{print $2}'
16
14
11

$ #=> 列を抽出して合計値/平均値計算
$ cat csv.csv | awk -F, '{sum2+=$2; sum3+=$3;} END {printf("sum: %s, %s\n", sum2, sum3)}'
sum: 41, 600
$ cat csv.csv | awk -F, '{sum2+=$2; sum3+=$3;} END {printf("average: %s, %s\n", sum2/NR, sum3/NR)}'
average: 13.6667, 200

nkf

URL エンコード

$ echo 'あいうえお' | nkf -WwMQ | tr = %
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

URL デコード

$ echo 'あいうえお' | nkf -WwMQ | tr = %
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A

$ echo '%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A' | nkf --url-input
あいうえお

jq

整形しない

-c オプション

$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq
{
  "members": [
    "cocoa",
    "chino",
    "rize"
  ]
}
$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq -c
{"members":["cocoa","chino","rize"]}

単純なフィールドの取り出し

$ echo '{"key": "value"}' | jq '.key'
"value"

文字列のダブルクオートを外す

-r オプション

$ echo '{"key": "value"}' | jq -r '.key'
value

配列を剥がす

$ echo '{ "members": ["cocoa", "chino","rize"] }' | jq '.members[]'
"cocoa"
"chino"
"rize"

配列につっこむ

-s オプション

$ echo '{}' | jq -s
[
  {}
]

配列の長さを取得

length でできる

$ echo '[1,2,3,4,5,6,7]' | jq 'length'
7

配列のマップ

$ echo '[1,2,3,4,5,6,7]' | jq '.[] + 1'
2
3
4
5
6
7
8

$ echo '[1,2,3,4,5,6,7]' | jq 'map(. | tostring) | map("[" + . + "]")'
[
  "[1]",
  "[2]",
  "[3]",
  "[4]",
  "[5]",
  "[6]",
  "[7]"
]

値がマッチ|部分一致する要素をフィルター

select(<key> | <test|contains>(<value>)) でできる

$ cat /tmp/ex.json
{
  "members": [
    {
      "id": 1,
      "name": "cocoa"
    },
    {
      "id": 6,
      "name": "chino"
    },
    {
      "id": 3,
      "name": "rize"
    }
  ]
}

$ cat /tmp/ex.json | jq '.members[] | select(.name | contains("ch"))' | jq -s
[
  {
    "id": 6,
    "name": "chino"
  }
]

ソート

$ cat /tmp/ex.json
{
  "members": [
    {
      "id": 1,
      "name": "cocoa"
    },
    {
      "id": 6,
      "name": "chino"
    },
    {
      "id": 3,
      "name": "rize"
    }
  ]
}

$ cat /tmp/ex.json | jq '.members | sort_by(.id)'
[
  {
    "id": 1,
    "name": "cocoa"
  },
  {
    "id": 3,
    "name": "rize"
  },
  {
    "id": 6,
    "name": "chino"
  }
]

複数の素の JSON を配列に突っ込む

$ cat /tmp/json
{"a":1,"b":5}
{"a":2,"b":4}
{"a":3,"b":3}
{"a":4,"b":2}
{"a":5,"b":1}

$ cat /tmp/json | jq -s
[
  {
    "a": 1,
    "b": 5
  },
  {
    "a": 2,
    "b": 4
  },
  {
    "a": 3,
    "b": 3
  },
  {
    "a": 4,
    "b": 2
  },
  {
    "a": 5,
    "b": 1
  }
]

特定のキーを置換

$ cat /tmp/json 
{"a":1,"b":5}

$ cat /tmp/json | jq '.a = true'
{
  "a": true,
  "b": 5
}

簡単なスクリプト作成時によく書くもの

dev/prod ステージ選択

ARG1=$1
if [ $# -ne 1 ] || [[ ! $ARG1 =~ ^(prod|dev)$ ]]; then
  echo "usage: ./deploy [prod|dev]"
  exit 1
fi

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください