ファイルのソートとフィルタリング: コマンド sort
、uniq
、cut
1. コマンドsort
sort
コマンドはテキストファイル内の行をソートするためのもの。通常のテキストからCSVまで、任意の形式のテキストで機能する。デフォルトではアルファベット順に行を並び替えるけど、オプションを使えばいろいろなことができるよ。
基本構文
sort [オプション] ファイル
簡単な例
例えば次のような内容のnames.txt
ファイルがあるとするね:
Charlie
Alice
Bob
David
これをアルファベット順にソートするにはこうするよ:
sort names.txt
結果はこんな感じ:
Alice
Bob
Charlie
David
sort
の主なオプション
逆順ソート
行を降順にソートしたい場合は、-r
オプションを使う:
sort -r names.txt
結果は:
David
Charlie
Bob
Alice
数値ソート
数字の場合、アルファベット順では正しい順序にならないことがある。例えば、次の内容のnumbers.txt
ファイル:
10
2
5
1
アルファベット順ではこうなる:
1
10
2
5
でも、-n
オプション(数値ソート)を使うと:
sort -n numbers.txt
正しい結果が得られる:
1
2
5
10
スペースへの対応
時々、行の先頭や末尾にスペースが含まれている場合がある。sort
が混乱しないようにするには、-b
オプションを使う:
sort -b 汚い_ファイル.txt
例
ウェブサイト訪問ログvisits.log
があるとする:
user2 15
user1 5
user3 30
user4 20
訪問数(2番目の列)でユーザーをソートしたい場合はこうするよ:
sort -k2 -n visits.log
ここで-k2
は「2列目をソートに使う」という意味だよ。結果は:
user1 5
user2 15
user4 20
user3 30
2. コマンド uniq
コマンド uniq
はファイル内の重複する行を取り除く。ただし注意点として、これは連続する重複にしか対応しない。つまり、同じ行がファイルの異なる部分に存在する場合、最初にソートが必要。
基本構文
uniq [オプション] ファイル
シンプルな例
例えば、ファイル colors.txt
がある場合:
red
green
green
blue
blue
blue
red
そのまま uniq
を使うと:
uniq colors.txt
結果はこうなる:
red
green
blue
red
不可避な重複の削除
最初にファイルをソートする:
sort colors.txt | uniq
結果:
blue
green
red
uniq
の主要オプション
重複回数のカウント
各行が何回出現したかを知りたい場合は、オプション -c
を使用:
sort colors.txt | uniq -c
結果:
3 blue
2 green
2 red
例
ファイル access.log
にIPアドレスのリストがある場合:
192.168.0.1
192.168.0.2
192.168.0.1
192.168.0.3
192.168.0.1
一番頻繁に登場するIPを知りたい場合:
sort access.log | uniq -c | sort -rn
結果:
3 192.168.0.1
1 192.168.0.2
1 192.168.0.3
3. コマンド cut
コマンド cut
は、行から特定の部分を抽出するために使用する。例えば、CSVファイル内の特定の列や文字の範囲など。
基本構文
cut [オプション] ファイル
簡単な例
ファイル data.csv
:
Alice,25,Developer
Bob,30,Designer
Charlie,22,Manager
名前だけ抽出する(最初の列):
cut -d',' -f1 data.csv
結果:
Alice
Bob
Charlie
どこで:
-d','
— 区切り文字(カンマ)。-f1
— 抽出するフィールド(列)。
cut
の主要なオプション
文字範囲の選択
ファイル data.csv
が固定幅の列で構成されている場合:
Alice 25 Developer
Bob 30 Designer
Charlie 22 Manager
年齢だけ抽出する(12文字目から14文字目):
cut -c12-14 data.csv
結果:
25
30
22
複数のフィールドの選択
ファイル log.csv
の場合:
2023-01-01,INFO,Server started
2023-01-02,ERROR,Connection failed
2023-01-03,INFO,Server stopped
日付とログレベルだけを選択(フィールド1と2):
cut -d',' -f1,2 log.csv
結果:
2023-01-01,INFO
2023-01-02,ERROR
2023-01-03,INFO
4. 実践例: sort
、uniq
、cut
の組み合わせ
次のようなデータを持つログファイルを使います:
user1,192.168.0.1
user2,192.168.0.2
user1,192.168.0.1
user3,192.168.0.3
user2,192.168.0.2
- IPアドレスを抽出します:
cut -d',' -f2 log.txt
- 重複を削除し、カウントします:
cut -d',' -f2 log.txt | sort | uniq -c
- 出現回数でソートします:
cut -d',' -f2 log.txt | sort | uniq -c | sort -rn
結果:
2 192.168.0.2
2 192.168.0.1
1 192.168.0.3
GO TO FULL VERSION