Linuxでログファイルやテキストファイルを扱う際、同じ内容の行を重複なく整理したいケースがあります。
この記事では、sort -u を使用して重複行を削除する方法を中心に、sort | uniq との違いや、実務でよく使うオプションの組み合わせ方を解説します。
コマンド早見表 #
解説は不要という方は、以下のコマンドをそのままコピーしてご利用ください。
- 重複行を削除してソート
sort -u ファイル名
- 逆順にソート(重複削除あり)
sort -ru ファイル名
- 数値順にソート(重複削除あり)
sort -nu ファイル名
- 特定の列を基準にソート(重複削除あり)
sort -u -k 列番号 ファイル名
- パイプと組み合わせて重複削除
sort ファイル名 | uniq
sort -u とは #
sort コマンドは、テキストファイルの行をアルファベット順や数値順に並び替えるコマンドとなります。
-u オプションを付けることで、ソートと同時に重複行を削除することができます。
例えば以下のような、apple と banana が重複しているファイル(test.log)があるとします。
apple
banana
apple
cherry
banana
sort -u を実行すると、重複した行が除去された状態として整形された結果が出力されます。
sort -u test.log
出力結果は以下となります。
apple
banana
cherry
2行ずつ存在していた apple と banana が1行に集約され、アルファベット順に並び替えられた状態となっていることが分かります。
sort -u と sort | uniq の違い #
重複行を削除する方法として、sort -u の他に sort | uniq を使う方法があります。
どちらも処理としては同じ結果を返しますが、以下のような使い分けが一般的となっております。
| コマンド | 特徴 |
|---|---|
sort -u |
シンプルで入力しやすい |
sort | uniq |
出現回数のカウントなどの追加オプションと組み合わせやすい |
それぞれの出現回数をあわせて確認したい場合は、以下のように sort コマンドで並び替えを実行した後に uniq -c を使用します。
sort ファイル名 | uniq -c
先ほどの test.log を使用した場合の出力例は以下となります。
2 apple
2 banana
1 cherry
左側の数値が各行の出現回数を表しており、apple と banana がそれぞれ2回、cherry が1回出現していることが確認できます。
よく使うオプション #
その他にも日常的によく利用する主要なオプションについて解説いたします。
逆順にソート(-r) #
-r オプションを付けることで、逆順(降順)にソートすることができます。
sort -ru ファイル名
数値順にソート(-n) #
sort コマンドは、デフォルトでは文字列としてソートを行います。
数値を基準に処理を行いたい場合は、以下のように -n オプションを使用します。
sort -nu ファイル名
例えば以下のようなファイルがある場合、-n なしでは 10 が 2 よりも前に来てしまいます。
10
2
5
-n オプションを指定することで正しく数値順にソートされます。
sort -nu ファイル名
出力結果は以下となります。
2
5
10
特定の列を基準にソート(-k) #
-k オプションを使用すると、特定の列を基準にソートできます。
例えば、以下のようなスペース区切りのファイルがあるとします。
user01 300
user02 100
user03 200
user01 300
2列目の数値を基準に並び替えたい場合は、以下のように指定します。
sort -u -k 2n ファイル名
出力結果は以下のようになります。
user02 100
user03 200
user01 300
この例では、2列目の数値を基準にソートしています。
また、-u を指定しているため、重複している user01 300 は1行にまとめられます。
-k オプションはログや一覧データの特定項目を基準に整理したい場合に非常に便利です。
実用例 #
ここでは、実際の利用シーンを想定したコマンドの活用例をご紹介します。
アクセスログからIPアドレスを重複なしで抽出する #
アクセスログから接続元IPアドレスの一覧を重複なしで取得したい場合は、以下のように awk と組み合わせることで確認できます。
これにより、アクセス元の確認や簡易的な集計に活用することができます。
awk '{print $1}' /var/log/nginx/access.log | sort -u
grepの結果から重複行を削除する #
その他にも grep コマンドと組み合わせることで、検索結果から重複を除いた一覧を取得することができます。
この例では、/var/log/messages から error を含む行のみを抽出し、その結果を sort -u に渡しています。
これにより、重複を除いた形でエラーメッセージを確認することができます。
grep 'error' /var/log/messages | sort -u
grepコマンドの詳しい使い方については、以下の記事もあわせてご覧ください。
grepコマンドで複数条件検索する方法(AND・OR・除外)