これらの実用的な例を使用して、UnixおよびLinuxでuniqコマンドを使用する方法を学びます。
UnixおよびLinuxのuniqコマンドは、重複するテキストをフィルタリングするために使用されます。単独で使用することもできますが、ファイル内の冗長な情報を識別するなど、他のコマンドと一緒に使用されるのが一般的です。
uniqコマンドの構文は次のとおりです。
uniq [options] <input-file> <output-file>
オプションなしでuniqを実行すると、入力と出力にstdinとstdoutが使用されます。
stdinの使用はクリップボード(コピー/貼り付け)を使用して可能ですが、これは最も実用的な使用法ではありません。
代わりに、重複した情報が含まれていると思われるファイルに対してこのコマンドを使用することをお勧めします。
uniqコマンドの1つの制限は、ファイル内で隣接している、または互いに隣接している重複のみを識別することです。これは非常に簡単ですが、実際の動作を確認できるように、例を示します。
[[email protected] ~]$ cat apple.txt
apple
apple
orange
orange
apple
orange
[[email protected] ~]$ uniq apple.txt
apple
orange
apple
orange
したがって、プログラムがすべての重複を独自に識別することを信頼することはできないことをすぐに知っています。これを回避する方法はいくつかありますが、通常はsortコマンドを使用します。
この記事の後半で紹介します。まず、他のコマンドを混ぜて混乱を招く可能性がある前に、いくつかの例を実行して「uniq」に慣れさせてください。
Linuxでのuniqコマンドの7つの例
実際のシステムログを使用しましたが、デモンストレーション用に編集しました。ほとんどのファイルはすでに隣接する順序で並べ替えられていますが、uniqコマンドの機能を示すために、「場違い」の行を数行残しています。
https://gist.github.com/abhishekpc/7dada8c6e57fd5b854f9d2dae72dddb0サンプルテキストファイルのダウンロード
例1:uniqコマンドをデフォルトの方法で使用する
これについてはすでに説明しましたが、デフォルトの構文を使用してサンプルファイルを見てみましょう。
[[email protected] ~]$ uniq sample_log_file.txt
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network
重複する行の多くが統合されていることがわかりますが、それでも冗長な情報が含まれています。これは、すでに説明した機能上の制限によるものです。さらにいくつかの例を見て、「uniq」コマンドラインユーティリティに組み込まれているオプションのいくつかを調べてみましょう。
例2:フィルタリングされた結果を宛先ファイルに出力する
この出力を保存して、簡単に編集または保存できるようにすることをお勧めします。通常のstdout(ターミナル)の代わりに、出力を別のファイルに送ることができます。この形式を使用して元のファイルを上書きすることはできないことに注意してください。
[[email protected] ~]$ uniq sample_log_file.txt uniq_log_output.txt
出力ファイルの内容は次のとおりです。
[[email protected] ~]$ cat uniq_log_output.txt
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network
例3:「-c」を使用して繰り返し行の数を取得する
このオプションはかなり自明です。プログラムは、各行の先頭にカウントを追加します。
[[email protected] ~]$ uniq sample_log_file.txt -c
2 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device is a keyboard
1 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device removed
2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: is tagged by udev as: Keyboard
5 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
1 /usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
7 /usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
1 PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
8 wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network
例4:「-d」を使用して繰り返し行のみを印刷する
ご覧のとおり、uniqコマンドの-dオプションを使用すると、ファイル全体で重複している行のみが表示されます。
[[email protected] ~]$ uniq sample_log_file.txt -d
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network
例5:「-u」を使用して一意の行のみを印刷する
ここでは、前のコマンドの逆出力を取得します。これらのコマンドはいずれもファイル内で繰り返されません。
[[email protected] ~]$ uniq sample_log_file.txt -u
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9 - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
例6:uniq['-f'および'-s']<を含むフィールドまたは文字を無視する/ h3>
これは実際には2つの例ですが、機能はほぼ同じです。それらがどのように機能するかを説明してから、2つの違いを明確にします。
それぞれが次の構文を使用します
Skip fields with:
uniq <source_file> -f N
Skip characters with:
uniq <source_file> -s N
これらの各例で、「N」はスキップするアイテムの数です。この数のアイテムをスキップすると、uniqは行全体を比較するのではなく、その時点で比較を開始します。
オプション「f」は、割り当てられた数のフィールドをスキップします。フィールドは空白を使用して解釈されます。
[[email protected] ~]$ cat field_separated_values.txt
blue fish
blue fish
blue fish
blue class
red fish
green fish
two class
two class
2番目の列でuniqコマンドを使用する場合は、次のように最初のフィールドをスキップする必要があります。
[[email protected] ~]$ uniq -f1 field_separated_values.txt
blue fish
blue class
red fish
two class
ご覧のとおり、最初のフィールド(色付き)が無視されているため、「赤い魚」と「緑の魚」の両方が同じ行になります。ここでカウントオプションを使用すると、検出された一意の行のカウントが表示されます:
[[email protected] ~]$ uniq -f1 -c field_separated_values.txt
3 blue fish
1 blue class
2 red fish
2 two class
なぜあなたはそれが必要なのでしょうか?実用的なシナリオを紹介します。多くのログファイルには、行の先頭にタイムスタンプがあります。このようなファイルで一意の行のみを検索する場合は、-fオプションを使用してタイムスタンプのある最初のフィールドをスキップできます。
同様に、特定の文字数をスキップできます。
[[email protected] ~]$ uniq -s 10 field_separated_values.txt
blue fish
例7:「-w」を使用してN文字のみを比較する
「-w」オプションを使用すると、比較に使用する文字の正確な数を指定できます。
前のカップルの例でログファイルを使用した場合は、それで問題ありません。混乱を避けるために、比較テキストをもう少し簡単にしたかったのです。そうでない場合は、それを元に戻して、最初の文字のみを使用して重複を見つけたときに何が起こるかを見てみましょう。
[[email protected] ~]$ uniq -w 4 sample_log_file.txt
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network
「/usr」で始まるすべての行は、プログラムの観点から「同じ」として識別されるようになりました。
これは、特定のログイベントを探している場合に役立つことがあります。
ボーナス:「sort」と「uniq」を同時に使用して不完全な一致を回避します。
これらのコマンドを個別に実行して同じ効果を得ることができますが、Linuxでパイプ(|文字)を使用したことがない場合、これはそれらについて学ぶための優れた方法です。
パイプを使用してさまざまなコマンドを組み合わせることで、キーストロークを節約し、ワークフローを改善できます。コマンドは、入力された順序で実行されます。
これは私が使用するサンプル入力です:
[[email protected] ~]$ cat apple.txt
apple
orange
orange
apple
apple
banana
apple
banana
それでは、入力ファイルを並べ替えてから、uniqコマンドを使用してみましょう。 sortコマンドは、すべてのアイテムが最初に隣接する順序になるようにテキストを再配置します。次に、uniqコマンドを実行すると、ファイル内の一意の行が3行だけ検出されます。
[[email protected] ~]$ sort apple.txt | uniq
apple
banana
orange
順番を逆にすると状況が変わります。最初に「uniq」コマンドを実行すると、隣接する重複のみが識別され、次に「sort」コマンドを使用してアルファベット順に並べ替えられます。
[[email protected] ~]$ uniq apple.txt | sort
apple
apple
apple
banana
banana
orange
パイプを使用すると、複数のコマンドを同時に実行できますが、パイプの順序を考慮することが重要です。
コマンドを個別に実行する場合と同じように、ファイルの内容は変更されないことに注意してください。 2つのコマンドを一緒に配管すると、結果がシステムの「メモリ」に保持されます。それらを個別に実行した場合、2番目のコマンドを実行する前に、新しいファイルを作成し、それを使用して元のファイルの内容を上書きしない限り、これらの結果を取得できませんでした。
結論
ご想像のとおり、これはbashを学習する上で重要な概念です。これらの特定のコマンド(sortとuniq)は、疑似ログなどの大きなファイルから情報をすばやくフィルタリングするために一緒に使用されることがよくあります。