Linux テキスト処理に関するコマンド-まとめ


# 目次
・wc コマンド（標準入力として受け取った値を表示する）
・sort コマンド（色々な基準で、ファイルの中身を並び替えて表示する）
・uniq コマンド（ファイル内の重複内容を取り除いて表示する）
・cut コマンド（フィールドが区切り文字で表示されているファイルで、特定のフイールドの値だけを表示させる）
・tr　コマンド（文字を変換、削除する）
・tail コマンド（ファイル内の末尾を表示する）
## 前提条件

シェルには、bushを使用しています。
bushのバージョンは、3.2.57です。
ちなみに、bashのバージョンは、以下のコマンドで確認することができます。

```
$ bash --version
```

##使用するファイル
今回、例で使用するファイルとして、以下のような内容のテキストファイルを使用します。

```txt:sample.txt
aoyama
aoyama
takahashi
takahashi
aoyama
katou
kitagawa
```


## wcコマンド
wcコマンドは、対象ファイルの行数、単語数、バイト数を表示するコマンドです。
例えば、以下のようなファイルが存在した場合には、このような表示をします。

```
$ wc sample.txt 
7       7      56 sample.txt
```
左から、行数、単語数、バイト数、ファイル名を表しています。
また、オプションとして、-l,-w,-cが存在し、それぞれ行数だけ、単語数だけ、バイト数だけを表示させることができます。
よくある使い方として、-lオプションを指定することで１行に一つデータが存在するようなファイルであれば、データの総数を簡単に求めることができます。

##sortコマンド
行単位で、テキストをソートすることができるコマンドです。
オプションなしで使用した場合、アルファベット順にファイル内を並び替えて表示することができます。

```
$ sort sample.txt
aoyama
aoyama
aoyama
katou
kitagawa
takahashi
takahashi
```
もともと５行目にあったaoyamaが３行目に上がっていたりと、アルファベット順に並び替えられていることがわかります。
オプションとして、
-n　・・・数値順（少ない順）に並び替えを行う。
-r　・・・逆順（降順）に並び替えを行う。
などがあります。

## uniqコマンド
重複している内容の行を取り除いたりすることができるコマンドです。

```
$ uniq sample.txt 
aoyama
takahashi
aoyama
katou
kitagawa
```
しかし、使用点に注意があります！
uniqコマンドは、何もオプションをつけていない場合は、「同じ内容の行が連続している場合は取り除く。」
という性質を持っているので、今回の例では、離れているaoyamaが取り除きれていないことがわかります。
解決策として、先程のsortコマンドでアルファベット順に並び替えた後、uniqコマンドを適用することで、全ての重複行をまとめて表示させることが可能になります。

```
$ sort sample.txt | uniq
aoyama
katou
kitagawa
takahashi
```

また、よく使われるオプションとして、「-c」があります。
これを使用することで、重複している行がいくつあったかを表示させることができます。
左に出ている数字が、もともと重複していた行数を表しています。

```
$ sort sample.txt | uniq -c
3 aoyama
1 katou
1 kitagawa
2 takahashi
```

##cutコマンド
cutコマンドは、対象ファイルのフィールドを指定して、指定フィールドだけの値を取り出すことができるコマンドです。
例えば、以下のようなフィールドを「：」で区切られたファイルがあったとします。

```txt:sample2.txt
aoyama1:aoyama2:aoyama3:aoyama4
katou1:katou2:katou3:katou4
satou1:satou2:satou3:satou4
```
このファイルの、フィールドが２番目、つまりaoyama2,katou2,satou2の部分だけを取り出して表示させたい時には、以下のようにcutコマンドを使用します。

```
$ cut -d <区切り文字> -f <フィールド番号> <対象ファイル名>
```

```
$ cut -d : -f 2 sample2.txt 
aoyama2
katou2
satou2
```
上記のようにすると、フィールド番号が２の値だけを取り出すことができます。
今回の場合は、-dオプションで区切り文字を「：」に指定
フィールド番号は-fオプションで、「２」を指定しています。

## trコマンド
文字を置換することができるコマンドです。
注意点として、文字列を置換するわけではなく「一文字単位での置換」となります。

```
$ tr <置換前の文字> <置換後の文字>
```
例えば、先程使ったsample2.txtのaをAに、tをTに置換してみます。

```
cat sample2.txt | tr at AT
AoyAmA1:AoyAmA2:AoyAmA3:AoyAmA4
kATou1:kATou2:kATou3:kATou4
sATou1:sATou2:sATou3:sATou4
```
ここで注意して欲しいのは、atという文字列をATという文字列に置換しているのではなく、aをAに、tをTに別々に変換している点です。
もし文字列を置換したい場合は、別のコマンドである、awkコマンドや、sedコマンドを使用する必要があります！
もう一つ、注意点なのですが、今回のtrコマンドはファイル名を以下のように直接指定して処理がうまく行かず、標準入力に対してしか処理を行うことができませんので、ご注意を！

```
$ tr at AT sample2.txt 　<=直接ファイル名を指定
#うまく行かず、下のような表示が出てしまう。
usage: tr [-Ccsu] string1 string2
       tr [-Ccu] -d string1
       tr [-Ccu] -s string1
       tr [-Ccu] -ds string1 string2
```

trコマンドは、文字を置換するだけでなく、削除することもできます。
以下のように、-d オプションをつけることで、削除ができます。

```
$ cat sample2.txt | tr -d a
oym1:oym2:oym3:oym4
ktou1:ktou2:ktou3:ktou4
stou1:stou2:stou3:stou4
```

また、削除文字に"\n"を指定することで、改行コードを削除し、全てのデータを一行で表示させることもできる。

```
$ cat sample2.txt | tr -d "\n"
aoyama1:aoyama2:aoyama3:aoyama4katou1:katou2:katou3:katou4satou1:satou2:satou3:satou4
```
##tailコマンド
tailコマンドは、ファイルの末尾を表示するコマンドです。
1~15の値が行ごとに記述してあるファイルの使用すると、以下のように表示させることができます。

```txt:sample3.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
```
オプションをつけない場合は、末尾の10行を表示します。

```
$ tail sample3.txt
6
7
8
9
10
11
12
13
14
15
```
-n オプションを使用すると、表示させる行数を指定することができます。
また -f オプションをつけることで、リアルタイムでファイルの末尾を表示させることができます。
 -f オプションは、Linuxの運用作業中などに、ログファイルを監視するのによく使われます。

#終わりに
今回は、Linuxを使用する上でテキスト処理に関するコマンドの一部を紹介しました！
間違っている解釈などがございましたら、ぜひ教えていただけると幸いです。

##参考文献
以下の本で勉強させてもらってます。とてもわかりやすくて、プログラミング勉強してるけどちょくちょく出てくるLinuxってなんやねん！！って人におすすめです！！

[新しいLinuxの教科書-著者：三宅英明さん、大角祐介さん]
(https://www.amazon.co.jp/dp/B072K1NH76/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)