Fish の abbr を使いこなす @データ解析環境
sed
や awk
コマンドをよくお使いになる方,
$ cat data.csv | sed 's/AAA/BBB/g'
$ cat data.csv | awk -F, '{print $1}'
の sed 's///g'
や awk -F, '{}'
って,毎回打つのが面倒ではありませんか?
Fish シェルの abbr (abbreviation)
機能を使うと,これらの決まりきったフレーズを自動展開することができます.本稿では,fish shell に導入された abbr
(abbreviation) の機能を紹介し,データ解析環境におけるターミナル操作の高速化を目指します.
abbr (abbreviation) とは
abbr
(abbreviation) とは,fish shell に導入された alias
に変わる機能です.
alias
も abbr
もコマンドに別名(ショートカット名)を付ける点は同じですが,abbr
はコマンドを展開します.例えば,~/zenn
というディレクトリに移動するショートカットを alias
と abbr
でそれぞれ zenn1
, zenn2
という名前で定義します.
$ alias zenn1 "cd ~/Desktop"
$ abbr zenn2 "cd ~/Desktop"
alias
の方は zenn1
というコマンドのまま実行され,history にも zenn1
が残ります.
一方 abbr
の方は <Space>
, <Enter>
キーを押すとコマンドが展開され,展開したコマンドを編集できます.history には展開されたコマンドが残ります.
詳しくはこちら:[fish] 展開されるalias - abbr
全体像
fish の設定ファイル ~/.config/fish/config.fish
に下記を書き込みます.
# コマンドの色を変える
fish_config theme choose "ayu Dark"
# 設定ファイルの編集・反映
abbr -a vc vi ~/.config/fish/config.fish
abbr -a sc source ~/.config/fish/config.fish
# UNIXコマンド(1)
abbr -a head head -n5
abbr -a tail tail -n5
abbr -a c clear
abbr -a t htop # htop is a modern replacement of top
abbr -a wc wc -l
abbr -a h "history | grep"
# UNIXコマンド(2)
abbr -a sed --set-cursor "sed 's/%//g'"
abbr -a awk --set-cursor "awk -F, '{print \$1%}'"
abbr -a cnt "awk -F, '{cnt[\$1]++}END{for(i in cnt)print i,cnt[i]}'"
abbr -a header --set-cursor "head -n1 % | awk -F, '{for(i=1;i<=NF;i++)print i,\$i}' | column -t"
# 言語系コマンド
abbr -a g g++ -std=c++17 -O3
abbr -a j jupyter lab
abbr -a p python
# SSH
abbr -a host1 ssh host1
# ディレクトリ移動(+移動後 `ls`)
abbr -a data "cd ~/prj1/data; eza --icons"
abbr -a src "cd ~/prj1/src; eza --icons"
abbr -a fig "cd ~/prj1/figure; eza --icons"
# eza (modern replacement of "ls")
if command -q eza
abbr -a ls eza --icons
abbr -a ll eza --icons -lhag
abbr -a lt eza --icons --tree
end
# [macos] クリップボードへのコピー
if command -q pbcopy
abbr -a pbc pbcopy
end
コマンドの色を変える
abbr
の前に,コマンドの色を変えましょう.Fish はデフォルトのコマンドの色が青で,黒背景では視認性が悪いです.ただし,コマンドのテーマは fish_config theme choose <テーマ名>
コマンドで変更できます.標準で利用できるテーマは fish_config theme list
で確認できます.個人的には ayu Dark
と Dracula
が好きです.
fish_config theme choose "ayu Dark"
サンプル:上から順に ayu Dark
, fish default
, Dracula
, ayu Dark
テーマの特徴
-
ayu Dark
: 落ち着いた色合い -
Dracula
: ハイコントラストで読みやすい
設定ファイルの編集・反映
コマンドを爆速で展開する前に,その設定を書き込むファイルへのアクセスと変更の反映の手間を減らしたいところです.そこで,Fish の設定ファイル ~/.config/fish/config.fish
を編集・反映の abbr
を用意します.
abbr -a vc vi ~/.config/fish/config.fish
abbr -a sc source ~/.config/fish/config.fish
-
-a
,--add
オプションはなくても良いです
UNIXコマンド (1)
abbr -a head head -n5
abbr -a tail tail -n5
abbr -a c clear
abbr -a t htop # htop is a modern replacement of top
abbr -a wc wc -l
abbr -a h "history | grep"
- head/tail はデフォルトで10行分出力するが,5行で十分(
pandas
と揃える) - 頻繁に使うコマンドは一文字で置換
-
wc
は行数を数えるためにしか使わないので,-l
オプションを自動で追加 -
history | grep <コマンド名>
は過去に使用したコマンドを検索したい場合に使う
UNIXコマンド (2)
abbr -a sed --set-cursor "sed 's/%//g'"
abbr -a awk --set-cursor "awk -F, '{print \$1%}'"
abbr -a cnt "awk -F, '{cnt[\$1]++}END{for(i in cnt)print i,cnt[i]}'"
abbr -a header --set-cursor "head -n1 % | awk -F, '{for(i=1;i<=NF;i++)print i,\$i}' | column -t"
-
sed
/awk
には決まった書き方があるので,それを自動展開 -
%
の位置にカーソルを移動 -
cnt
は列の要素数を数えるコマンドで,Python の pandas.Series.value_counts に対応.END
のfor
文でprint i
のみにすれば列の uniq を取れる. -
header
は列名を列番号とセットで表示するコマンドです.awk
で列番号を指定する時に役立ちます.header
で興味のある列の番号を取得し,cnt
で要素数カウントやユニーク要素を取得する流れはよく使います.
# head<space> で -n5 を自動展開
$ head -n5 JPvideos.csv
video_id,trending_date,title,channel_title,category_id,publish_time,tags,views,likes,dislikes,comment_count,thumbnail_link,comments_disabled,ratings_disabled,video_error_or_removed,description
5ugKfHgsmYw,18.07.02,陸自ヘリ、垂直に落下=路上の車が撮影,時事通信映像センター,25,2018-02-06T03:04:37.000Z,"事故|""佐賀""|""佐賀県""|""ヘリコプター""|""ヘリ""|""自衛隊""|""墜落""|""落下""|""現場""|""神埼市""|""ドライブレコーダー""",188085,591,189,0,https://i.ytimg.com/vi/5ugKfHgsmYw/default.jpg,TRUE,FALSE,FALSE,佐賀県神埼市の民家に墜落した陸上自衛隊のAH64D戦闘ヘリコプターが垂直に落下する様子を、近くにいた車のドライブレコーダーが捉えていたことが6日分かった。\n 現場の南から撮影された映像では、東から西に飛行するヘリが突然、機首を下に向けてきりもみ回転するように落下。ヘリの急降下と同時に、機体の一部とみられる物体が落ちていく様子も映っていた。\n 録画した佐賀城北自動車学校(佐賀市)によると、撮影場所は現場から約1.5キロメートル南の神埼市内の路上。時間調整のため停車していた送迎車のドライブレコーダーに、偶然映り込んでいたという。佐賀城北自動車学校提供。【時事通信映像センター】
ohObafdd34Y,18.07.02,イッテQ お祭り男宮川×手越 巨大ブランコ②,神谷えりな Kamiya Erina 2,1,2018-02-06T04:01:56.000Z,[none],90929,442,88,174,https://i.ytimg.com/vi/ohObafdd34Y/default.jpg,FALSE,FALSE,FALSE,
aBr2kKAHN6M,18.07.02,Live Views of Starman,SpaceX,28,2018-02-06T21:38:22.000Z,[none],6408303,165892,2331,3006,https://i.ytimg.com/vi/aBr2kKAHN6M/default.jpg,FALSE,FALSE,FALSE,
5wNnwChvmsQ,18.07.02,東京ディズニーリゾートの元キャストが暴露した秘密5選,アシタノワダイ,25,2018-02-06T06:08:49.000Z,アシタノワダイ,96255,1165,277,545,https://i.ytimg.com/vi/5wNnwChvmsQ/default.jpg,FALSE,FALSE,FALSE,東京ディズニーリゾートの元キャストが暴露した秘密5選\n\nかたまりクリエイトさま\n【検証】ディズニーランドでキャストさんをナンパ出来るのか?\nhttps://www.youtube.com/watch?v=sCHIFCMZAT8&t=225s\n\nディズニーよりジャイアンツ。まいです。\n\n今回は東京ディズニーランドの元キャストが暴露した秘密を5つ、ご紹介します。\n\nもくじ\n1.ピース禁止 \n2.ナンパ対応\n3.禁止事項\n4.待遇\n5.キャストの特典\n\n引用:\nhttp://urx.red/IoZO\nhttps://www.photo-ac.com/\nhttp://hennae.net/?p=2445\n\n音楽引用(フリー音源):\n魔王魂 http://maoudamashii.jokersounds.com/\nDOVA-SYNDROME https://dova-s.jp\n\n著作権等、動画に問題がある場合はこちらにご連絡いただければ\n改善・修正させていただきます。\n編集の腕が悪くたくさんのご指摘を頂いております。\nより悪いものから順次修正させていただきます事をご了承ください。\njustoyakudachi@gmail.com
# header と打つと下記コマンドの JPvideos.csv 部分以外が展開される.
# しかも,ファイル名の箇所にカーソルが移る
$ head -n1 JPvideos.csv | awk -F, '{for(i=1;i<=NF;i++)print i,$i}' | column -t
1 video_id
2 trending_date
3 title
4 channel_title
5 category_id
6 publish_time
7 tags
8 views
9 likes
10 dislikes
11 comment_count
12 thumbnail_link
13 comments_disabled
14 ratings_disabled
15 video_error_or_removed
16 description
言語系コマンド
abbr -a g g++ -std=c++17 -O3
abbr -a j jupyter lab --port 38888
abbr -a p python
abbr -a b bash
-
C++
はコンパイルのコマンドを書くのが面倒ですよね.
c++17
を使っているのはmap
の範囲 for 文を使うためです. - サーバー上の指定ポートで jupyter を立て,port forwarding してローカルのブラウザで jupyter を開く,という操作が必要になる時があります.基本的にサーバーには vscode の RemoteSSH で入りますが,たまに vscode のノートブックファイルで動作しないプログラム(インタラクティブな可視化など)があるためです.
- ターミナル操作には
fish
を使い,シェルスクリプトはbash
で書いています
SSH 接続
abbr -a host1 ssh host1
ls
→ eza
ls
の代わりに,よりフレンドリーな eza コマンドを使っています.
機能は ls
と同じですが,下記のような良さがあります.
- 最初からカラフル.
ls -l/ll
コマンドはディレクトリの色を青で表示しますが,黒背景では視認性が悪いです.LSCOLORS
を指定して色を変えることもできますが,更なる利便性を追求してコマンドごと入れ替えてしまいましょう.参考:lsコマンドの色を変更する -
ls -l
(list表示) で header を付けられる - ファイルの拡張子に対応したアイコンを表示できる(nerd font を入れる必要あり)
- tree 表示に対応
ただ,これらを実現するために ls
よりも長いコマンドを打たなければなりません.そこで,ls
コマンドで eza
コマンドを展開するよう abbr
を設定します.
# eza (modern replacement of "ls")
if command -q eza
abbr -a ls eza --icons
abbr -a ll eza --icons -lhag
abbr -a lt eza --icons --tree
end
-
nerd font を導入しない場合は
--icons
オプションを消してください.
Nerd font を導入したい方で,たくさんある nerd font の中でどれを選ぶか迷う場合は FiraCode Nerd Font をオススメします. -
if command -q eza
はeza
コマンドが存在するかを判定します.
eza
は標準搭載されているコマンドではないので,他の環境へ移植しやすいよう配慮しています.
ディレクトリ移動
よく利用するディレクトリへの移動(+移動後 ls
)
abbr -a data "cd ~/prj1/data; eza --icons"
abbr -a src "cd ~/prj1/src; eza --icons"
abbr -a fig "cd ~/prj1/figure; eza --icons"
- データ解析環境ではプロジェクト内の特定のディレクトリへの移動
- 私用 PC ではデスクトップやダウンロード等への移動
クリップボードへのコピー (macos)
if command -q pbcopy
abbr -a pbc pbcopy
end
- ワンライナーの最後に付けることが多い
まとめ
Fish の abbr
を使いこなすことで,ターミナル操作の手間・ストレスを大幅に減らすことができます.また,ちょっとしたデータの確認であれば python よりも早く実行できるようになります.abbr
を積極的に活用していきましょう.
Discussion