基本的なコマンド2 ( uniq, diff )

行の重複の消去( uniq )

 uniqコマンドを使うことで直前の行と同じ内容があった場合、対象行を出力しない。連続している内容の行を、1行にまとめることができる。

$ uniq [ ファイル名 ]
サンプルファイルの作成
$  cat > uniq-sample
AAA
BBB
AAA
CCC
CCC
DDD
( Ctrl + D で終了)
実行例
$ uniq uniq-sample
AAA
BBB
AAA
CCC
DDD

 uniqの実行により、重複して記述されていた文字列"CCC"が1行にまとめられた。このコマンドを使うことで、全データから重複していない要素だけをピックアップすることができる。

 AAAが2つ表示されているのは、AAAは連続して入力されていないからである。この場合はuniqコマンドの処理対象にならない。

文字列の置き換え( tr )

 tr コマンドを使うことで、標準入力からのデータを文字ごとに置き換える( TRanslate )ことができる。

$ tr 文字列1 文字列2

 tr コマンドは文字を文字ごとに別の文字に置き換えることができる。置き換える元のデータは標準入力からのデータを対象にする。

実行例1
$ cat FILE | tr abc ABC

 このコマンドでは以下の2つの処理が行われる。

  • cat コマンドによって、FILE を開く

* tr コマンドでa,b,c をそれぞれ A,B,C に置き換える

実行例2 サンプルファイルを作成する
$ cat > translate
Android
iPhone
Windows Phone
( Ctrl + D で終了 )
tr コマンドを実行する
$ cat translate | tr on ON
ANdrOid
iPhONe
WiNdOws PhONe

 oがOに、nがNに置き換わっていることがわかる。

 tr コマンドの結果は標準出力されるが、リダイレクトすればファイルに出力することもできる。

$ cat translate | tr on ON > translate2
$ cat translate2
ANdrOid
iPhONe
WiNdOws PhONe

 ファイル translate には変更が記録されず、tr の実行結果はファイル translate2 ファイルに出力されている。

ファイルの比較( diff )

 Linuxにはファイルを比較するコマンドが存在する。主に使われる用途として、変更の有無を調べる際に用いられる。diff の結果は標準出力されるが、リダイレクトすればファイルに出力することもできる。

$ diff [ オプション ] [ ファイル1 ] [ ファイル2 ]
オプション
-c
context diff 形式で差分を出力する

-u
unified diff 形式で差分を出力する
実行例1
$ diff hoge1 hoge2
$ diff  -c hoge1 hoge2
$ diff  -u hoge1 hoge2
実行例2 サンプルファイルを作成する。
$ echo "test text" > file1
$ echo "test text" > file2
$ echo "new line" >> file2
diff コマンドを実行
$ diff file1 file2
1a2
> new line
diff -u コマンドによる比較
$ diff -u file1 file2
--- file1   2021-01-21 14:25:57.000000000 +0900
+++ file2   2021-01-21 14:26:10.000000000 +0900
@@ -1 +1,2 @@
 test text
+new line
diff -c コマンドによる比較
$ diff -c file1 file2
*** file1   2021-01-21 14:25:57.000000000 +0900
--- file2   2021-01-21 14:26:10.000000000 +0900
***************
*** 1 ****
--- 1,2 ----
  test text
+ new line

オプションを付けずにdiff コマンドを実行した場合は、異なる部分を標準出力する。

実行例3 file2 の内容を別の文字列で上書きしてdiff コマンドを実行する
$ echo "overrite text" > file2
( file2 を別の文字列で上書き )
$ echo "new line" >> file2

 これで、file1とfile2の共通点がなくなった。ここでdiffコマンドを実行してみる。

$ diff file1 file2 
1c1,2
< test text
---
> overrite text
> new line

 「 3つの差分がある 」と表示されているが少しわかりにくい。なので、今度はdiff -u コマンドを実行してみる。

$ diff -u file1 file2
--- file1   2021-01-21 14:25:57.000000000 +0900
+++ file2   2021-01-21 14:36:54.000000000 +0900
@@ -1 +1,2 @@
-test text
+overrite text
+new line

 diff -u コマンドによる比較は、削除された行の頭にマイナス記号、追加された行にプラス記号が付与されて標準出力される。

 "test text"という文字列が削除され、"overwride text"と"new line"が追加されたことがわかる。-uオプションは文字列の増減が激しい、文書やプログラムのソースコードを比較する場合に有用である。