長大なログファイルから特定の行だけを見たい。
そんな時にheadやtailコマンドを組み合わせて特定の行のみを抽出して閲覧することはよくあるだろう。
でもめんどくさい。
「長大なログファイルの12267行目から12504行目まで欲しい」
それをheadとtailで実現すると次のようになる。
head -n 12504 very_long.log | tail -n 237
すぐに引き算ができただろうか?
僕にはできなかった...
(暗算は苦手なのだ...)
計算が手間ならexprコマンドを使う技もある。
head -n 12504 very_long.log | tail -n $(expr 12504 - 12267)
長い!!!
たかだかログファイルの一部を抽出するのにこんなに長々とコマンドを打つのは辛い...
もっと簡単にログファイルの一部のみを抽出する方法はないものか...
それこそPythonのスライス(slice)構文のように、どの行からどの行までという指定はできないものか...
はい、ないなら作れば良いですね!
作りました。
sliceで「12267行目から12504行目まで欲しい」を実現すると次のようになる。
slice 12267:12504 very_long.log
シンプル!!!
先程のhead,tail,exprの組み合わせと比べるとどうだろう?
head -n 12504 very_long.log | tail -n $(expr 12504 - 12267)
slice 12267:12504 very_long.log
シンプル!!!圧倒的にシンプル!!!!
パッと見で何をやりたいかも自明です!
というわけで以下インストール方法
インストール方法
Rust製なのでcargoでインストール
cargo install slice-command
cargoのインストールはこちらから
一応、Mac,Linuxユーザーであればhomebrewでもインストールできるようにはしているが、cargoでのインストールを推奨
brew install chantsune/tap/slice
使い方
slice [オプション] <slice> <file...>
<file>
はスライスを適用したいファイルのパス、<slice>
はファイルに適用したいスライス構文。
<file>
が指定されていない場合、slice
は標準入力から読み込む。
スライス構文は、Pythonのスライス構文に似ており、start:end:step
の形式を取る。
各値はオプションであり、省略された場合は、それぞれファイルの先頭、ファイルの末尾、ステップ1をデフォルト設定として利用する。
例
file.txt
の10行目から20行目までの内容をスライス。
slice 10:20 file.txt
file.txt
の先頭から100行目までの内容をスライスし、2行おきにスキップ。
slice :100:2 file.txt
-cオプションを付けるとスライスの単位を行ではなく文字とすることができる。
slice -c 10:20 file.txt
2023/10/17追記)
文法を少し拡張して便利にしました。
開始位置から指定の行数を切り出すパターン
slice 100:+50 very_long.log
これは以下と等価
slice 100:150 very_long.log
対象行の前後を切り出すパターン
slice 100:+-20 very_long.log
これは以下と等価
slice 80:120 very_long.log
おわりに
不具合等あれば報告してもらえると嬉しいです!
また、星がもらえると筆者が飛んで喜びます!
以上、拙作のsliceコマンドの紹介でした!