🐈

Linuxさんでテキスト処理ができるようになる! ■cutコマンド■trコマンド■diffコマンド

2021/01/04に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんにはたくさんのテキスト処理があるので、テキスト処理のコマンドの一部を勉強してみようと思う。

概要

■cutコマンド
■trコマンド
■diffコマンド
をまとめた ^^

cutコマンド(入力の一部を切り出す)

cutコマンドは、ファイルを読み込んで、それぞれの行から指定した部分だけを切り出す。
「〇文字目から〇文字目まで」
「タブで区切られたファイル」
「〇番目のフィールドと〇番目のフィールド」
のように選んで取り出すことができる。
↓cutコマンド書式

$ cut (オプション) ファイル名

読み込みファイルを指定しなかった場合は、標準入力から受け取った内容を処理する。

■入力の一部を切り出して出力する

$ cut -d 区切り文字 -f 何列目か(フィールド番号) ファイル名 

なんかややこしいな('_')どういうこと?
例えば/etc/passwdファイルをみるとこのように:でそれぞれ意味が区切られている。

$ 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
略

それぞれの区切り(フィールド)ごとにはそれぞれ意味があって、左からユーザ名、パス、ID、グループID、コメント、ホームディレクトリ、ログインシェルといった意味がある。
このうち、ログインシェルだけ表示したい時は、:で区切られていて7列目のフィールドになるので

$ cut -d : -f 7 /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
略

他の列をカットしてログインシェルにあたる部分だけ表示された!
↓,で区切れば複数のフィールドを指定することもできるぞ!

$ cut -d : -f 3,7 /etc/passwd
0:/bin/bash
1:/sbin/nologin
2:/sbin/nologin
3:/sbin/nologin
4:/sbin/nologin
略

こんな感じでcutコマンドは元のデータから特定の部分だけ取り出すことができる。
空欄を区切りにしたい時は-d ' 'になる?

trコマンド(テキストファイルの文字を置換する/削除する)

trコマンドはtr テキストファイルの文字を置換する/削除するコマンドだ。
↓trコマンドの書式

$ tr (オプション) 置き換え前の文字列 置き換え後の文字列

|オプション|意味|
| --- | --- | --- |
|-d|指定文字列に含まれる文字があったら削除する|
|-s|指定文字列に含まれる文字が連続していたら1つにまとめる|
|-c|指定文字列に含まれない文字全てを対象とする|
|-t|文字列1を文字列2の長さまで切り詰める。|

$ cat unko.txt
1 anko
2 anko
3 anko
$ cat unko.txt | tr a u
1 unko
2 unko
3 unko

ちゃんとaがuに置き換えられているね!
ちなみに文字列に-を入れると〇〇から〇〇っていう意味になるから

$ cat unko.txt | tr a u | tr a-z A-Z
1 UNKO
2 UNKO
3 UNKO

ちゃんとできているね!
※※※注意!※※※
trコマンドは純粋なフィルタとして設計されているのでファイルの読み込みができない。

$ tr a u unko.txt
tr: extra operand ‘unko.txt’
Try 'tr --help' for more information.

↑ファイルの読み込みができない!
そのためファイルの内容に対してtrコマンドを実行したい場合

$ cat unko.txt | tr a u

か、

$ tr a u < unko.txt

でunko.txtにフィルタを実行することができる。

diffコマンド(差分を比較する)

diffコマンドは、2つのテキストファイルを比較し、異なる箇所を出力する。
↓diffコマンド書式

$ diff (オプション) 比較もとファイル 比較先ファイル

|オプション|意味|
| --- | --- | --- |
|-c|違いのある箇所をファイルごとに出力し、!記号で変更箇所を示す|
|-u|違いのある箇所を1つにまとめて、-記号と+記号で変更箇所を示すunified形式|
|-q|ファイルが違うかどうかだけを出力する|
|-i|大文字と小文字の違いを無視する|
|-B|空行の有無を無視する|
|-w|空白を無視して比較する|
このコマンドは設定ファイルやプログラムソースコードに対して編集前、編集後の変更内容を
確認するのによく使われるらしい。
例として果物のリストがのっているファイルをコピーしてもう一方を編集して差分を比較してみる。

$ cat list.txt
apple
banana
lemon
melon
strawberry
$ cp list.txt list_2.txt
$ vim list_2.txt(vimでlist_2.txtを編集する)
$ cat list2.txt
apple
banana
melon
strawberry
pineapple(lemonを削除してpineappleを追記した!)
$ diff list.txt list_2.txt(差分をdiffコマンドで確認)
3d2
< lemon
5a5
> pineapple
3d2
< lemon
5a5
> pineapple

↑ってなんだ('_')?
変更コマンドの出力の表現はちょっとわかりずらく感じるが以下のようにa,b,cで表現される。
a...add(追加する)
c...change(変更する)
d...delete(削除する)
また<,>は
<...削除された行
>...追加された行
という意味になる。
|記号|意味|
| --- | --- | --- |
|範囲1 a 範囲2|比較元ファイルの範囲1の所に比較先ファイルの範囲2の内容が追加された|
|範囲1 b 範囲2|比較元ファイルの範囲1の所に比較先ファイルの範囲2の内容が変更された|
|範囲1 c 範囲2|比較元ファイルの範囲1の所が削除された(範囲2関係ない)|
わかりにくいけど
a...add(追加する)
c...change(変更する)
d...delete(削除する)ということだそうだ。
なので3行目のlemonが削除され、範囲5に pineappleが追加されたということらしい。

diffコマンドで出力した差分はpatchコマンドで修正することができる。
※patchコマンドはまた今度(>_<)

まとめ

いろんなテキスト処理がある!と思った!

Discussion