xzgrepコマンドの使い方

#1 xzgrepコマンドとは?
xzgrepコマンドは、以下の圧縮、非圧縮ファイルの中身を検索するコマンドです。
・xz
・lzma
・gzip
・bzip2
・lzop
・非圧縮

```console:manの抜粋
  xzgrep invokes grep(1) on files which may be either uncompressed or compressed with xz(1), lzma(1), gzip(1), bzip2(1),
  or lzop(1).  All options specified are passed directly to grep(1).
```

#2 環境
VMware Workstation 15 Player上の仮想マシンを使いました。
仮想マシンの版数は以下のとりです。

```console:CentOSの版数
[root@server ~]# cat /etc/redhat-release
CentOS Linux release 8.3.2011
```

```console:カーネル版数
[root@server ~]# uname -r
4.18.0-240.el8.x86_64
```

#3 圧縮、非圧縮ファイルの中身を検索する方法

##3.1 事前準備
圧縮前のファイルを作成します。

```console:ファイルの作成
[root@server xzgrep]# vi test.txt
[root@server xzgrep]# cat test.txt
111
abc
```

xz形式のファイルを作成します。
この時`-k`オプションを指定して、圧縮前のファイルを残したままにします。
これ以降の全ての圧縮コマンドでも、同様に`-k`オプションを指定して
圧縮前のファイルを残したままにします。

```console:圧縮ファイルの作成(xz)
[root@server xzgrep]# xz -k test.txt

[root@server xzgrep]# file test.txt.xz
test.txt.xz: XZ compressed data
```

lzma形式のファイルを作成します。

```console:圧縮ファイルの作成(lzma)
[root@server xzgrep]# lzma -k test.txt

[root@server xzgrep]# file test.txt.lzma
test.txt.lzma: LZMA compressed data, streamed
```

gzip形式のファイルを作成します。

```console:圧縮ファイルの作成(gzip)
[root@server xzgrep]# gzip -k test.txt

[root@server xzgrep]# file test.txt.gz
test.txt.gz: gzip compressed data, was "test.txt", last modified: Fri Apr 16 14:08:01 2021, from Unix, original size 8
```

bzip2形式のファイルを作成します。

```console:圧縮ファイルの作成(bzip2)
[root@server xzgrep]# bzip2 -k test.txt

[root@server xzgrep]# file test.txt.bz2
test.txt.bz2: bzip2 compressed data, block size = 900k
```

lzop形式のファイルを作成します。

```console:圧縮ファイルの作成(lzop)
[root@server xzgrep]# lzop -k test.txt

[root@server xzgrep]# file test.txt.lzo
test.txt.lzo: lzop compressed data - version 1.030, LZO1X-1, os: Unix
```

作成したファイルを確認します。

```console:ファイル一覧
[root@server xzgrep]# ls -l
合計 24
-rw-r--r--. 1 root root  8  4月 16 23:08 test.txt
-rw-r--r--. 1 root root 45  4月 16 23:08 test.txt.bz2
-rw-r--r--. 1 root root 37  4月 16 23:08 test.txt.gz
-rw-r--r--. 1 root root 30  4月 16 23:08 test.txt.lzma
-rw-r--r--. 1 root root 70  4月 16 23:08 test.txt.lzo
-rw-r--r--. 1 root root 64  4月 16 23:08 test.txt.xz
```

##3.2 実行結果
文字列`111`が含まれるファイルを一括で検索してみます。

```console:実行結果
[root@server xzgrep]# xzgrep 111 test.txt*
test.txt:111
test.txt.bz2:111
test.txt.gz:111
test.txt.lzma:111
test.txt.lzo:111
test.txt.xz:111
```

文字列`111`または`abc`が含まれるファイルを一括で検索してみます。

```console:実行結果
[root@server xzgrep]# xzgrep -e 111 -e abc test.txt*
test.txt:111
test.txt:abc
test.txt.bz2:111
test.txt.bz2:abc
test.txt.gz:111
test.txt.gz:abc
test.txt.lzma:111
test.txt.lzma:abc
test.txt.lzo:111
test.txt.lzo:abc
test.txt.xz:111
test.txt.xz:abc
```

同じことをzgrepコマンドで実行してみました。
gzファイルはマッチした文字列の表示がきますが、lzo,xzファイルは表示ができません。
他の圧縮ファイル(bz2,lzma)については、マッチした文字列の表示ができませんでした。
xzgrepの方がzgrepに比べ、検索できる圧縮ファイルの種類が多いようです。

```console:実行結果
[root@server xzgrep]# zgrep 111 test.txt*
test.txt:111
test.txt.gz:111
test.txt.lzo:バイナリファイル (標準入力) に一致しました
test.txt.xz:バイナリファイル (標準入力) に一致しました
```


#4 圧縮ファイルの中身を確認する方法
lessコマンドを使うと、圧縮ファイルを解凍することなく中身を確認できます。
ただし、lzoファイルは圧縮したままでは確認することができませんでした。

bz2ファイルの中身を確認してみます。
圧縮したままで中身を確認することができます。

```console:bz2ファイルの中身確認
[root@server xzgrep]# less -F test.txt.bz2
111
abc
```

gzファイルの中身を確認してみます。
圧縮したままで中身を確認することができます。

```console:gzファイルの中身確認
[root@server xzgrep]# less -F test.txt.gz
111
abc
```

lzmaファイルの中身を確認してみます。
圧縮したままで中身を確認することができます。

```console:lzmaファイルの中身確認
[root@server xzgrep]# less -F test.txt.lzma
111
abc
```

lzoファイルは、lessコマンドではそのままでは中身を確認できないようです。

```console:lzoファイルの中身確認
[root@server xzgrep]# less -F test.txt.lzo
"test.txt.lzo" may be a binary file.  See it anyway?
```

xzファイルの中身を確認してみます。
圧縮したままで中身を確認することができます。

```console:xzファイルの中身確認
[root@server xzgrep]# less -F test.txt.xz
111
abc
```


#5 マッチした前後の行を表示する方法(`-C`)
圧縮ファイルを検索してマッチした行と、その前後の行を表示してみます。

```console:ファイルの作成
[root@server xzgrep]# seq 1 10 > test.txt
[root@server xzgrep]# cat test.txt
1
2
3
4
5
6
7
8
9
10
```

```console:圧縮ファイルの作成
[root@server xzgrep]# xz -k test.txt
```

```console:ファイルの確認
[root@server xzgrep]# ls -l
合計 8
-rw-r--r--. 1 root root 21  4月 21 20:07 test.txt
-rw-r--r--. 1 root root 80  4月 21 20:07 test.txt.xz
```

圧縮ファイルの中から`5`にマッチした行と、その前後の2行を表示してみます。

```console:実行結果
[root@server xzgrep]# xzgrep -C2 5 test.txt.xz
3
4
5
6
7
```


#Z 参考情報