2つのコマンドをパイプで繋いだときのパイプバッファをエディタで編集する方法

2023-03-27Bash,CentOS,Linux,Ubuntu,Vim

はじめに

以前 コマンド実行結果を Vim や Visual Studio Code で開く方法 というエントリで、あるコマンドの実行結果をエディタにわたすための方法を紹介しました。

今回はそれに関連したエントリです。

Linux には、「あるコマンドの ( 標準 ) 出力」を「別のコマンドの ( 標準 ) 入力」として渡すための方法として 「パイプ」 が用意されています。

例えば、 seq コマンドの実行結果を 2 行だけ抽出したい場合には、 head コマンドをパイプ (|)でつないで実行してやります。

# 1から5まで5行出力
$ seq 5
1
2
3
4
5

# seq 5 の実行結果から先頭2行を出力
$ seq 5 | head -n 2
1
2

ここで seq 5 の実行結果が、 head -n 2 に渡る前にエディタで加工する方法があります。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ head -n 2 /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

vipe コマンドでパイプバッファをエディタで編集する

パイプバッファをエディタで編集するツールとして、 vipe というツールがあります。

標準ではインストールされていませんので、自分でインストールする必要があります。

# RedHat系OSの場合
$ yum install -y moreutils

# macOSの場合
$ brew install moreutils

それでは編集してみます。

改めて、 seq コマンドの実行結果を head に渡し絞り込んでみます。

# 1から5まで5行出力
$ seq 5
1
2
3
4
5

# seq 5 の実行結果から先頭2行を出力
$ seq 5 | head -n 2
1
2

今度は vipe コマンドを使って、 seq コマンドと head コマンドのデータのやり取りの途中で、パイプバッファをエディタで編集してみます。

# vipe コマンドを間に挟む
$ seq 5 | vipe | head -n 2

使い方は vipe コマンドをパイプとパイプの間に挟んでやります。

実行すると以下のようにエディタが起動します。
エディタには、 vipe コマンドへの標準入力、つまり seq 5 の実行結果が表示されているはずです。

僕の環境では vi が起動していますが、こちらは EDITOR 環境変数を参照しているため、任意のエディタが設定可能です。
( export EDITOR=code も試しては見ましたが、VSCode が起動することは起動しますがパイプバッファの編集がうまくできませんでした。 )

今回はエディタで以下のような内容になるように編集し、 :wq で保存+終了してみます。

1
3
5

コマンド実行結果がコンソールに出力されます。

$ seq 5 | vipe | head -n 2
1
3

vipe で保存した結果を head -n 2 した結果、先頭 2 行だけが出力されました。

ひとこと

せっかくですが、あんまり使用することはないでしょうね。

fzf -m を使って、標準入力から任意行をいくつか選択したり、絞り込んだりすることはよくありますけどね。

$ seq 10 | fzf -m | awk '{ sum+=$1 } END { print sum }'

$ seq 10 | fzf -m | awk '{ sum+=$1 } END { print sum }'
9

2023-03-27Bash,CentOS,Linux,Ubuntu,Vim