Linuxのテキスト処理

text-filterLPIC

Linuxにはテキストの抽出や加工をするコマンドが沢山あります。
それらのコマンドを組み合わせて便利にログファイルやCSVファイルなどのテキストデータを処理できます。

テキストフィルタコマンド

catコマンド

ファイルの中身を表示します。

cat [-n] ファイル名

正確にはファイルの内容を(標準出力へ)出力するコマンドなので、パイプやリダイレクトと組み合わせて使うことができます。
「-n」オプションを付けると、行頭に行番号を付けて出力します。

[user1@localhost ~]$ cat -n abc.txt 
     1	abc
     2	def
     3	ghi

nlコマンド

テキストに行番号を付けて出力します。

[user1@localhost ~]$ nl abc.txt 
     1	abc
     2	def
     3	ghi

wcコマンド

ファイルの行数や文字数をカウントして表示します。
オプションなしで実行すると、行数、単語数、文字数を表示します。

wc [オプション] ファイル名
-l行数を表示
-w単語数を表示
-c文字数を表示

下の例ではカレントディレクトリのファイル数を表示しています。

$ ls | wc -l
8

sortコマンド

行単位でファイル内容をソートします。

sort [オプション] ファイル名
-b行頭の空白は無視
-f大文字小文字を区別しない
-r降順にソート
-n数字を数値として処理

オプション「-n」については実際の挙動を見てみればわかりやすいと思います。
オプションなしだと「1」の次に「10」が並んでいますが、「-n」をつけることで期待通りのソート順になっています。

$ cat sort.txt  #ファイル内容表示
1...aaa
2...bbb
8...ccc
9...ddd
10...eee

$ sort sort.txt  #オプションなしでソート
1...aaa
10...eee
2...bbb
8...ccc
9...ddd

$ sort -n sort.txt  # -nで数字を数値として扱う
1...aaa
2...bbb
8...ccc
9...ddd
10...eee  #10が末尾になる

$ sort -n -r sort.txt  #降順ソート
10...eee
9...ddd
8...ccc
2...bbb
1...aaa

headコマンド

ファイルの先頭(デフォルト10行)を表示します。

head [オプション] ファイル名
-n 行数指定した行数を表示
-c バイト数指定したバイト数だけ表示
head -n2 abc.txt  #先頭2行を表示
abc
def

head -c2 abc.txt  #先頭2バイトを表示
ab

tailコマンド

ファイルの末尾(デフォルト10行)を表示します。
オプションの「-f」を使うと、ファイル末尾をずっと表示し続けて、更新があるとリアルタイムに反映します。(Ctrl+c で終了)ログファイルを監視する時などに便利です。

tail [オプション] ファイル名
-n 行数指定した行数を表示
-c バイト数指定したバイト数だけ表示
-f末尾を表示し続ける
# tail -n4 -f /var/log/messages #ログファイルの末尾4行を監視し続ける

Jun  8 12:17:59 localhost systemd[1]: Starting Fingerprint Authentication Daemon...
Jun  8 12:17:59 localhost dbus-daemon[963]: [system] Successfully activated service 'net.reactivated.Fprint'
Jun  8 12:17:59 localhost systemd[1]: Started Fingerprint Authentication Daemon.
Jun  8 12:18:00 localhost su[4283]: (to root) user1 on pts/0

^C # Ctrl+cで終了

splitコマンド

指定の行数でファイルを分割します。
行数を指定しない場合はデフォルトで1000行ごとに分割されます。

split -行数 入力ファイル名 出力ファイル名

例えば10行のテキストファイルに対して「2行」を指定して実行すると、2行ずつのファイルが5個作られます。
生成されるファイル名は、末尾に「aa」「ab」「ac」…といった文字が付きます。

ファイルサイズが大きなログファイルなどの分割に便利です。

cutコマンド

テキストファイルの各行の、指定文字数から指定文字数までを取り出します。
区切り文字を指定できるので、csvファイルや、tsv(タブ区切り)ファイルの特定の列を取り出すのに便利です。

cut [オプション] ファイル名
-c 文字数取り出す文字の位置を指定
1なら1番目の文字のみ
1-3 と指定すると 1~3文字目を取り出す
-f 列番号csvなどで列を取り出す
1なら1列目のみ
1-3 と指定すると 1~3列目を取り出す
-d 区切り文字列の区切り文字を指定
デフォルトはタブ
csvを処理したい場合は「-d,」と指定する
ca
$ cat aaa.csv #サンプルファイルの中身
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii

$ cut -c5 aaa.csv # 5文字目を取り出す
b
e
f

$ cut -c3-5 aaa.csv # 3-5文字目を取り出す
a,b
d,e
g,h

$ cut -d, -f2 aaa.csv # 2列目を取り出す (区切り文字はカンマ)
bbb
eee
hhh

$ cut -d, -f2-3 aaa.csv # 2-3列目を取り出す
bbb,ccc
eee,fff
hhh,uuu

$ cut -d, -f1,3 aaa.csv # 1列目と3列目を取り出す
aaa,ccc
ddd,fff
ggg,iii

pasteコマンド

複数のテキストファイルの各行を横に連結して出力します。
csvやtsvファイルの生成などに便利なコマンドです。

paste [オプション] ファイル1 ファイル2 ...
-d 区切り文字連結時の区切り文字を指定(デフォルトはタブ)
# cat 1.txt  #ファイルの内容表示
111
222
333

# cat a.txt  #ファイルの内容表示 
aaa
bbb
ccc

# cat x.txt  #ファイルの内容表示
xxx
yyy
zzz

[root@localhost ~]# paste -d, 1.txt a.txt x.txt  #カンマ区切りで連結
111,aaa,xxx
222,bbb,yyy
333,ccc,zzz

trコマンド

文字列1を文字列2に変換します。
または指定の文字列を削除します。
標準入力から渡されたテキストデータに対して処理します。

tr [オプション] [文字列1] [文字列2]
-d文字列1を削除
$ cat a.txt  #ファイル内容表示
aaa
bbb
ccc

cat a.txt | tr "a-z" "A-Z"  #小文字を大文字に変換
AAA
BBB
CCC

cat a.txt | tr -d "b"  #「b」を削除
aaa

ccc

文字列の指定には文字クラスも使えます。

[:alpha:]アルファベット
[:lower:]英小文字
[:upper:]英大文字
[:digit:]数字
[:alnum:]英数字
[:space:]スペース、タブ、改行
$ cat space.txt  #ファイル内容表示
aa	bb	cc  #タブ区切り
aa bb cc            #スペース区切り

$ cat space.txt | tr -d [:space:]   # spaceクラスに含まれる文字を削除
aabbccaabbcc

uniqコマンド

テキストファイルの重複行を1行にまとめて出力します。
ただしソートしておく必要があるので sortコマンドとパイプで組み合わせて使います。

uniq [オプション] 入力ファイル 出力ファイル
-d重複している行のみ出力
-u重複していない行のみ出力
$ sort abc.txt | uniq  # 重複している行を1行にまとめて表示

odコマンド

ファイルの中身を8進数や16進数で表示します。
バイナリファイル(実行ファイルなどのテキストファイルではないもの)の内容も確認することもできます。

od abc.txt   # 8進数で表示
0000000 061141 005143 062544 005146 064147 005151
0000014

od -tx abc.txt # 「-tx」で16進数表示
0000000 0a636261 0a666564 0a696867
0000014

od -tc abc.txt # ASCII表示
0000000   a   b   c  \n   d   e   f  \n   g   h   i  \n
0000014

xargsコマンド

標準入力で受け取った内容を引数にしてコマンドを実行します。

xargs コマンド
$ ls
1.txt  a.txt  x.txt

$ paste 1.txt a.txt x.txt 
111	aaa	xxx
222	bbb	yyy
333	ccc	zzz

$ ls | xargs paste  # 上と同じ
111	aaa	xxx
222	bbb	yyy
333	ccc	zzz

LPIC試験勉強の教科書・参考書

LPICの試験勉強には下記の本が役立ちます。

Linux教科書 LPICレベル1 Version5.0対応Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応徹底攻略 1週間でLPICの基礎が学べる本

Linux教科書LPICレベル1(あずき本)はLinuxのシステムやコマンドを基礎からしっかりと理解できるようになります。これ一冊だけでもなんとかなりますが、初心者にはやや難しいところもあります。
LPICレベル1 スピードマスター問題集はLPICの試験直前の仕上げにやるとほぼ合格できるようになります。ただし基礎を理解せずに問題集だけをやってもあまり意味がないので、まずはあずき本のような教科書を読んで理解しておくことは必須です。
1週間でLPICの基礎が学べる本は、Linux初めてという方や、あずき本の内容が難しく感じた人向けで、LPICの勉強のとっかかりに良いと思います。

LPICは初心者の方でもちゃんと勉強すれば必ず取得できます。
これらの教科書をしっかりと読み込み、わからない箇所を調べながら勉強すれば、独学でも十分LPICレベル1に合格することが可能です。

コメント