2017-01-24

zshとか便利コマンドあれこれ

zshやら便利コマンドのあれこれ備忘録。alias書いたり.zshrc読み書きする用。

キーバインドを追加する

function fuga() {
# some code
}

zle -N fuga
bindkey '^Z' fuga

zle -Nで関数fugaをウィジェット登録して、bindkeyで登録したウィジェットをキーにバインドする。

ワイルドカードの展開をしない

noglob somecommand

$ ls * # ワイルドカードが展開される
file1 file2
$ noglob ls * # ワイルドカードが展開されない
ls: *: No such file or directory

文字列操作

文字列置換
echo 'hogehoge' | sed -e 's/hoge/fuga/g'
echo 'hogehoge' | perl -pe 's/hoge/fuga/g'

列で切り出し

echo 'hoge\tfuga' | awk '{ print $2 }'

条件切り出し

echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '/aa/p' # aaにマッチした行のみ表示
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '/aa/,/ddd/p' # aaにマッチした行からdddにマッチした行まで
echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -n '2,4p' # 2〜4行目を表示

条件削除

echo 'aaa\nbaa\ncdd\nddd\nedd' | sed -e '2,4d' # 2〜4行目を削除して表示

単純集計

echo '1\n2\n3\n4' | awk 'BEGIN{ sum = 0 } { sum += $1 } END{ print sum }'

条件集計

echo '1\n2\n3\n4' | awk 'NR > 2 { sum += $1 } END{ print sum }' # 2行目以降の集計

echo 'a 1\nab 2\ncc 3\nabd 4' | awk '$1~/ab/ { sum += $2 } END{ print sum }' # 正規表現にマッチしていた行だけ集計

aliasの定義とグローバルエイリアス

alias somename='somecommand'

-gをつけるとグローバルエイリアスでどこの個所に書いても動く

alias -g G='| grep'
echo 'hoge' G 'og' # => echo 'hoge' | grep 'og'

変数のsubstring

${var:index}
${var:index:length}

hoge='123456'
echo ${hoge:2:2}

変数計算

$((1+2))
expr 2 + 3 # 乗算の場合はnoglobてワイルドカード展開されないように注意

小数計算を含む場合はbcコマンドを使う

echo "1 + 2" | bc

小数点以下切り捨て

printf '%d' 123.456
echo 123.5001 | awk '{ printf "%d", $1 }'

四捨五入

echo 123.5001 | awk '{ printf "%d", ($1+0.5) }'

変数展開

# varが未定義 or 空文字であればdefaultの値を返し、そうでなければvarの値を返す
${var:-default}
# varが未定義 or 空文字であればdefaultの値を返しつつ、varに値を代入。そうでなければvarの値を返す。
${var:=default}

${var:=default}を使うときはそのままだと値が評価された後にコマンドとして再度評価されるので、何もしないコロンコマンドでエラーを回避すると良い

: ${hoge:="aaa"}

変数の文字列長

${#var}

setコマンド

引数を再セットできたり色々できる
set $(date '+%Y %m %d')
echo $1 # year
echo $2 # month
echo $3 # day

zshあれこれ

ZLE

キーバインドで関数を呼び出したときに、現在のzshに入力されているバッファの値を参照することができる
$ 1234567890 # カーソルに5を合わせてctrl-zを押す
BUFFER=1234567890
LBUFFER=1234
RBUFFER=567890
CURSOR=4

BUFFERを操作したり、入力値をみてショートカットキーの振る舞いを変えたりすることが可能。

.zshrc vs .zshenv

.zshrcは対話シェルで読み込まれるが、シェルスクリプトの実行時には読み込まれない。シェルスクリプト実行時にも読み込みたい場合は.zshenvに書く

zshでコメントを打つとbad patternと怒られる

hoge:1: bad pattern: #

この場合は、以下の設定を.zshrcなどに入れればOK

setopt interactivecomments

nocorrect

zshはタイポと思われる入力コマンドに対して正そうとしてくる。
$ nslooku
zsh: correct nslooku to nslookup [nyae]?

このお伺いを無効にするのがnocorrectコマンド

nocorrect somecommand

autoload

zshの関数を遅延読み込みする仕組み。ファイル名を関数名、ファイル内のスクリプトを関数の処理として関数が登録される。検索対象のディレクトリは環境変数FPATHで管理される。
autoload -U compinit

はcompinitという補完をする関数を遅延読み込みしてくれる(Uオプションを付けるとaliasの展開をしない=自分の作ったaliasが関数内に干渉することがなくなる)

PROMPT

プロンプトを変更したい場合はPROMPT変数をいじるとか環境変数ベースで色々できる。

ビルトインコマンド

コマンドの有無

$commands => パスの通ってるコマンドのハッシュ

$commands[command_name] => コマンドのパス

$+commands[command_name] => パスの通ってるコマンドが存在すれば1、そうでなければ0

その他便利なコマンド

expect

対話シェルでの各入力を自動化できる。vagrantだとこんな感じで書ける
expect -c "
set timeout 200
spawn vagrant up
expect \"Password:\"
send \"${PW}\n\"
expect eof exit
"

jq

json操作を色々やるコマンド。使い方は省略。

nkf

文字エンコードを操作するコマンド

urlエンコード

echo "テスト" | nkf -WwMQ # UTF-8で読み込んで(W)、quotedなMIMEエンコード(MQ)してUTF-8で出力する(w)
urlデコード
echo "%E3%83%86%E3%82%B9%E3%83%88" | tr % = | nkf -WwmQ # UTF-8で読み込んで(W)、quotedなMIMEデコード(mQ)してUTF-8で出力する(w)
echo "%E3%83%86%E3%82%B9%E3%83%88" | nkf -w --url-input # URLデコードして(--url-input)、UTF-8で出力(w)

base64

文字通りbase64エンコード、デコードするコマンド
echo "hoge" | base64 # encode
echo "aG9nZQo=" | base64 -d # decode

peco

インクリメンタルサーチをするコマンド。これとkeybind、alias、function、各種文字列操作を組み合わせるとめっちゃ捗る。

たとえばこんな感じで書くとディレクトリをインクリメントサーチして選択したディレクトリに移動できる。

cd $(find . -maxdepth 1 -type d | peco)

keybind+ZLEの変数と組み合わせると更に便利

peco --query ${LBUFFER} # --queryはデフォルトの検索文字列

xargs

標準入力を引数に展開するコマンド。使い方は省略。

pbcopy

macOS限定コマンド。標準入力をクリップボードにコピーする。Clipy等のクリップボードアプリと組み合わせると更に便利。

GNUのdate

N日前とかの設定が簡単にできるので便利
date --date '1 day ago' '+%Y/%m/%d'

参考URL

このエントリーをはてなブックマークに追加