LoginSignup
17
5

headとtailを組み合わせるのは疲れた

Last updated at Posted at 2023-04-28

長大なログファイルから特定の行だけを見たい。

そんな時に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 tap chantsune/tap
brew install 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コマンドの紹介でした!

17
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
5