Linux入門 3-6 フィルタを使ったテキストストリームの処理

[](参照ソース)
[Udemyの動画講座]:https://www.udemy.com/course/linuxlpic/?utm_source=bene-content-marketing&utm_campaign=normal&utm_content=story&utm_term=career&utm_medium=udemyads
[Linux入門 3-5]:https://qiita.com/hoglet/items/d6f97403e3e90283e742
[Linux入門 3-7]:https://qiita.com/hoglet/items/b2f389fb7f82e6bc9e79

# はじめに
Linux初学者である自分向け用の記事です。[Udemyの動画講座]を参考にしました。
僕の勉強法は`動画を見る`→`実際に動かしてみる`→`問題演習`という流れです。

前回まで：[Linux入門 3-5]

***
# 3. LinuC 101 Ver .10.0(問題、テスト、演習)
# フィルタを使ったテキストストリームの処理

## catコマンド
ファイルの中身を標準出力に表示するコマンド

```s
[root@52793acd2b0f test]# cat test.txt 
apple
lemon

grape


ABCDE
[root@52793acd2b0f test]# cat -n test.txt 
     1	apple
     2	lemon
     3	
     4	grape
     5	
     6	
     7	ABCDE
[root@52793acd2b0f test]# cat -b test.txt 
     1	apple
     2	lemon

     3	grape


     4	ABCDE
```

## cutコマンド
ファイルから一部を抽出して出力するコマンド

```s
[root@52793acd2b0f test]# cat test.txt 
1,apple
2,lemon
3,grape
[root@52793acd2b0f test]# cut -c 1 test.txt 
1
2
3
[root@52793acd2b0f test]# cut -c 1-3 test.txt 
1,a
2,l
3,g
[root@52793acd2b0f test]# cut -d , -f 2 test.txt 
apple
lemon
grape
```

```s
[root@52793acd2b0f test]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@52793acd2b0f test]# cut -d : -f 1-4 /etc/passwd
root:x:0:0
bin:x:1:1
daemon:x:2:2
adm:x:3:4
lp:x:4:7
sync:x:5:0
shutdown:x:6:0
halt:x:7:0
mail:x:8:12
operator:x:11:0
games:x:12:100
ftp:x:14:50
nobody:x:99:99
systemd-network:x:192:192
dbus:x:81:81
```

## expandコマンド, unexpandコマンド
テキスト内のタブをスペースに変換するコマンド
行頭のスペースをタブに変換するコマンド

```s
[root@52793acd2b0f test]# cat test.txt 
1	apple
2	lemon
3	grape
[root@52793acd2b0f test]# expand -t 1 test.txt 
1 apple
2 lemon
3 grape
[root@52793acd2b0f test]# unexpand -t 8 test1.txt 
1	apple
2	lemon
3	grape
```

## lessコマンド
ファイルの中身を閲覧するコマンド

```s
[root@52793acd2b0f test]# less test1.txt
1       apple
2       lemon
3       grape
test1.txt (END)
```

## fmtコマンド
テキストを決められた桁に整形する

```s
[root@52793acd2b0f test]# cat test.txt 
I              Like     an        apple  .
[root@52793acd2b0f test]# fmt -u test.txt 
I Like an apple .
```

## prコマンド
印刷用にファイルの書式を整形する

```s
[root@52793acd2b0f test]# pr -h "////PRINT////" /etc/passwd | less
2020-11-13 01:55                  ////PRINT////                   Page 1


root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
```

## headコマンド, tailコマンド
ファイルを先頭から表示する
指定したファイルの末尾から表示

```s
[root@52793acd2b0f test]# head -n 2 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@52793acd2b0f test]# tail -n 2 /etc/passwd
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
```

## sedコマンド
ファイルの編集を行うコマンド

```s
[root@52793acd2b0f test]# cat test.txt 
1,apple
2,lemon
3,grape
4,apple
5,orange
[root@52793acd2b0f test]# sed s/a/AAA/ test.txt 
1,AAApple
2,lemon
3,grAAApe
4,AAApple
5,orAAAnge
```

## sortコマンド
ファイルの行の並び替えをする

```s
[root@52793acd2b0f test]# cat test.txt 
2,apple
11,lemon
4,grape
1,apple
9,orange
[root@52793acd2b0f test]# sort test.txt 
1,apple
11,lemon
2,apple
4,grape
9,orange
[root@52793acd2b0f test]# sort -n test.txt 
1,apple
2,apple
4,grape
9,orange
11,lemon
```

## uniqコマンド
sortコマンドと併用することで効果発動！！
ソート済みの文字列から重複行を調べて、削除して取り出す

```s
[root@52793acd2b0f test]# cat test.txt 
111
P@ssw0rd
222
p@ss
333
pass
111
p@ss
222
[root@52793acd2b0f test]# uniq test.txt 
111
P@ssw0rd
222
p@ss
333
pass
111
p@ss
222
[root@52793acd2b0f test]# sort test.txt | uniq
111
222
333
P@ssw0rd
p@ss
pass
```

## splitコマンド
ファイルを分割するコマンド

```s
[root@52793acd2b0f split]# for i in `seq 1000` ;do echo $i; done
1
2
3
.
.
.
999
1000
[root@52793acd2b0f split]# for i in `seq 1000` ;do echo $i >> aaa.txt; done
[root@52793acd2b0f split]# mkdir bk
[root@52793acd2b0f split]# split -100 aaa.txt bk/bbb.
[root@52793acd2b0f split]# ls bk
bbb.aa  bbb.ab  bbb.ac  bbb.ad  bbb.ae  bbb.af  bbb.ag  bbb.ah  bbb.ai  bbb.aj
```

## diffコマンド

```s
[root@52793acd2b0f diff]# cat a.txt 
apple
lemon
grape
orange
pen
[root@52793acd2b0f diff]# cat b.txt 
apple
lemon
grape
orange
test
[root@52793acd2b0f diff]# diff a.txt b.txt 
5c5
< pen
---
> test
```

# ストリーム、パイプ、リダイレクトの使用

- ストリーム: キーボードやファイルからプログラムへのデータの入力、プログラムからディスプレイやファイルへのデータの出力などのデータの流れのこと
- 標準入力: プログラムへの入力ストリーム
- 標準出力: プログラムからの出力ストリーム
- 標準エラー出力: プログラムからのエラーメッセージの出力

|番号  |入出力名  |デフォルト  |
|---|---|---|
|0  |標準入力  |キーボード  |
|1  |標準出力  |画面（端末）  |
|2  |標準エラー出力  |画面（端末）  |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/34a72a7d-315b-5cab-4b27-4a17767c0ebb.png)

## パイプ(|)
1つ目のコマンドの標準出力を2つ目のコマンドに渡す(コマンドA | コマンドB)

```s
[root@c6140de26466 3]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

## /dev/null
簡単にいうと、ゴミ箱のこと。
スペシャルファイルの1つで、そこに書き込まれたデータを全て捨て（writeシステムコールは成功する）、読み出してもどんなプロセスに対してもデータを返さない

## tee
標準出力を画面表示とファイルへの書き込み両方行う

```s
[root@c6140de26466 3]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@c6140de26466 3]# cat /etc/passwd | grep root | tee root.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@c6140de26466 3]# cat root.txt 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

## コマンド > ファイル名
標準出力をファイルに上書きして書き込み(リダイレクト)

```s
[root@c6140de26466 3]# echo ABC > test.txt
[root@c6140de26466 3]# cat test.txt 
ABC
[root@c6140de26466 3]# echo DEF > test.txt
[root@c6140de26466 3]# cat test.txt 
DEF
```

## コマンド >> ファイル名
標準出力をファイルに追記(リダイレクト)

```s
[root@c6140de26466 3]# echo DEF >> test.txt 
[root@c6140de26466 3]# cat test.txt 
ABC
DEF
```

## コマンド < ファイル名
ファイルを入力としてコマンドに渡す

```s
[root@c6140de26466 3]# cat test.txt 
taro
jiro
saburo
hanako
[root@c6140de26466 3]# grep jiro < test.txt 
jiro
[root@c6140de26466 3]# grep -v jiro < test.txt 
taro
saburo
hanako
```

## コマンド << 文字列
指定した文字列が入力されるまで、標準入力を行う

```s
[root@c6140de26466 3]# grep hello << EOF
> a
> aaa
> goodbye
> thankyou
> hello
> bye
> hello world
> konnichiwa
> EOF
hello
hello world
```

## コマンド 2> ファイル名
標準エラー出力をファイルに書き込む

```s
[root@c6140de26466 3]# echo ABC
ABC
[root@c6140de26466 3]# ech ABC
bash: ech: command not found
[root@c6140de26466 3]# ech ABC > error.txt
bash: ech: command not found
[root@c6140de26466 3]# cat error.txt 
[root@c6140de26466 3]# ech ABC 2> error.txt 
[root@c6140de26466 3]# cat error.txt 
bash: ech: command not found
```

## コマンド 2>> ファイル名
標準エラー出力をファイルに追記

```s
[root@c6140de26466 3]# ech hello
bash: ech: command not found
[root@c6140de26466 3]# ech hello 2>> error.txt 
[root@c6140de26466 3]# cat error.txt 
bash: ech: command not found
bash: ech: command not found
```

## 1>&2
標準出力を標準エラー出力に渡す(あんまり使わない）

```s
[root@c6140de26466 3]# ./sample.sh > log.txt 1>&2
/home/3
./sample.sh: line 4: echoo: command not found
[root@c6140de26466 3]# cat log.txt
```

## コマンド > ファイル 2>&1
標準出力と標準エラー出力をファイルに書き込む

```s
[root@c6140de26466 3]# cat sample.sh 
#!/bin/bash
echo `pwd` #標準出力
echoo `pwd` #標準エラー出力
[root@c6140de26466 3]# ./sample.sh 
/home/3
./sample.sh: line 4: echoo: command not found
[root@c6140de26466 3]# ./sample.sh > log.txt 2>&1
[root@c6140de26466 3]# cat log.txt 
/home/3
./sample.sh: line 4: echoo: command not found
```

## コマンドA | コマンドB
コマンドAの標準出力をコマンドBの入力にする

```s
[root@c6140de26466 3]# cat /etc/passwd | grep root
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
```

## xargs
標準入力から読み込んだ内容をコマンドの引数に変換して渡す
|xargs –I○○ コマンド ○○ # -Iですると引数を別名で渡すことができる

```s
[root@c6140de26466 3]# touch ex1 ex2 ex3
[root@c6140de26466 3]# vi rm_file.txt
[root@c6140de26466 3]# cat rm_file.txt 
ex1
ex2
[root@c6140de26466 3]# cat rm_file.txt | rm
rm: missing operand
Try 'rm --help' for more information.
[root@c6140de26466 3]# cat rm_file.txt | xargs rm
[root@c6140de26466 3]# ll
total 4
-rw-r--r-- 1 root root 0 Jan  1 13:12 ex3
-rw-r--r-- 1 root root 8 Jan  1 13:13 rm_file.txt
```



*To Be Continued...*
[Linux入門 3-7] へ
***