Linuxコマンド　テキスト処理関連

# grep
- ファイルの中の文字列を検索する。
- Global Regular Expressions Printの略。

```bash
#'IPv6'という文字列を含む行だけを表示
$ dmesg | grep IPv6
[    0.689739] Segment Routing with IPv6
[   26.730196] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[   26.736138] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[   26.738352] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready

# 'IPv6'という文字列含む前後1行も表示
$ dmesg | grep -w -1 IPv6
[    0.689131] NET: Registered protocol family 10
[    0.689739] Segment Routing with IPv6
[    0.689755] NET: Registered protocol family 17
[   19.260031] EXT4-fs (sda1): mounted filesystem with ordered data mode. Opts: (null)
[   26.730196] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[   26.736138] IPv6: ADDRCONF(NETDEV_UP): enp0s3: link is not ready
[   26.738003] e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
[   26.738352] IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready
[  106.762706] ICMPv6: process `rg' is using deprecated sysctl (syscall) net.ipv6.neigh.default.base_reachable_time - use net.ipv6.neigh.default.base_reachable_time_ms instead'

# -v:一致しないものを検索する
# パイプでAND検索になっている
# grepで'grep'自身のプロセスを除く
$ ps -aux |grep php | grep -v grep
root       884  0.0  0.0 226272    84 ?        Ss   10:51   0:01 php-fpm: master process (/etc/php-fpm.conf)
apache    1105  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1106  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1107  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1108  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1109  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www

#-i,--ignorecase:大文字小文字を区別しない
$ ps -aux | grep -i PHP
root       884  0.0  0.0 226272    84 ?        Ss   10:51   0:01 php-fpm: master process (/etc/php-fpm.conf)
apache    1105  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1106  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1107  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1108  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1109  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
root      2605  0.0  1.3 206616 25232 ?        S    12:17   0:00 PHP Language Server
root      2606  0.1 10.4 372012 195188 ?       S    12:17   0:18 PHP Language Server
root      3873  0.0  0.0  10280  1064 pts/3    R+   17:07   0:00 grep --color=auto -i PHP

#-e:OR検索
$ ps -aux | grep -e php -e -bash
root       884  0.0  0.0 226272    84 ?        Ss   10:51   0:01 php-fpm: master process (/etc/php-fpm.conf)
apache    1105  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1106  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1107  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1108  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
apache    1109  0.0  0.0 240948     8 ?        S    10:51   0:00 php-fpm: pool www
root      1481  0.0  0.0  24712   480 tty1     Ss   10:52   0:00 -bash
root      1514  0.0  0.0  23284   224 ?        Ss   10:52   0:00 -bash
root      3936  0.0  0.2  24712  5112 pts/3    Ss   17:25   0:00 -bash
root      3970  0.0  0.0  10280   968 pts/3    S+   17:27   0:00 grep --color=auto -e php -e -bash
```

# uniq
- 重複行を除いた結果が出力される。
- 隣り合った行しか比較しないので注意。
- sortコマンドで並び替えてから、uniqにパイプすることで隣り合った行の重複行も取り除くことが出来る。

```bash

$ cat test.txt
aaaa
aaaa
bbbb
bbbb
cccc
cccc
aaaa

# 隣り合っていない重複行も表示されてしまう。
$ cat test.txt | uniq
aaaa
bbbb
cccc
aaaa

# 隣り合っていない重複行も取り除かれる。
$ sort test.txt | uniq
aaaa
bbbb
cccc

# -u, --unique:重複していない行だけを出力
$ sort test.txt | uniq -u

# -c, --count:重複した回数を出力
$ sort test.txt | uniq -c
      3 aaaaaa
      2 bbbbbb
      2 cccccc

# 重複行を除いた結果をファイルに出力
$ uniq test.txt uniq.txt
$ cat uniq.txt
aaaa
bbbb
cccc
aaaa
```

# sort
- 出力される内容を並び替えて出力する。
- デフォルトは昇順。-r,--reverseオプションで降順。

```bash
$ cat test.txt
4 ccccc
3 ddddd
5 eeeee
1 bbbbb
2 aaaaa
10 fffff

# キャラクターコード順で並び替え
$ cat test.txt | sort
1 bbbbb
10 fffff
2 aaaaa
3 ddddd
4 ccccc
5 eeeee

# 降順で並び替え
$ cat test.txt | sort -r
5 eeeee
4 ccccc
3 ddddd
2 aaaaa
10 fffff
1 bbbbb

# 数字として並び替え
$ cat test.txt | sort -n
1 bbbbb
2 aaaaa
3 ddddd
4 ccccc
5 eeeee
10 fffff

# キーを指定して並び替え
$ cat test.txt | sort k2
2 aaaaa
1 bbbbb
4 ccccc
3 ddddd
5 eeeee
10 fffff

# 並び替え済みかチェック
$ cat test.txt |sort -c
sort: -:2: 順序が不規則: 3 ddddd

# ナチュラルソート
$ cat test.txt |sort -V
1 bbbbb
2 aaaaa
3 ddddd
4 ccccc
5 eeeee
10 fffff

```

# cut
- ファイル内文字列の切り出す。csvの特定の行を抜き出す時とかに使う。

```bash

$ ls -l
total 48
-rw-r--r--@  1 yuya  staff  4580  3 14 20:05 AppDelegate.swift
drwxr-xr-x   4 yuya  staff   128  3 10 22:27 Assets.xcassets
drwxr-xr-x   3 yuya  staff    96  3 10 22:58 Base.lproj
-rw-r--r--@  1 yuya  staff   733  3 13 00:07 DateUtils.swift
-rw-r--r--   1 yuya  staff  2005  3 10 22:27 Info.plist
drwxr-xr-x   6 yuya  staff   192  3 11 23:06 Model
-rw-r--r--@  1 yuya  staff  3326  3 12 12:32 Notification.swift
-rw-r--r--@  1 yuya  staff  2335  3 10 22:27 SceneDelegate.swift
drwxr-xr-x  13 yuya  staff   416  3 15 15:27 View

#-bでバイト数を指定して抽出。1から10バイトまで、と40バイト目以降
$ ls -l |cut -b 1-10,40-
total 48
-rw-r--r--20:05 AppDelegate.swift
drwxr-xr-x22:27 Assets.xcassets
drwxr-xr-x22:58 Base.lproj
-rw-r--r--00:07 DateUtils.swift
-rw-r--r--22:27 Info.plist
drwxr-xr-x23:06 Model
-rw-r--r--12:32 Notification.swift
-rw-r--r--22:27 SceneDelegate.swift
drwxr-xr-x15:27 View

# 2列目から最後までを抜き出し
# -d,--delimiterで区切り文字を指定、-fで表示する項目を指定
$ echo "field1,field2,field3,field4,field5" | cut -d , -f2-
field2,field3,field4,field5

# スペース区切りで項目を抜き出し
$ echo "field1 field2 field3 field4 field5" | cut -d ' ' -f2,3
field2 field3

```

# tr
- 指定した文字を置換したり削除する。
- 文字クラス[:CLASS:]を使うことであらかじめ定義された文字を展開することができる。
- 引数にファイルは指定できないので、パイプやリダイレクションを使う。

| 文字クラス       |       説明 |
|:-----------------|:------------------|
| [:alnum:] | 英数字 |
| [:alpha:] | 英文字 |
| [:digit:] | 数字 |
| [:upper:] | 英大文字 |
| [:lower:] | 英小文字 |

```bash

$ cat /etc/centos-release
CentOS Linux release 8.1.1911 (Core)

# 文字範囲を指定して置換
$ cat /etc/centos-release | tr a-z A-Z
CENTOS LINUX RELEASE 8.1.1911 (CORE)

# アルファベット大文字を小文字に置換
$ cat /etc/centos-release | tr [:upper:] [:lower:]
centos linux release 8.1.1911 (core)

# -d:合致した文字を削除(Linuxという文字を消しているわけではない)
$ cat /etc/centos-release | tr -d Linux
CetOS  release 8.1.1911 (Core)

# -s:指定した文字が連続した場合、１文字に置き換える

```

# wc
- ファイル内のバイト数、単語数、行数を表示する。
- 単語数は空白または改行で区切られている前提でカウントされる。

```bash

$ cat test1.txt
abcdefg

# 行数, 単語数, バイト数
$ wc test1.txt
1 1 8 test1.txt

# 空白を空ける
$ cat test2.txt
a b cdefg

$ wc test2.txt
1 3 10 test2.txt

```

# cat
- ファイルの内容を表示する、編集はできない
- 連結を意味するconcatnateの略

```bash

# 標準出力を連結
$ cat a.txt
aaa
$ cat b.txt
bbb
cat a.txt b.txt
aaa
bbb

#-n,--number:行番号をつけて出力
$ cat -n a.txt
     1  aaa
```