【テキスト処理(1)】

                             このHPはLinuxのテキスト処理についてまとめたものです。


1-1  nlコマンド

nlコマンドは、テキストストリームに行番号をつけて表示するコマンド。
書式は以下の通り。

<<書式>> 

nl 〔オプション〕〔ファイル名〕

nlコマンドは、以下のオプション項目がある。






■コマンド例:1

以下の例では「-v」オプションを使用し、ファイル「test01」の行開始を「10」からにしている。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum



$ nl -v 10 test01
10 lpic-level_1
11 lpic-level_2
12 lpic-level_3
13  ccna
14  ccnp
15  ccie
16  oracle-master-silver
17  oracle-master-gold
18  oracle-master-plutinum



■コマンド例:2

以下の例では「-v」オプションと「-i」オプションを使用し、ファイル「test01」の行開始を「10」からにし、増分を「5」にしている。

$ nl -v 10 -i 5 test01
10  lpic-level_1
15  lpic-level_2
20  lpic-level_3
25  ccna
30  ccnp
35  ccie
40  oracle-master-silver
45  oracle-master-gold
50  oracle-master-plutinum




■コマンド例:3

行番号とテキスト本文の間には、特に指定しない場合はタブが挿入されている。これは「-s」オプションで変更できる。
以下の例では、行番号と本文の間に「_」を挿入している。

$ nl -s '_' test01
1_lpic-level_1
2_lpic-level_2
3_lpic-level_3
4_ccna
5_ccnp
6_ccie
7_oracle-master-silver
8_oracle-master-gold
9_oracle-master-plutinum








1-2 trコマンド

trコマンドは、標準入力から取り込まれたテキストストリーム内の文字列を置換したり、削除するためのコマンド。
最初の引数に指定された文字列を検索して見つかった場合には、その文字列を削除するか2番目の引数の文字列に置換する。


<<書式>> 

tr 〔オプション〕〔引数1〕〔引数2〕





データは標準入力から受け取る。ファイルから直接読み込む機能はサポートされていない。





■コマンド例:1

次の例では、test01の小文字をすべて大文字にしている。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum




$ cat test01 | tr [:lower:] [:upper:]
LPIC-LEVEL_1
LPIC-LEVEL_2
LPIC-LEVEL_3
CCNA
CCNP
CCIE
ORACLE-MASTER-SILVER
ORACLE-MASTER-GOLD
ORACLE-MASTER-PLUTINUM



■コマンド例:2
次の例では、file01の中にある「#」を削除して出力している。

$ cat test01
#lpic-level_1
#lpic-level_2
#lpic-level_3
#ccna
#ccnp
#ccie
#oracle-master-silver
#oracle-master-gold
#oracle-master-plutinum



$ tr -d '#' < test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum







1-3 headコマンド

headコマンドは、ファイルの先頭部分を表示するコマンド。
特に行数を指定しない場合は、最初の10行を表示する。

<<書式>>
head [オプション] [ファイル名]




■コマンド例:1

以下の例では、test01の1行目から6行目までを表示している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum



$ head -n 6 test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie






1-4 tailコマンド

tailコマンドは、ファイルの末尾部分を表示する。デフォルトでは、最終行から10行が表示される。


<<書式>>

tail [オプション〕〔ファイル名〕




◆ファイルへの追記を監視

ログの出力やデータの収集などで、常時追記されていくファイルを表示する際に、追記されるたびにその内容を表示してファイルを監視したい場合がある。
このようなケースでは、tailコマンドの「−f」オプションを利用する。


以下の例では、
/var/log/messageファイルの末尾10行を表示し、そのまま末尾をリアルタイムで表示し続ける。表示を終了するには、「Ctrl+C」キーを押す。


$ tail -f /var/log/messages
Jan 27 06:43:42 localhost login(pam_unix)[6328]: 1 more authentication failure; logname= uid=0 euid=0tty=pts/3 ruser= rhost=192.168.0.4  user=test
Jan 27 07:00:41 localhost smbd[6428]: [2004/01/27 07:00:41, 0] lib/util_sock.c:read_socket_data(342)
Jan 27 17:45:00 localhost su(pam_unix)[5849]: session closed for user root
Jan 28 04:02:33 localhost init: Trying to re-exec init
Jan 28 04:07:17 localhost su(pam_unix)[10506]: session opened for user news by (uid=0)
Jan 28 04:07:18 localhost su(pam_unix)[10506]: session closed for user news
Jan 29 04:02:33 localhost init: Trying to re-exec init
Jan 29 04:07:13 localhost su(pam_unix)[13021]: session opened for user news by (uid=0)
Jan 29 04:07:14 localhost su(pam_unix)[13021]: session closed for user news
Jan 28 04:10:05 localhost su(pam_unix)[10506]: session opened for user news by (uid=0)








1-5 diffコマンド

diffコマンドは、2つのファイルの違いを調べるコマンド。
2つのファイルの内容が同一であった場合には、特に何も出力されない。
また、比較はあくまで内容に基づいて行われる。ファイルの属性が異なっても、
比較の対象にはならない。

<<書式>> 

diff  [オプション]  [ファイル名1] [ファイル名2]




◆出力メッセージの内容

diffコマンドの出力結果は以下形での表示となる。

【diffコマンドの出力形式】

[ファイル名1の行番号] [処理方法] [ファイル名2の行番号]

上記の情報は、現在のファイルに状態にどのような処理をしたら、同一になるかという情報になっている。
処理方法(変換コマンド)には、「a(Add)」、「c(Change)」、「d(Delete)」がある。


■コマンド例:1
以下の例では、test01ファイルとtest02ファイルの相違を確認している。
diffコマンドの出力結果の「7,9c7,9」は、最初のファイルの7行目から9行目と次のファイルの7行目と9行目に
違いがあり、文字列を置き換え(Change)すると正しいものになる、という意味。
複数行にわたり差異がある場合は,差異開始行と差異終了行をコンマ(,)で区切って表示する。

diffコマンドの2行目以降は、
ファイルの実際の変更内容を表示している。行の先頭にある「<」は1つ目のファイルにだけある行を表し、同様に「>」は2つ目のファイルにだけある行を表している。
また、2つのファイルで共通する行は表示されない。


$ cat -n test01
1  lpic-level_1
2  lpic-level_2
3  lpic-level_3
4  ccna
5  ccnp
6  ccie

7  oracle-master-silver
8  oracle-master-gold
9  oracle-master-plutinum

$ cat -n test02
1  lpic-level_1
2  lpic-level_2
3  lpic-level_3
4  ccna
5  ccnp
6  ccie

7  mca
8  mcp
9  mcse

$ diff test01 test02
7,9c7,9  ←test01とtest02の7行目から9行目で相違検出。Change処理をすると正しくなる。
< oracle-master-silver
< oracle-master-gold
< oracle-master-plutinum
---
> mca
> mcp
> mcse



■コマンド例:2

$ cat -n test03
1  lpic-level_1
2  lpic-level_2
3  lpic-level_3
4  oracle-master-silver
5  oracle-master-gold
6  oracle-master-plutinum


$ cat -n test04
1  lpic-level_1
2  lpic-level_2
3  lpic-level_3

4  ccna
5  ccnp
6  ccie
7  oracle-master-silver
8  oracle-master-gold
9  oracle-master-plutinum


$ diff test03 test04
3a4,6  ←test03の3行目とtest04の4行目から6行目で相違検出。Add処理すると正しくなる。
> ccna
> ccnp
> ccie






1-6 cutコマンド

cutコマンドは、1行のテキスト中の任意のフィールドや、指定桁範囲の文字列を抜き出すことができる。
フィールドを抜き出すときは、区切り文字としてタブを使用する。フィールド間を区切る文字を「デリミタ」と
呼ぶ。
タブ以外の文字を使用するときは、オプション指定をする。


<<書式>> 

cut [オプション] [ファイル名]








■コマンド例:1

以下の例では、test01ファイルの各行から4文字目を取り出している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum


$ cut -c 4 test01
c
c
c
a
p
e
c
c
c



■コマンド例:2

以下の例では、test01ファイルの各行から1文字目から4文字目を取り出している。

$ cat test01
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum


$ cut -c 1-4 test01
lpic
lpic
lpic
ccna
ccnp
ccie
orac
orac
orac

■コマンド例:3

以下の例では、「:」を区切り文字として、/etc/passwdファイルの第1フィールドと第7フィールドを抜き出している。


$ 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
(中略)

$ cut -d: -f1,7 /etc/passwd
root:/bin/bash
bin:/sbin/nologin
daemon:/sbin/nologin
adm:/sbin/nologin
lp:/sbin/nologin
sync:/bin/sync
shutdown:/sbin/shutdown
(中略)






1-7 join/pasteコマンド

◆joinコマンド

joinコマンドは、2つのファイルの共通のフィールドを横に連結する。

<<書式>> 

join 〔オプション〕 ファイル名1 ファイル名2

【主なオプション】

-j フィールド  連結するフィールドの指定


■コマンド例:1

以下の例では、test01とtest02の第1フィールドを連結している。

$ cat test01
No:1  lpic-level_1
No:2  lpic-level_2
No:3  lpic-level_3
No:4  ccna
No:5  ccnp
No:6  ccie
No:7  oracle-master-silver
No:8  oracle-master-gold
No:9  oracle-master-plutinum

$ cat test02
No:1  ccna
No:2  ccnp
No:3  ccie
No:4  lpic-level_1
No:5  lpic-level_2
No:6  lpic-level_3
No:7  mca
No:8  mcp
No:9  mcse

$ join -j 1 test01 test02
No:1 lpic-level_1 ccna
No:2 lpic-level_2 ccnp
No:3 lpic-level_3 ccie
No:4 ccna lpic-level_1
No:5 ccnp lpic-level_2
No:6 ccie lpic-level_3
No:7 oracle-master-silver mca
No:8 oracle-master-gold mcp
No:9 oracle-master-plutinum mcse




◆pasteコマンド

pasteもファイルを横方向に連結するコマンドだが、連結するときに特定の区切り文字を
指定することができる。

<<書式>> 

paste [オプション]  ファイル名1 ファイル名2

【主なオプション】

-d 区切り文字  区切り文字の指定※デフォルトはタブ


■コマンド例:2

以下の例では、「:」を区切り文字として、test01とtest02を連結している。

$ cat test01
No1
No2
No3
No4
No5
No6
No7
No8
No9


$ cat test02
lpic-level_1
lpic-level_2
lpic-level_3
ccna
ccnp
ccie
oracle-master-silver
oracle-master-gold
oracle-master-plutinum


$ paste -d: test01 test02
No1:lpic-level_1
No2:lpic-level_2
No3:lpic-level_3
No4:ccna
No5:ccnp
No6:ccie
No7:oracle-master-silver
No8:oracle-master-gold
No9:oracle-master-plutinum