Linux標準教科書　第5章まとめ

# はじめに
こちらの続きです。
[第1章](https://qiita.com/sasao3/items/730a579f2710660195eb)
[第2.3章](https://qiita.com/sasao3/items/1dca5a44ce9898b178b1)
[第4章](https://qiita.com/sasao3/items/69f334d1ee73327dc97e)

# 基本的なコマンド
この章では、基本的なコマンドとして`touch`,`head`,`tail`,`sort`,`uniq`,`tr`,`diff`を学習する。
主にテキストファイルを処理するために利用するコマンド。

## ファイルのタイムスタンプの変更（touch）
ファイルには、タイムスタンプが必ず存在する。

タイムスタンプとは、最終更新日でその時刻にそのデータが存在していたこととそれ以降変更されていないことを証明するためのもの。

書式：`touch [オプション] ファイル名`

***ファイルが存在しない場合は、中身が0バイトのファイルを新しく作成する。***

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| -d       | 日時を文字列で指定        |
| -r       | 既存ファイルのタイムスタンプと同一にする（touch -r 既存ファイル 対象ファイル）      |
| -a       |  最終アクセス日時のみ変更（指定しない場合は、最終更新日時と最終アクセス日時が変更される      |
| -m       | 最終更新日時のみ変更する（指定しない場合は、最終更新日時と最終アクセス日時が変更される       |
| -c     |  ファイルを新規作成しない。このオプションなしでは、ファイルがない場合新しくファイルが作成されるが、このオプションを用いることで新規作成を行わない    |



参考：[【 touch 】コマンド――タイムスタンプを変更する／新規ファイルを作成する](https://www.atmarkit.co.jp/ait/articles/1606/14/news013.html)

touchコマンドを実行することで、ファイルのタイムスタンプを現在日時に変更できる。また、オプションを用いることで、新しいタイムスタンプを指定することもできる。
時間は`[[CC]YY]MMDDhhmm[.SS]`形式で指定する（[ ]は省略化）。

コマンド実行例

```
$ ls -la
-rw-r--r--@  1 オーナー名  staff    18  2 14 15:19 text-new

$ touch text-new 
-rw-r--r--@  1 オーナー名  staff    18  2 16 12:22 text-new　←タイムスタンプが変更されている

$ touch -t 202012200505 text-new
-rw-r--r--@  1 オーナー名  staff    18 12 20 05:05 text-new　←タイムスタンプが12/20 05:05に変更されている
```

## ファイルの一部の取得（head,tail）
ファイルの先頭や末尾など一部のみを見る場合は、headコマンドやtailコマンドが使える。

### head
headコマンドは、ファイルの先頭部分を標準出力する。オプションを付けない場合は、先頭から10行を標準出力する。

書式：`head [オプション] ファイル名`

ファイル名を空白にした場合は、標準入力からのデータに対して処理を行う。

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| -n 行       | 先頭から指定した行を標準出力する        |
| -c バイト       | 先頭から指定したバイト分を標準出力する        |

コマンド実行例

```

$ cat text
Hello
aiueo
kakikukeko
World

下記コマンドの場合、textファイルの最初の2行を出力するよう指定している
$ head -n 2 text 
Hello
aiueo
```

### tail
tailコマンドはファイルの終わり部分を標準出力する。オプションをつけない場合は、末尾から10行を標準出力する。

書式：`tail [オプション] ファイル名`

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| -n 行       | 末尾から指定した行を標準出力する        |
| -c バイト       | 末尾から指定したバイト分を標準出力する        |
| -f       | 変更をリアルタイムでモニタすることができる        |

ファイルによっては、ログなど終わり部分が随時変化するものがある。tailコマンドの`-f`オプションを用いることで、変更をリアルタイムでモニタすることができる。

## テキストファイルのソート（sort）
テキストファイルの中身をソートするにはsortコマンドが使える。オプションでどうのようにソートするかを指定できる。

書式：`sort [オプション] ファイル名`

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| -r       | 逆順でソートする        |
| -k n       | n列目のデータをソートする        |
| -n       | 数値としてソートする       |

コマンド実行例

```
//sort-fileの中身
$ cat sort-file
tanaka kei 27
yamamoto takeru 43
sano momo 120

//オプションなしの場合、1文字目のアルファベット順（s→t→y）でソートされる
$ sort sort-file
sano momo 120
tanaka kei 27
yamamoto takeru 43

//-kオプションを用いて2列目（ここで言う名前部分）の1文字目をソート（k→m→s）
$ sort -k 2 sort-file
tanaka kei 27
sano momo 100
yamamoto takeru 43

//-kオプションを用いて3列目（ここで言う数値部分）をソートしてみる
$ sort -k 3 sort-file
sano momo 120
tanaka kei 27
yamamoto takeru 43

↑数値の並びが昇順になっていない。これは数値部分が文字列として認識されているため。そのため、一文字目（1→2→4）の順でソートされてしまっている。

//-n -kオプションを用いることで数値をソートできる
$ sort -n -k 3 sort-file
tanaka kei 27
yamamoto takeru 43
sano momo 120
```

## 行の重複の消去（uniq）
uniqコマンドを使うことで、***直前の行と同じ内容があった場合***、対象行を出力しない。連続している同じ内容の行を一行にまとめることができる。
あくまでも直前の行と同じ内容があった場合なので、他の行を挟んで同じ内容があった場合は対象にはならない。

書式：`uniq`　ファイル名

コマンド実行例

```
//uniq-fileの中身
$ cat uniq-file
aaa
bbb
aaa
ccc
ccc
ddd

//uniqコマンド実行結果（ccc部分がまとめられている、aaaはbbbを挟んでいるためまとめられていない）
$ uniq uniq-file
aaa
bbb
aaa
ccc
ddd
```

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

コマンド実行例

```
tr-fileの中身
$ cat tr-file
sasaki
yamamoto
kimura

//trコマンド実行（catコマンドの併用）　s,kをS,Kに置き換えている（連続していなくても置き換わる）
$ cat tr-file | tr sk SK
SaSaKi
yamamoto
Kimura
```

## ファイルの比較（diff）
diffコマンドを使うと、ファイルを比較することができる。使用用途としては、変更の有無を調べるときに使う。

書式：`diff [オプション] ファイル1 ファイル2`

オプション

| オプション | 詳細 | 
|:-----------:|:------------|
| -c       | context diff形式で差分を出力する        |
| -u       | unified diff形式で差分を出力する        |


コマンド実行例

```
//diff-file1,diff-file2の中身
$ cat diff-file1
test

$ cat diff-file2
test
aiueo

//diffコマンド実行（2つのファイルの異なる部分を標準出力）
$ diff diff-file1 diff-file2
1a2
> aiueo
```

「1a2」は、faile1の一行目直後にfile2の三行目が追加（append）されていることを意味する


### 比較箇所が変更されていた場合

```
//diff-file1,diff-file2の中身
$ cat diff-file1
test
bbb

$ cat diff-file2
test
aiueo

//コマンド実行結果
$ diff diff-file1 diff-file2
2c2
< bbb
---
> aiueo
```

「2c2」はfile1の二行目（bbb）が、file2の二行目（aiueo）に変更（change）されているを意味する。


### 比較箇所が削除されていた場合

```
//diff-file1,diff-file2の中身
$ cat diff-file1
test
bbb

$ cat diff-file2
test

//コマンド実行
$ diff diff-file1 diff-file2
2d1
< bbb
```

「2d1」はfile1の二行目（bbb）が、file2では削除（delete）されているということを意味する。


参考：[ファイルの差分を見る！diffコマンドの詳細まとめ【Linuxコマンド集】](https://eng-entrance.com/linux-command-diff)

オプションに関しては、対象の行だけでなくその前後の行も表示させたい場合に使う。
→比較するファイルの行番号がずれていたとしても全体をみることができるため確認しやすい。

コマンド実行例

```
$ cat diff-file1
test
bbb

$ cat diff-file2
test
aaa
```

```
$ diff -c diff-file1 diff-file2
*** diff-file1	2021-02-16 18:45:24.000000000 +0900
--- diff-file2	2021-02-16 19:15:10.000000000 +0900
***************
*** 1,2 ****
  test
! bbb
--- 1,2 ----
  test
! aaa

```

context形式（オプション：-c）の場合、同じ行で異なる内容の場合行頭に「!」がつく。
差分は「+」「-」で表現される。


```
$ diff -u diff-file1 diff-file2
--- diff-file1	2021-02-16 18:45:24.000000000 +0900
+++ diff-file2	2021-02-16 19:15:10.000000000 +0900
@@ -1,2 +1,2 @@
 test
-bbb
+aaa
```

unified形式（オプション：-u）の場合も、差分は「+」「-」で表現される。同じ行で異なる内容の場合でも差分で表現される。
文字列の増減が激しい、文書やプログラムのソースコードを比較する場合に有用。

他にも違う点はあるがとりあえずはこの程度の認識としておく。

参考：[【 diff 】コマンド（基本編その2）――テキストファイルの差分をcontext形式などで出力する](https://www.atmarkit.co.jp/ait/articles/1704/14/news011.html)

# まとめ
今回はLinux標準教科書5章について自分なりにまとめました。

以上