🍣

Fish の abbr を使いこなす @データ解析環境

2024/06/21に公開

sedawk コマンドをよくお使いになる方,

$ 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 に変わる機能です.

aliasabbr もコマンドに別名(ショートカット名)を付ける点は同じですが,abbr はコマンドを展開します.例えば,~/zenn というディレクトリに移動するショートカットを aliasabbr でそれぞれ 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 に下記を書き込みます.

~/.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 DarkDracula が好きです.

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 に対応.ENDfor 文で 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

lseza

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 ezaeza コマンドが存在するかを判定します.
    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